Skip to content
性能优化 - 渲染

性能优化 - 渲染

阅读本文大概需要 15 分钟

提升渲染效率对于提升游戏品质起着关键作用。

客户端渲染参数指标超过限制会引起游戏帧率下降,游戏卡顿,手机发热。

通过优化渲染过程,我们可以实现更高的图形质量、更流畅的帧率和更出色的游戏体验。

本文将介绍口袋方舟中,渲染效率的细节及注意事项。


1. 通过命令确认当前渲染信息

呼出控制台

  1. 在游戏中按 ~ 键呼出控制台

  2. 输入指定命令回车即可

如下视频,电脑运行游戏中打开控制台后,这里输入命令 Stat UNIT 打开了性能面板。

Frame:当前帧计算消耗耗时 (30帧标准值为 33.33ms 60 帧标准值为 16.67ms 依此类推)

Game:当前帧 Game 线程计算消耗耗时 (越低越好,一般来说如果 PC 上 Game 线程消耗高于5ms。则可能在移动端发生性能风险。此处为 PC 的 CPU型号是 I7-11700K,移动端机型为 A57 测试数据。具体数据取决于不同设备性能)

Draw:当前帧渲染耗时(参考值:越低越好)

GPU:当前帧 GPU 计算耗时(参考值:越低越好)

Draws:当前帧的 DrawCall 数量 (参考值:小于300)

Prims:当前帧的图元(顶点集合)提交数量(参考值:小于600k)

2. 优化注意事项

优化渲染的核心指标是控制渲染命令(一般称为 DrawCall ,本教程里及编辑器参数指标称为 Draws )次数 和 顶点数(参数指标称为 Prims ),通过降低它们从而使得渲染耗时(参数指标称为 Draw )维持在合适水平。

常见的优化手段有:

  1. 使用单一对象达成拼装的效果(减少 Draws 次数)
  2. 复用模型(减少 Draws)
  3. 注意模型动静态(减少 Draws)
  4. 缩小对象的裁剪距离(减少 Draws)
  5. 简易模型或面片作为远处装饰物(降低顶点数、减少 Draws)
  6. 控制使用过多人型对象

对照组试验

在讲优化细节前,这里先做多组对照试验:

  1. 如下视频,一开始就放在场景里的相同的对象,游戏运行后,它们处于静态状态,他们的 Draws 会得到合批优化

    通过代码动态创建的相同模型不会被优化,它的 Draws 是单算的,看向多个相同模型 Draws 就会上升了。

    通过代码找到并调整了大小的静态模型,其会从静态变为动态,该对象的合批优化会终止。

    总结一下,会导致静态对象变为动态的操作包括一下几类:

    1. 对象挂载了脚本
    2. 对象打开物理模拟
    3. 对象挂载了运动器
    4. 代码里设置对象的位置、大小、缩放、显隐、碰撞等等

  1. 如下视频,在主视口中,移动模型的远近,整个移动过程包括两次 Prims 的值变动

    第一次只有 Prims 变动,这是因为做了 LOD(见下边介绍) 优化,减少了渲染的顶点数

    第二次变动 Draws 和Prims 都会变化Draws 变化是因为远处阴影被裁剪了。

    由此可知,对象被裁剪后就不会被渲染了,能降低 Draws 和 Prims

LOD(多细节层次 即 Level Of Details,用于降低非重要物体的面数和细节数,提高渲染效率)

  1. 如下视频,相同材质数量的模型,Draws 上升可能是不一样的。

    但简单总结规律,Draws 的上升和材质的数量是成正相关的,材质越多,Draws 上升的越多。

  1. 如下图,在资源库中找到模型,在红点1位置点击+号,会弹出右侧红点2里的资源详情,在红点3处能确认到该资源的顶点数,顶点数理论上是有多少模型,总顶点数就会上涨多少,当前在游戏中看到的 Prims 参数由于合批,其值可能是比真实数据偏低的。

image-20231218110133200

  1. 如下视频,看向默认基础人型对象 Draws 只上升了3,而看向默认高级人型对象 Draws 上升了37。

根据以上多组实验,这里总结一些结论

  1. 相同的静态对象,在游戏中会被优化,多个对象的 Draws 和单一对象相同,但 Prims 各算各的,正常增加
  2. 对象被裁剪后,其不会造成渲染消耗
  3. 随着对象的由近变远,LOD 相关优化将使得对象顶点数下降
  4. 相同材质数量的模型,Draws 上升可能是不一样的,Draws 的上升和材质的数量是成正相关的,材质越多,Draws 上升的越多
  5. 高级人型对象的 Draws 比基础人型对象的会高许多

优化事项

使用单一对象制作场景

案例1,如下两图:使用平面,利用合适的材质,可以作为地板之类的作用,这种对象渲染时,Draws 和顶点数都相对是最低的。

image-20231215160928355

image-20231215161414983

使用多个相同对象拼装制作场景

案例2,如下图,一个项目用大量方块拼出不规则地面(粉红色与灰色方块格子)。

image-20231208171930304

打开项目去除周边建筑后,实际看到地面的效果如下图,中间镂空部分是用来放泳池的,如果使用一整块地板,中间泳池部分和周边不规则部分就很不好处理,用案例1的方案可能效果就会大打折扣。

image-20231208171459611

最终这个方案,下边用的是两种不同材质的方块,由于合批优化没有带来 Draws 的额外开销,只有方块的顶点带来了少量上涨。

复用模型

如下图,通过摆放了不少椰子树简单营造了一个海岛场景。

image-20231218111021715

实际上这些椰子树模型目前一共就只有3种,通过少量模型,调整他们的大小、旋转、缩放,能摆出非常多的种类搭配,营造出想要的场景。

image-20231218111057988

减少动态对象的产生

如对照试验第一组的测试结果,对于场景里的固定表现,尽量要保持其静态状态,适用于动态创建的对象包括不限于:

  1. 战斗的怪物
  2. 做了任务,需要表现获得的道具,飞向背包的金币,可以动态设置位置出现在场景里
  3. 特效表现

缩小对象的裁剪距离

自动裁剪规则与自定义裁剪距离 | 产品手册 (ark.online)

画质等级在移动端是根据设备性能自动调整的,过高的画质等级将使得对象的裁剪距离过远,这样远处的对象没有被裁剪最终导致同屏被渲染的对象过多,但仍可以通过属性面板中勾选启用自定义裁剪,然后在自定义裁剪距离中设置距离。

image-20231206104557722

比如这里将这个猫咪雕塑的裁剪距离设置为了 1000。

image-20231206104623196

如下视频可以看到,我们走到了 1000 的距离才能看到这个猫咪,而其它远处的模型并没有被裁剪。

当出现了高面数的模型或使用了高消耗材质的模型,都可以通过该方法达到减轻渲染消耗的目的。

使用低顶点模型或面片达到接近效果

案例1

如下图,远处需要摆放一些树木作为装饰,但是放这种3700多顶点的树在远处,其实是不甚理想的。

image-20231218115327572

于是选择了如下图中的面片树,顶点数只有4。

image-20231218120226003

案例2

如下图从远处看过去,有一些建筑的顶部露在外边。

image-20231218120515928

对于远处玩家永远不会到达的地方,只要确定不会穿帮,就可以如下图只有一个塔尖。

image-20231218120625300

案例3

如下图,有的建筑可以允许进入室内,从门口我们就能看到内部的布置。

image-20231218121119652

也有如下图这样的建筑,没有进入的地方。

image-20231218121228658

在主视口中移动到建筑内部,能看到,里边是什么都没有的。

image-20231218121250405

简单总结:

  1. 使用低面数的模型取代高面数的模型达成类似效果
  2. 保证不会穿帮的场景,远处背景使用面片,近处可以是只有半截甚至一小部分的建筑
  3. 对于用户不会到达的建筑,可以使用完全没有室内的建筑

避免同屏出现大量人型对象

人型对象包含大量材质,不对人型进行任何操作时都会降低很多渲染效率,也许在电脑上编辑器里运行还行,手机上与电脑上相比性能会相差巨大。

另外也能通过一些策略来设计同屏人型对象出现的数量,比如使用人型对象制作怪物,可以将怪物分散站位,并且限制它们的追击范围,防止怪物聚集,怪物群之间,也要通过一些大型建筑等等之类的分割它们,被遮住后,有些裁剪优化也能生效。

如果实在有需要同屏人型对象较多的时候 ,请将高级人型对象改为基础人型对象。

image-20231205185831645