[Unity] [随风去旅行] Unity3d优化总结篇

查看:11312 |回复:257 | 2015-7-8 20:45:33

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 成林 于 2018-5-15 20:59 编辑

50.jpg
此总结由自己经验及网上收集整理优化内容 包括:(部分内容设定需回复可见!!!
1.代码方面;
2.函数使用方面;
3.ngui注意方面;
4.数学运算方面;
5.内存方面;
6.垃圾回收方面 等等...
本着相互交流 共同进步的原则


希望大家看后 有其他或者更好的优化方案 欢迎跟帖。{:94:}

好了,总结如下:
1. 尽量避免每帧处理,可以每隔几帧处理一次
比如:
  1. function Update() { DoSomeThing(); }
点击此处复制文本
可改为每5帧处理一次:
  1. function Update() { if(Time.frameCount % 5 == 0) { DoSomeThing(); } }
点击此处复制文本
2. 定时重复处理用InvokeRepeating 函数实现


比如,启动0.5秒后每隔1秒执行一次 DoSomeThing 函数:
  1. function Start() { InvokeRepeating("DoSomeThing", 0.5, 1.0); }
  2. CancelInvoke("你调用的方法"); 停止InvokeRepeating
点击此处复制文本

3. 优化 Update,FixedUpdate, LateUpdate 等每帧处理的函数,函数里面的变量尽量在头部声明。
比如:
  1. function Update() { var pos: Vector3 = transform.position; }
点击此处复制文本
可改为
  1. private var pos: Vector3; function Update(){ pos = transform.position; }
点击此处复制文本

4. 主动回收垃圾
给某个 GameObject 绑上以下的代码:
  1. function Update() { if(Time.frameCount % 50 == 0) { System.GC.Collect(); } }
点击此处复制文本
5. 运行时尽量减少 Tris 和 Draw Calls


预览的时候,可点开 Stats,查看图形渲染的开销情况。特别注意 Tris 和 Draw Calls 这两个参数。


一般来说,要做到:


Tris 保持在 7.5k 以下


Draw Calls 保持在 35 以下

6. 压缩 Mesh


导入 3D 模型之后,在不影响显示效果的前提下,最好打开 Mesh Compression。


Off, Low, Medium, High 这几个选项,可酌情选取。对于单个Mesh最好使用一个材质。

7. 避免大量使用 Unity 自带的 Sphere 等内建 Mesh


Unity 内建的 Mesh,多边形的数量比较大,如果物体不要求特别圆滑,可导入其他的简单3D模型代替。


8. 优化数学计算
尽量避免使用float,而使用int,特别是在手机游戏中,尽量少用复杂的数学函数,比如sin,cos等函数。改除法/为乘法,例如:使用x*0.5f而不是 x/2.0f 。


9.如果你做了一个图集是1024X1024的。此时你的界面上只用了图集中的一张很小的图,那么很抱歉1024X1024这张大图都需要载入你的内存里面,1024就是4M的内存,如果你做了10个1024的图集,你的界面上刚好都只用了每个图集里面的一张小图,那么再次抱歉你的内存直接飙40M。意思是任何一个4096的图片,不管是图集还是texture,他都占用4*4=16M?
————————————————————————————————————————————————————————————————————————————————————
————————————————————————————————————————————————————————————————————————————————————

1、在使用数组或ArrayList对象时应当注意
  1. length=myArray.Length;  
  2. for(int i=0;i<length;i++)  
  3. {  
  4.    
  5. }
点击此处复制文本
避免
  1. for(int i=0;i<myArray.Length;i++)  
  2. {  
  3.    
  4. }
点击此处复制文本
2、少使用临时变量,特别是在Update OnGUI等实时调用的函数中。
  1. void Update()  
  2. {  
  3.    Vector3 pos;  
  4.    pos=transform.position;  
  5. }
点击此处复制文本
可以改为:
  1. private Vector3 pos;  
  2. void Update()  
  3. {  
  4.    pos=transform.position;  
  5. }
点击此处复制文本

3、如果可能,将GameObject上不必要的脚本disable掉。
如果你有一个大的场景在你的游戏中,并且敌方的位置在数千米意外,
这时你可以disable你的敌方AI脚本直到它们接近摄像机为止。
一个好的途径来开启或关闭GameObject是使用SetActiveRecursively(false),并且球形或盒型碰撞器设为trigger。

4、删除空的Update方法。
当通过Assets目录创建新的脚本时,脚本里会包括一个Update方法,当你不使用时删除它。


5、引用一个游戏对象的最合乎逻辑的组件。
有人可能会这样写someGameObject.transform,gameObject.rigidbody.transform.gameObject.rigidbody.transform,但是这样做了一些不必要的工作,
你可以在最开始的地方引用它,像这样:



  1. privateTransform myTrans;
  2. void Start()
  3. {
  4.     myTrans=transform;
  5. }
点击此处复制文本
6、协同是一个好方法。
可以使用协同程序来代替不必每帧都执行的方法。(还有InvokeRepeating方法也是一个好的取代Update的方法)。


7、尽可能不要再Update或FixedUpdate中使用搜索方法(例如GameObject.Find()),你可以像前面那样在Start方法里获得它。


8、不要使用SendMessage之类的方法,他比直接调用方法慢了100倍,你可以直接调用或通过C#的委托来实现。


9、使用javascript或Boo语言时,你最好确定变量的类型,不要使用动态类型,这样会降低效率,
你可以在脚本开头使用#pragmastrict 来检查,这样当你编译你的游戏时就不会出现莫名其妙的错误了。
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————

1、顶点性能     
一般来说,如果您想在iPhone 3GS或更新的设备上每帧渲染不超过40,000可见点,
那么对于一些配备 MBX GPU的旧设备(比如,原始的 iPhone,如 iPhone 3g和 iPod Touch第1和第2代)来说,你应该保证每帧的渲染顶点在10000以下。


2、光照性能     
像素的动态光照将对每个受影响的像素增加显著的计算开销,并可能导致物体会被渲染多次。
为了避免这种情况的发生,您应该避免对于任何单个物体都使用多个像素光照,并尽可能地使用方向光。
需要注意的是像素光源是一个渲染模式(Render Mode)设置为重要(Important)的光源。
像素的动态光照将对顶点变换增加显著的开销。所以,应该尽量避免任何给定的物体被多个光源同时照亮的情况。
对于静态物体,采用烘焙光照方法则是更为有效的方法。


3、角色     
每个角色尽量使用一个Skinned Mesh Renderer,这是因为当角色仅有一个 Skinned Mesh Renderer 时,
Unity 会使用可见性裁剪和包围体更新的方法来优化角色的运动,而这种优化只有在角色仅含有一个 Skinned Mesh Renderer时才会启动。
角色的面数一般不要超过1500,骨骼数量少于30就好,角色Material数量一般1~2个为最佳。


4、静态物体     
对于静态物体定点数要求少于500,UV的取值范围不要超过(0,1)区间,这对于纹理的拼合优化很有帮助。
不要在静态物体上附加Animation组件,虽然加了对结果没什么影响,但是会增加CPU开销。


5、摄像机     
将远平面设置成合适的距离,远平面过大会将一些不必要的物体加入渲染,降低效率。
另外我们可以根据不同的物体来设置摄像机的远裁剪平面。Unity 提供了可以根据不同的 layer 来设置不同的 view distance ,
所以我们可以实现将物体进行分层,大物体层设置的可视距离大些,而小物体层可以设置地小些,
另外,一些开销比较大的实体(如粒子系统)可以设置得更小些等等。


6、DrawCall      
尽可能地减少 Drawcall 的数量。 IOS 设备上建议不超过 100 。
减少的方法主要有如下几种: Frustum Culling ,Occlusion Culling , Texture Packing 。 Frustum Culling 是 Unity 内建的,我们需要做的就是寻求一个合适的远裁剪平面;
Occlusion Culling ,遮挡剔除, Unity 内嵌了 Umbra ,一个非常好 OC 库。
但 Occlusion Culling 也并不是放之四海而皆准的,有时候进行 OC 反而比不进行还要慢,
建议在 OC 之前先确定自己的场景是否适合利用 OC 来优化; Texture Packing ,或者叫 Texture Atlasing ,
是将同种 shader 的纹理进行拼合,根据 Unity 的 static batching 的特性来减少 draw call 。
建议使用,但也有弊端,那就是一定要将场景中距离相近的实体纹理进行拼合,否则,拼合后很可能会增加每帧渲染所需的纹理大小,
加大内存带宽的负担。这也就是为什么会出现“ DrawCall 降了,渲染速度也变慢了”的原因。


尊敬的游客,如果您要查看本帖关注 或 回复可见内容请关注回复后刷新页面查看!



2015-7-8 20:45:33  
 赞 赞 1

使用道具 登录

257个回答,把该问题分享到群,邀请大神一起回答。
2#
资源甚好,发帖艰辛,且阅且珍惜!
回复 收起回复
2015-7-8 21:49:23   回复
 赞 赞 1

使用道具 登录

3#
资源发布哪家强?元素首发称大王!
回复 收起回复
2015-7-8 23:40:43   回复
 赞 赞 1

使用道具 登录

4#
元素那么大,我想来看看!
回复 收起回复
2015-7-9 02:58:50   回复
 赞 赞 1

使用道具 登录

5#
带你赚币带你飞,元素里面有正妹!
回复 收起回复
2015-7-9 10:59:31   回复
 赞 赞 1

使用道具 登录

6#

我和我的小伙伴们都惊呆了!
回复 收起回复
2015-7-9 11:46:16   回复
 赞 赞 1

使用道具 登录

7#
给力!元素有你更精彩
回复 收起回复
2015-7-9 12:52:07   回复
 赞 赞 1

使用道具 登录

8#
谢谢楼主分享,很好
回复 收起回复
2015-7-9 13:18:28   回复
 赞 赞 1

使用道具 登录

9#
谢谢楼主分享,很好
回复 收起回复
2015-7-9 13:19:10   回复
 赞 赞 1

使用道具 登录

10#
给力!元素有你更精彩
回复 收起回复
2015-7-9 19:02:31   回复
 赞 赞 1

使用道具 登录

11#
不错,是参考学习的好资料,感谢分享。
回复 收起回复
2015-7-9 21:57:45   回复
 赞 赞 1

使用道具 登录

12#
谢谢楼主看看先
回复 收起回复
2015-7-9 21:59:56   回复
 赞 赞 1

使用道具 登录

13#
谢谢楼主看看先.............
回复 收起回复
2015-7-11 11:51:12   回复
 赞 赞 1

使用道具 登录

14#
给力!元素有你更精彩
回复 收起回复
2015-7-12 10:06:23   回复
 赞 赞 1

使用道具 登录

15#
想要成大触,天天上元素!
回复 收起回复
2015-7-13 11:05:01   回复
 赞 赞 1

使用道具 登录

16#
想要成大触,天天上元素!
回复 收起回复
2015-7-13 11:44:09   回复
 赞 赞 1

使用道具 登录

17#
带你赚币带你飞,元素里面有正妹!
回复 收起回复
2015-7-30 17:24:15   回复
 赞 赞 1

使用道具 登录

18#
元素那么大,我想来看看!
回复 收起回复
2015-7-31 09:46:06   回复
 赞 赞 1

使用道具 登录

19#
资源发布哪家强?元素首发称大王!
回复 收起回复
2015-8-6 08:09:55   回复
 赞 赞 1

使用道具 登录

20#
哇!!!!!好东西!!赞!
回复 收起回复
2015-8-10 14:32:35   回复
 赞 赞 1

使用道具 登录

CG 游戏行业专业问题

Unity3D技术手机游戏引擎手游引擎
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表