在一款游戏的游戏的制作过程中,性能是个无法绕开的话题。开发者通常需要兼顾表现与性能以保障用户流畅的游戏体验,优化美术资源和游戏逻辑;英雄三国地图编辑器提供了多种工具用于定位地图中存在的各种性能风险,本文将尽可能指引您分析自己的地图性能并提供一些可能有价值的优化建议。 1.瓶颈初步定位 GPU排查 一般而言,GPU是否存在瓶颈可以通过任务管理器初步判断; 首先请打开任务管理器,看一眼自己的显卡使用率是否已满 --已满 如果您使用性能在GTX-960以下的显卡,建议尝试调整至低画质 如果你的显卡在GTX-960及以上,请检查 1.阴影范围 2.场景内点光源和聚光灯的数量/范围 3.场景特效/模型数量和规格【尤其是自行导入的模型】,主要关注模型面数,纹理分辨率,shader复杂度,骨骼数量等 --未满,则可能是CPU或者内存相关问题 内存排查 很简单,内存如果大于80%则可能系统内存不足,不断触发缺页中断导致游戏卡顿,尤其是独立进程运行时; 地图制作和编辑通常建议16G以上内存,本地多开建议数量不要超过2个; 8G的设备建议仅使用【编辑器内运行】,避免打开过于复杂的地图; CPU排查 打开Y3编辑器,右上角的UI会实时显示以下几个统计值,每个值的含义以及相应的分析/优化建议见下表:
| | | | | 当前游戏的帧数; 持续小于30帧或者出现大幅波动会显著影响游戏体验,如果你的作品对操作敏感可能需要保持60帧或者更高; | | | 一点背景知识: DrawCall是引擎调用图形API【DirectX、OpenGL等】,命令GPU进行渲染的操作; 提交Drawcall前CPU需要设置渲染状态,加载数据等; 如果Drawcall数量过高,CPU将需要大量的时间提交渲染指令给GPU,导致CPU占用过高,出现性能瓶颈 解决方案: 如果这个值非常高,请尝试检查以下几点: 1.场景中是否有点光源,方向光勾选了投射阴影且范围过大---此类光源的阴影计算需要使用大量的Drawcall---建议考虑关闭其阴影; 2.默认的单层阴影范围是否偏大,(如果游戏摄像机视角接近水平,自适应阴影可能存在范围过大的问题,大范围shadowmap的计算会导致较高的drawcall和面数)可以在美术效果中将阴影调整为级联阴影,并控制阴影范围(使用游戏视角,逐步调低阴影范围,直到游戏摄像机视角边缘的阴影正好消失,消失前的阴影距离即可以作为阈值); 3.视野内大量特效同屏,或部分特效过于复杂---看起来很酷炫的特效可能最初不是为了大量同屏设计,谨慎使用,可以结合【特效数量】参数分析; 4.相机裁剪距离过高,且角度过高,导致大量被遮挡的物体参与绘制--降低相机裁剪距离,设置为50-100; 5.检查【单位】,【可破坏物】,【物品】,【投射物】数量是否偏大,以及视野内以上物品的数量与UI统计值是否匹配; 6.场景中是否存在大数量的零散的装饰物,比如使用大量零散实体手动拼接的地图元素;部分装饰物可以考虑设置不产生阴影(如地板,地基等);自行导入的模型可以考虑预先合并,减少Drawcall数量; | | | 一点背景知识: 场景模型的总面数,指被CPU提交至GPU的模型面数,不含被硬件剔除的部分 这个值太高则配置较低的GPU可能会存在瓶颈 如果这个值非常高,请尝试检查以下几点: 1.场景中是否有点光源,方向光勾选了投射阴影且范围过大---此类光源的阴影计算需要对范围内所有的模型计算一遍shadowmap,提高drawcall和显卡渲染压力---建议考虑关闭其阴影; 2.默认的单层阴影范围是否偏大,(如果游戏摄像机视角接近水平,距离自适应的阴影可能存在范围过大的问题,大范围shadowmap的计算会导致较高的drawcall和面数)可以在美术效果中将阴影调整为级联阴影,并控制阴影范围(使用游戏视角,逐步调低阴影范围,直到游戏摄像机视角边缘的阴影正好消失,消失前的阴影距离即可以作为阈值); 3.相机裁剪距离过高,且角度过高,导致大量被遮挡的物体参与被提交渲染--降低相机裁剪距离,设置为50-100; 4..检查【单位】,【可破坏物】,【道具】,【魔法效果】,【特效】数量是否偏大,以及视野内以上物品的数量与UI统计值是否匹配; 5.是否有模型面数过高,尤其是自行导入的模型 | | | | | | 指编辑器中创建的【单位】/【可破坏物】/【道具】/【投射物】; 如果一个单位身上挂接了其他单位,也需要被计入; 该值表示当前引擎每一帧正在计算的单位数量; 如果这些值非常高或与你看到的数量存在显著差异,请尝试检查以下情况: 1.相机的剔除距离 2.场景中是否把单位摆放在了不应存在的地方(可以使用filter关闭部分物体寻找被遮挡的单位) | | | | | | | | | 注意各种技能,buff,光环和特效的挂接,以及某些魔法效果的堆叠上限 |
--此处的【帧数】数值如果变黄或者变红,表明可能出现卡顿或者低帧率 导致游戏掉帧的情况有很多,建议主要关注下面两个,如果【帧数】下降的同时【Drawcall】或【面数】也有突增(变成黄色/红色),需要考虑该场景内此时的模型、投射物、魔法效果是否存在数量过高的情况 ---如果存在上述问题,请尝试对其进行简化; ---如果初步排除以上情况,请考虑使用分析工具分析游戏ECA部分的性能,见下一节; 2.【视频】使用ECA分析器对Y3游戏进行性能分析并优化 Y3的游戏逻辑,单位逻辑以及UI均由ECA控制,过于复杂的ECA逻辑可能导致游戏出现卡顿和低帧率等问题; 可以在Y3 Editor 中运行内置的ECA分析器(ECA Profiler),从而在开发游戏过程中快速定位ECA相关的性能瓶颈 ---如果游戏需要60帧 ECA部分的总耗时应当<16ms; ---如果游戏需要30帧 ECA部分的总耗时应当<33ms; 【时长约6分钟】这里以一个简单的案例介绍ECA分析器的功能分布和使用流程:
3.【文档】ECA 分析器简介 Y3的游戏逻辑,单位逻辑以及UI均由ECA控制,过于复杂的ECA逻辑可能导致游戏出现卡顿和低帧率等问题; 可以在Y3 Editor 中运行内置的ECA分析器(ECA Profiler),从而在开发游戏过程中快速定位ECA相关的性能瓶颈。 工具使用流程: 各部分功能: 本工具主要包括以下几个部分: 1.运行/暂停控制区域 用于在调试中控制游戏的暂停和继续运行 2.CPU帧耗时展示区域 每个竖条表示一帧的CPU部分函数耗时【主要是ECA部分】; 本工具过去约5秒所有帧的耗时信息,即约150个逻辑帧,一次展示其中30帧/60帧(Zoom处调整) 在下方帧数分布展示区域拖动滑动条查看其他帧耗时 3.ECA耗时展示区域 这里以火焰图(Flame Graph)的形式展示该帧触发器的调用关系和耗时【精确到每个触发器】 火焰图 阅读方法: 纵向 ---每级触发器及其运行中调用的其他触发器/动作,每一次子调用对应一个纵向的色块; ---如果调用太深或者出现嵌套,建议考虑简化调用逻辑; 横向 ---每个色块对应本帧的每一次触发器调用的名称及其运行耗时【单位/ms】; ---如果游戏需要60帧 横向的总耗时应当<16ms; ---如果游戏需要30帧 横向的总耗时应当<33ms; ---如果一帧内次数太多,可以考虑简化逻辑或者分帧处理; 建议优先关注耗时较高/调用次数较多的触发器 点击相应的色块可以打开触发器编辑界面 4.【点击后出现】触发器界面 点击后会打开,并跳转到对应行,例如点击上面的【创建单位】就跳转到【创建单位】的触发器的第8行 4.一些Tips,以及某些你可能不想再踩一遍的坑 谨慎控制单位的警戒距离,不要拉的太大,通常800左右比较合适,刷新后立即攻击可以用ECA实现 谨慎使用【任意单位-造成伤害】这类触发,尝试添加一些其他限制条件,避免伤害调伤害调伤害的嵌套风险 物品栏可以堆叠,没必要做几千个 加载页等UI页摄像机放在地图偏远一点的地方,降低不必要的负载 AOE技能建议谨慎控制伤害的范围和数量上限 如果一个特效可能存续数量很多,不要使用过于复杂的粒子 场景中伤害结算展示功能等与ECA相关的UI,需要控制更新频率 如果你需要给一大片单位加buff,请直接加给他们而不是给某个幸运观众套个范围2000+的光环 小兵尽量使用简易普攻进行制作,在伤害事件里面挂buff,而不是所有技能用ECA实现【用于塔防小兵,练功房小怪这种大量的单位组件上】
|