欢迎来到天天文库
浏览记录
ID:34756575
大小:175.87 KB
页数:8页
时间:2019-03-10
《如何优化unity3d游戏运行性能》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、学IT技能上我学院网woxueyuan.com如何优化Unity3d游戏运行性能如何优化Unity3D游戏运行性能?流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏《ShadowBlade》已经将在标准iPhone和iPad设备上实现每秒60帧视为一个重要目标。以下是我们在紧凑的优化过程中提升游戏运行性能,并实现目标帧率时需要考虑的事项。当基本游戏功能到位时,就要确保游戏运行表现能够达标。我们衡量游戏运行表现的一个基本工具是Unity内置分析器以及Xcode分析工具。使用Unity分析器来分析设备上的运行代码真是一项宝贵的功能。Unity3D
2、Cocos
3、php
4、HTML5
5、Java
6、
7、ios
8、Android
9、C#
10、AS3
11、PS
12、UI
13、3Dmax
14、Python
15、MySQL
16、VR
17、AR学IT技能上我学院网woxueyuan.com我们总结了这种为将目标设备的帧率控制在60fps而进行衡量、调整、再衡量过程的中相关经验。一、遇到麻烦时要调用“垃圾回收器”(GarbageCollector,无用单元收集程序,以下简称GC)由于具有C/C++游戏编程背景,我们并不习惯无用单元收集程序的特定行为。确保自动清理你不用的内存,这种做法在刚开始时很好,但很快你就公发现自己的分析器经常显示CPU负荷过大,原因是垃圾回收器正在收集垃圾内存。这对移动设备来说尤其是个大问题。要跟进内存分配,并尽量
18、避免它们成为优先数,以下是我们应该采取的主要操作:1.移除代码中的任何字符串连接,因为这会给GC留下大量垃圾。2.用简单的“for”循环代替“foreach”循环。由于某些原因,每个“foreach”循环的每次迭代会生成24字节的垃圾内存。一个简单的循环迭代10次就可以留下240字节的垃圾内存。3.更改我们检查游戏对象标签的方法。用“if(go.CompareTag(“Enemy”)”来代替“if(go.tag==“Enemy”)”。在一个内部循环调用对象分配的标签属性以及拷贝额外内存,这是一个非常糟糕的做法。Unity3D
19、Cocos
20、php
21、HTML5
22、Java
23、ios
24、Android
25、C
26、#
27、AS3
28、PS
29、UI
30、3Dmax
31、Python
32、MySQL
33、VR
34、AR学IT技能上我学院网woxueyuan.com4.对象库很棒,我们为所有动态游戏对象制作和使用库,这样在游戏运行时间内不会动态分配任何东西,不需要的时候所有东西反向循环到库中。5.不使用LINQ命令,因为它们一般会分配中间缓器,而这很容易生成垃圾内存。二、谨慎处理高级脚本和本地引擎C++代码之间的通信开销。所有使用Unity3D编写的游戏玩法代码都是脚本代码,在我们的项目中是使用Mono执行时间处理的C#代码。任何与引擎数据的通信需求都要有一个进入高级脚本语言的本地引擎代码的调用。这当然会产生它自己的开销,而尽量减少游戏代
35、码中的这些调用则要排在第二位。1.在这一情景中四处移动对象要求来自脚本代码的调用进入引擎代码,这样我们就会在游戏玩法代码的一个帧中缓存某一对象的转换需求,并一次仅向引擎发送一个请求,以便减少调用开销。这种模式也适用于其他相似的地方,而不仅局限于移动和旋转对象。2.将引用本地缓存到元件中会减少每次在一个游戏对象中使用“GetComponent”获取一个元件引用的需求,这是调用本地引擎代码的另一个例子。三、物理效果1.将物理模拟时间步设置到最小化状态。在我们的项目中就不可以将让它低于16毫秒。Unity3D
36、Cocos
37、php
38、HTML5
39、Java
40、ios
41、Android
42、C#
43、AS3
44、PS
45、UI
46、
47、3Dmax
48、Python
49、MySQL
50、VR
51、AR学IT技能上我学院网woxueyuan.com2.减少角色控制器移动命令的调用。移动角色控制器会同步发生,每次调用都会耗损极大的性能。我们的做法是缓存每帧的移动请求,并且仅运用一次。3.修改代码以免依赖“ControllerColliderHit”回调函数。这证明这些回调函数处理得并不十分迅速。4.面对性能更弱的设备,要用skinnedmesh代替physicscloth。cloth参数在运行表现中发挥重要作用,如果你肯花些时间找到美学与运行表现之间的平衡点,就可以获得理想的结果。5.在物理模拟过程中不要使用ragdolls,只有在必要时才让它
52、生效。6.要谨慎评估触发器的“onInside”回调函数,在我们的项目中,我们尽量在不依赖它们的情况下模拟逻辑。7.使用层次而不是标签。我们可以轻松为对象分配层次和标签,并查询特定对象,但是涉及碰撞逻辑时,层次至少在运行表现上会更有明显优势。更快的物理计算和更少的无用分配内存是使用层次的基本原因。8.千万不要使用Mesh对撞机。Unity3D
53、Cocos
54、php
55、HTML5
56、Java
57、ios
58、An
此文档下载收益归作者所有