性能优化 - 渲染
阅读本文大概需要 15 分钟
提升渲染效率对于提升游戏品质起着关键作用。
客户端渲染参数指标超过限制会引起游戏帧率下降,游戏卡顿,手机发热。
通过优化渲染过程,我们可以实现更高的图形质量、更流畅的帧率和更出色的游戏体验。
本文将介绍口袋方舟中,渲染效率的细节及注意事项。
1. 通过命令确认当前渲染信息
呼出控制台
在游戏中按 ~ 键呼出控制台
输入指定命令回车即可
如下视频,电脑运行游戏中打开控制台后,这里输入命令 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 )维持在合适水平。
常见的优化手段有:
- 使用单一对象达成拼装的效果(减少 Draws 次数)
- 复用模型(减少 Draws)
- 注意模型动静态(减少 Draws)
- 缩小对象的裁剪距离(减少 Draws)
- 简易模型或面片作为远处装饰物(降低顶点数、减少 Draws)
- 控制使用过多人型对象
对照组试验
在讲优化细节前,这里先做多组对照试验:
如下视频,一开始就放在场景里的相同的对象,游戏运行后,它们处于静态状态,他们的 Draws 会得到合批优化。
通过代码动态创建的相同模型不会被优化,它的 Draws 是单算的,看向多个相同模型 Draws 就会上升了。
通过代码找到并调整了大小的静态模型,其会从静态变为动态,该对象的合批优化会终止。
总结一下,会导致静态对象变为动态的操作包括一下几类:
- 对象挂载了脚本
- 对象打开物理模拟
- 对象挂载了运动器
- 代码里设置对象的位置、大小、缩放、显隐、碰撞等等
如下视频,在主视口中,移动模型的远近,整个移动过程包括两次 Prims 的值变动。
第一次只有 Prims 变动,这是因为做了 LOD(见下边介绍) 优化,减少了渲染的顶点数。
第二次变动 Draws 和Prims 都会变化,Draws 变化是因为远处阴影被裁剪了。
由此可知,对象被裁剪后就不会被渲染了,能降低 Draws 和 Prims。
LOD(多细节层次 即 Level Of Details,用于降低非重要物体的面数和细节数,提高渲染效率)。
如下视频,相同材质数量的模型,Draws 上升可能是不一样的。
但简单总结规律,Draws 的上升和材质的数量是成正相关的,材质越多,Draws 上升的越多。
- 如下图,在资源库中找到模型,在红点1位置点击+号,会弹出右侧红点2里的资源详情,在红点3处能确认到该资源的顶点数,顶点数理论上是有多少模型,总顶点数就会上涨多少,当前在游戏中看到的 Prims 参数由于合批,其值可能是比真实数据偏低的。
如下视频,看向默认基础人型对象 Draws 只上升了3,而看向默认高级人型对象 Draws 上升了37。
根据以上多组实验,这里总结一些结论
- 相同的静态对象,在游戏中会被优化,多个对象的 Draws 和单一对象相同,但 Prims 各算各的,正常增加
- 对象被裁剪后,其不会造成渲染消耗
- 随着对象的由近变远,LOD 相关优化将使得对象顶点数下降
- 相同材质数量的模型,Draws 上升可能是不一样的,Draws 的上升和材质的数量是成正相关的,材质越多,Draws 上升的越多
- 高级人型对象的 Draws 比基础人型对象的会高许多
优化事项
使用单一对象制作场景
案例1,如下两图:使用平面,利用合适的材质,可以作为地板之类的作用,这种对象渲染时,Draws 和顶点数都相对是最低的。
使用多个相同对象拼装制作场景
案例2,如下图,一个项目用大量方块拼出不规则地面(粉红色与灰色方块格子)。
打开项目去除周边建筑后,实际看到地面的效果如下图,中间镂空部分是用来放泳池的,如果使用一整块地板,中间泳池部分和周边不规则部分就很不好处理,用案例1的方案可能效果就会大打折扣。
最终这个方案,下边用的是两种不同材质的方块,由于合批优化没有带来 Draws 的额外开销,只有方块的顶点带来了少量上涨。
复用模型
如下图,通过摆放了不少椰子树简单营造了一个海岛场景。
实际上这些椰子树模型目前一共就只有3种,通过少量模型,调整他们的大小、旋转、缩放,能摆出非常多的种类搭配,营造出想要的场景。
减少动态对象的产生
如对照试验第一组的测试结果,对于场景里的固定表现,尽量要保持其静态状态,适用于动态创建的对象包括不限于:
- 战斗的怪物
- 做了任务,需要表现获得的道具,飞向背包的金币,可以动态设置位置出现在场景里
- 特效表现
缩小对象的裁剪距离
自动裁剪规则与自定义裁剪距离 | 产品手册 (ark.online)
画质等级在移动端是根据设备性能自动调整的,过高的画质等级将使得对象的裁剪距离过远,这样远处的对象没有被裁剪最终导致同屏被渲染的对象过多,但仍可以通过属性面板中勾选启用自定义裁剪,然后在自定义裁剪距离中设置距离。
比如这里将这个猫咪雕塑的裁剪距离设置为了 1000。
如下视频可以看到,我们走到了 1000 的距离才能看到这个猫咪,而其它远处的模型并没有被裁剪。
当出现了高面数的模型或使用了高消耗材质的模型,都可以通过该方法达到减轻渲染消耗的目的。
使用低顶点模型或面片达到接近效果
案例1
如下图,远处需要摆放一些树木作为装饰,但是放这种3700多顶点的树在远处,其实是不甚理想的。
于是选择了如下图中的面片树,顶点数只有4。
案例2
如下图从远处看过去,有一些建筑的顶部露在外边。
对于远处玩家永远不会到达的地方,只要确定不会穿帮,就可以如下图只有一个塔尖。
案例3
如下图,有的建筑可以允许进入室内,从门口我们就能看到内部的布置。
也有如下图这样的建筑,没有进入的地方。
在主视口中移动到建筑内部,能看到,里边是什么都没有的。
简单总结:
- 使用低面数的模型取代高面数的模型达成类似效果
- 保证不会穿帮的场景,远处背景使用面片,近处可以是只有半截甚至一小部分的建筑
- 对于用户不会到达的建筑,可以使用完全没有室内的建筑
避免同屏出现大量人型对象
人型对象包含大量材质,不对人型进行任何操作时都会降低很多渲染效率,也许在电脑上编辑器里运行还行,手机上与电脑上相比性能会相差巨大。
另外也能通过一些策略来设计同屏人型对象出现的数量,比如使用人型对象制作怪物,可以将怪物分散站位,并且限制它们的追击范围,防止怪物聚集,怪物群之间,也要通过一些大型建筑等等之类的分割它们,被遮住后,有些裁剪优化也能生效。
如果实在有需要同屏人型对象较多的时候 ,请将高级人型对象改为基础人型对象。