作者:Amir Fasshihi
流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏《Shadow Blade》已经将在标准iPhone和iPad设备上实现每秒60帧视为一个重要目标。
以下是我们在紧凑的优化过程中提升游戏运行性能,并实现目标帧率时需要考虑的事项。
当基本游戏功能到位时,就要确保游戏运行表现能够达标。我们衡量游戏运行表现的一个基本工具是Unity内置分析器以及Xcode分析工具。使用Unity分析器来分析设备上的运行代码真是一项宝贵的功能。
我们总结了这种为将目标设备的帧率控制在60fps而进行衡量、调整、再衡量过程的中相关经验。
shadow blade(from deadmage.com)
一、遇到麻烦时要调用“垃圾回收器”(Garbage Collector,无用单元收集程序,以下简称GC)
由于具有C/C++游戏编程背景,我们并不习惯无用单元收集程序的特定行为。确保自动清理你不用的内存,这种做法在刚开始时很好,但很快你就公发现自己的分析器经常显示CPU负荷过大,原因是垃圾回收器正在收集垃圾内存。这对移动设备来说尤其是个大问题。要跟进内存分配,并尽量避免它们成为优先数,以下是我们应该采取的主要操作:
1.移除代码中的任何字符串连接,因为这会给GC留下大量垃圾。
2.用简单的“for”循环代替“foreach”循环。由于某些原因,每个“foreach”循环的每次迭代会生成24字节的垃圾内存。一个简单的循环迭代10次就可以留下240字节的垃圾内存。
3.更改我们检查游戏对象标签的方法。用“if (go.CompareTag (“Enemy”)”来代替“if (go.tag == “Enemy”)” 。在一个内部循环调用对象分配的标签属性以及拷贝额外内存,这是一个非常糟糕的做法。
4.对象库很棒,我们为所有动态游戏对象制作和使用库,这样在游戏运行时间内不会动态分配任何东西,不需要的时候所有东西反向循环到库中。
5.不使用LINQ命令,因为它们一般会分配中间缓器,而这很容易生成垃圾内存。
二、谨慎处理高级脚本和本地引擎C++代码之间的通信开销。
所有使用Unity3D编写的游戏玩法代码都是脚本代码,在我们的项目中是使用Mono执行时间处理的C#代码。任何与引擎数据的通信需求都要有一个进入高级脚本语言的本地引擎代码的调用。这当然会产生它自己的开销,而尽量减少游戏代码中的这些调用则要排在第二位。
1.在这一情景中四处移动对象要求来自脚本代码的调用进入引擎代码,这样我们就会在游戏玩法代码的一个帧中缓存某一对象的转换需求,并一次仅向引擎发送一个请求,以便减少调用开销。这种模式也适用于其他相似的地方,而不仅局限于移动和旋转对象。
2.将引用本地缓存到元件中会减少每次在一个游戏对象中使用 “GetComponent” 获取一个元件引用的需求,这是调用本地引擎代码的另一个例子。
三、物理效果
1.将物理模拟时间步设置到最小化状态。在我们的项目中就不可以将让它低于16毫秒。
2.减少角色控制器移动命令的调用。移动角色控制器会同步发生,每次调用都会耗损极大的性能。我们的做法是缓存每帧的移动请求,并且仅运用一次。
3.修改代码以免依赖“ControllerColliderHit” 回调函数。这证明这些回调函数处理得并不十分迅速。
4.面对性能更弱的设备,要用skinned mesh代替physics cloth。cloth参数在运行表现中发挥重要作用,如果你肯花些时间找到美学与运行表现之间的平衡点,就可以获得理想的结果。
5.在物理模拟过程中不要使用ragdolls,只有在必要时才让它生效。
6.要谨慎评估触发器的“onInside”回调函数,在我们的项目中,我们尽量在不依赖它们的情况下模拟逻辑。
7.使用层次而不是标签。我们可以轻松为对象分配层次和标签,并查询特定对象,但是涉及碰撞逻辑时,层次至少在运行表现上会更有明显优势。更快的物理计算和更少的无用分配内存是使用层次的基本原因。
8.千万不要使用Mesh对撞机。
9.最小化碰撞检测请求(例如ray casts和sphere checks),尽量从每次检查中获得更多信息。
四、让AI代码更迅速
我们使用AI敌人来阻拦忍者英雄,并同其过招。以下是与AI性能问题有关的一些建议:
1.AI逻辑(例如能见度检查等)会生成大量物理查询。可以让AI更新循环设置低于图像更新循环,以减少CPU负荷。
五、最佳性能表现根本就不是来自代码!
没有发生什么情况的时候,就说明性能良好。这是我们关闭一切不必要之物的基本原则。我们的项目是一个侧边横向卷轴动作游戏,所以如果不具有可视性时,就可以关闭许多动态关卡物体。
1.使用细节层次的定制关卡将远处的敌人AI关闭。
2.移动平台和障碍,当它们远去时其物理碰撞机也会关闭。
3.Unity内置的“动画挑选”系统可以用来关闭未被渲染对象的动画。
4.所有关卡内的粒子系统也可以使用同样的禁用机制。
六、回调函数!那么空白的回调函数呢?
要尽量减少Unity回调函数。即使敌人回调函数存在性能损失。没有必要将空白的回调函数留在代码库中(有时候介于大量代码重写和重构之间)。
七、让美术人员来救场
在程序员抓耳挠腮,绞尽脑汁去想该如何让每秒运行更多帧时,美术人员总能神奇地派上大用场。
1.共享游戏对象材料,令其在Unity中处于静止状态,可以让它们绑定在一起,由此产生的简化绘图调用是呈现良好移动运行性能的重要元素。
2.纹理地图集对UI元素来说尤其有用。
3.方形纹理以及两者功率的合理压缩是必不可少的步骤。
4.我们的美术人员移除了所有远处背景的网格,并将其转化为简单的2D位面。
5.光照图非常有价值。
6.我们的美术人员在一些关口移除了额外顶点。
7.使用合理的纹理mip标准是一个好主意(游戏邦注:要让不同分辨率的设备呈现良好的帧率时尤其如此)。
8.结合网格是美术人员可以发挥作用的另一个操作。
9.我们的动画师尽力让不同角色共享动画。
10.要找到美学/性能之间的平衡,就免不了许多粒子效果的迭代。减少发射器数量并尽量减少透明度需求也是一大挑战。
八、要减少内存使用
使用大内存当然会对性能产生负面影响,但在我们的项目中,我们的iPod由于超过内存上限而遭遇了多次崩溃事件。我们的游戏中最耗内存的是纹理。
1.不同设备要使用不同的纹理大小,尤其是UI和大型背景中的纹理。《Shadow Blade》使用的是通用型模板,但如果在启动时检测到设备大小和分辨率,就会载入不同资产。
2.我们要确保未使用的资产不会载入内存。我们必须迟一点在项目中找到仅被一个预制件实例引用,并且从未完全载入内存中实例化的资产。
3.去除网格中的额外多边形也能实现这一点。
4.我们应该重建一些资产的生周期管理。例如,调整主菜单资产的加载/卸载时间,或者关卡资产、游戏音乐的有效期限。
5.每个关卡都要有根据其动态对象需求而量身定制的特定对象库,并根据最小内存需求来优化。对象库可以灵活一点,在开发过程中包含大量对象,但知道游戏对象需求后就要具体一点。
6.保持声音文件在内存的压缩状态也是必要之举。
加强游戏运行性能是一个漫长而具有挑战性的过程,游戏开发社区所分享的大量知识,以及Unity提供的出色分析工具为《Shadow Blade》实现目标运行性能提供了极大帮助。(本文为游戏邦/gamerboom.com编译,拒绝任何不保留版权的转载,如需转载请联系:游戏邦)
相关推荐
这是非常强大的和高度优化的性能。 文件 Android演示应用程序 演示: - 聊天消息列表演示 - 水平画廊演示 - 垂直画廊演示 - GridView演示 - PageVew演示 - TreeVew演示 - 与稠粘头演示的TreeView - ...
借助 Off-Road Truck 2 模板,您可以在几个小时内使用针对所有平台优化的自己的汽车、配件、菜单、UI、车辆物理和地形变形轻松创建自己的越野游戏,而无需牺牲性能 特点: 具有最高图形和性能的 URP 管道 Real Real ...
UGUI MiniMap是一个完整的、易于使用的MiniMap/WorldMap解决方案,用于使用UGUI系统的Unity。您可以为任何类型的游戏,如赛车、FPS、RPG、RTS等,轻松整合您想要的任何类型的迷你地图。 你可以在你的场景中拖放一个...
DynamicScrollRect可滚动的ScrollRect的unity3d插件UI布局 用于unity2021以上版本为该场景提供了一种优化的解决方案。滚动视图仅会实例化滚动视图内部将要显示的元素,从而节省了大量的绘制和内存使用。...
用 Paint in 3D 绘制所有物体 - 在游戏内和编辑器里。所有功能已经过深度优化,在WebGL、移动端、VR 以及更多平台用起来都非常好用! ? 容易使用 - 学习如何使用 Paint in 3D,让众多教程场景来手把手帮你过一遍每...
Birds Coloring Game 鸟类...它针对移动设备进行了完全优化,可以完美运行,没有性能滞后或任何错误。 源代码包括游戏的各个方面,包括用户界面、图形、音效、音乐等。修改代码、广告参数和重新设计游戏皮肤非常容易。
GPU Instancer 是一款开箱即用的工具,可显示屏幕上对象的精确数量,性能表现强劲。只需鼠标点击几下,你就可以实例化你的预设、Unity 地形细节和树木。 GPU Instancer 可提供方便操作的工具,让你省去费力学习计算...
Unity3D 是一个让你轻松创作的多平台的游戏开发工具,是一个全面整合的专业游戏引擎。 =============================================================================== 特色 综合编辑 通过 Unity 简单的游戏制作...
随附并使用车轮控制器 3D,代替车轮碰撞体。它可以提供对整个车轮下半部分的地面检测功能,且高度可自定义,使用高级摩擦模型。 每个车轮表面检测。为每个表面提供不同的摩擦曲线、声音和特效。 基于易于扩展的...
它非常强大,并且对性能进行了高度优化。 特点: ——StaggeredGridView。一个垂直/水平的StaggeredGridView可以用来创建项目有不同的高度/宽度的GridView,如Pinterest —ListView和GridView ——无限的物品 -不同...
说明这东西确实运行很高效,虽然没有Unity那样的GPU渲染优化(Unity3D的美化与渲染真的很好),但是这样低的CPU占用率依然很诱人(使用Unity3D时CPU占用率在1.3%~1.6%左右,GPU占用率高,占用线程多),对于轻量级...
说明这东西确实运行很高效,虽然没有Unity那样的GPU渲染优化(Unity3D的美化与渲染真的很好),但是这样低的CPU占用率依然很诱人(使用Unity3D时CPU占用率在1.3%~1.6%左右,GPU占用率高,占用线程多),对于轻量级...
Mesh Baker是一款为Unity 3D游戏引擎设计的强大工具,它专注于处理和优化网格(Mesh)数据。这款插件能够自动化地将多个小网格合并成更大的网格,以减少运行时性能开销,并优化渲染效率。Mesh Baker特别适合处理复杂...
所支持的Unity版本 5.2.0 及以上版本 WebGL Showcase | WebGL压力测试|文档|论坛 这个插件允许您通过生成真正容积的程序光束来大大改善场景的照明。 这是模拟聚光灯和手电筒的密度,深度和音量的完美,简单而便宜...
适用于 Unity 的完整视觉行为创作解决方案,可帮助你创建高级 AI 行为和逻辑,包括三个独立、功能齐全但可流畅切换的模块供你选择,轻松添加至游戏中: 反应行为树。 层次状态机。 多角色对话树。 NodeCanvas 是...
.需要 Net 4.x’ 等效运行时版本。 ‘.... [文档、论坛、下载] [在 Discord 上加入我们] ...将 NodeCanvas 添加至你的项目中,享受 Unity 功能丰富、完整的视觉行为创作功能,实现各种可能性同时性能毫不逊色
高性能:Highlighting System 5.0经过优化,能够在保证流畅运行的同时,为选中的物体添加高质量的轮廓效果,不会对应用程序的性能造成明显影响。 易于集成:这个插件提供了简洁明了的API和文档,使得开发者能够轻松...
性能优化是VR开发人员最重要的技能之一,因为运行在目标帧速率以下的应用程序基本上无法播放,从而导致恶心和不适。 该项目模拟了一个现实世界的场景,在该场景中,仓促构建了VR游戏,并着重于功能而不是性能(原型...
可以在其他游戏引擎(即Unity3D)之上运行。 用GLSL编写着色器并交叉编译以定位特定的着色器。 Kha应用程序也可以编译为C#或Java库 灵活而强大的后端系统。 自己添加即可轻松完成。 一个适用于所有