Unity3D在IOS上的优化小结

http://www.58player.com/blog-635-122.html

最近一段時間一直在做Unity 在IOS設備上的資源優化,結合Unity的官方文檔以及自己遇到的實際問題,我把自己認为一些重要的信息罗列在下面,並盡可能對將其量化,以方便更多需要做優化的朋友。

1、角色

每個角色盡量使用一個Skinned Mesh Renderer

這是因为當角色僅有一個Skinned Mesh Renderer時,Unity會使用可見性裁剪和包圍體更新的方法來優化角色的運動,而這種優化只有在角色僅含有一個Skinned Mesh Renderer時才會启動。

角色Material數量

2-3個

骨骼數量

小於30個

面片數量

300-1500

一般角色應該沒有IK結點

這是因为角色的動作大多數都是事先設定好的,並不需要經過IK操作來進行實時計算(Rogdoll除外),所以在模型導入時,不要將IK結點一起導入。

2、靜態實體

不要附加Animation Component

在靜態實體上附加Animation部件雖然對結果沒有影響,但卻會增加一定的CPU開銷來調用這一組件,所以盡量去掉該組件。

網格頂點數

小於500

UV值範圍盡量不要超過(0, 1)區間

盡量保證UV值不越界,這對於將來的紋理拼合優化很有幫助。

3、地形

地形的分辨率大小

長寬均盡量小於257。這是因为地形太大,會造成大量頂點數據,给你的內存帶寬造成一定的影響,在目前的ios設備中,內存帶寬是非常有限的,需要盡量節省。同時,如果用Unity自帶的地形,一定也要使用Occlusion Culling,因为Unity的刷地形工具雖然方便,但卻是framekiller,刷過之後,你會發現drawcall增加的非常多。

混合紋理數量

不要超過4。地形的混合操作是很耗時的,應該盡量避免。能合並的紋理盡量合並。

4、紋理

紋理格式

建議png或tga。不用轉成ios硬件支持的PVRTC格式,因为Unity在發布時會幫你自動轉的。

紋理尺寸

長寬小於1024。同時應該盡可能地小,夠用就好,以保證紋理對內存帶寬的影響達到最小。

支持Mipmap

建議生成Mipmap。雖然這種做法會增加一些應用程序的大小,但在遊戲運行時,系統會根據需求應用Mipmap來渲染,從而減少內存帶寬。

檢查Alpha值

如果紋理的alpha通道均为1,則用RGB的24位紋理來代替RGBA的32位紋理。(據說Unity內部會進行自動檢測)

5、光源

光源“Important”個數

建議1個,一般为方向光。“Important”個數應該越小越少。個數越多,drawcall越多。

Pixel Light數目

1-2個。

6、粒子特效

屏幕上的最大粒子數

建議小於200個粒子。

每個粒子發射器發射的最大粒子數

建議不超過50個。

粒子大小

如果可以的話,粒子的size應該盡可能地小。因为Unity的粒子系統的shader無論是alpha test還是alpha blending都是一筆不小的開銷。同時,對於非常小的粒子,建議粒子紋理去掉alpha通道。

盡量不要開启粒子的碰撞功能。

非常耗時。

7、音頻

遊戲中播放時間較長的音樂(如背景音樂)

使用.ogg或.mp3的壓縮格式。

較短音樂(如槍聲)

使用.wav和.aif的未壓縮音頻格式。

8、相機

裁剪平面

將遠平面設置成合适的距離。遠平面過大會將一些不必要的物體加入渲染,降低效率。

根據不同的物體設置不同的遠裁剪平面

Unity提供了可以根據不同的layer來設置不同的view distance,所以我們可以實現將物體進行分層,大物體層設置的可視距離大些,而小物體層可以設置地小些,另外,一些開銷比較大的實體(如粒子系統)可以設置得更小些等等。

9、碰撞

盡量不用MeshCollider

如果可以的話,盡量不用MeshCollider,以節省不必要的開銷。如果不能避免的話,盡量用減少Mesh的面片數,或用較少面片的代理體來代替。

10、其他

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降了,渲染速度也變慢了”的原因。

非運動物體盡量打上Static標簽

Unity在運行時會對static物體進行自動優化處理,所以應該盡可能將非運行實體勾上static標簽。

場景中盡可能地使用prefab

盡可能地使用prefab的實例化物體,以降低內存帶寬的負擔。檢查實體的PrefabType,盡量將其變成PrefabInstance,而不是ModelPrefabInstance。

備注:優化是個無止境的過程,可優化的項目其實還有很多很多,比如腳本優化,shader優化等等,這些留待以後再慢慢添加。

原文链接:http://rritw.com/a/caozuoxitong/OS/20120426/160528.html

时间: 2024-10-19 16:50:20

Unity3D在IOS上的优化小结的相关文章

iOS性能优化小结

iOS性能优化分析 首先要熟悉几个概念 PNG 和 JPG 的区别是什么? png格式的图片有alpha通道,jpeg则没有.png无损压缩,jpeg允许你选择0-100%的压缩质量.如果需要alpha通道(透明),就只能用png格式. CPU 和 GPU 如果想看看两者的区别,先得了解iOS视图背后的层级结构原理  上图中的最底下一行是硬件层,由GPU和CPU组成. 我们经常说到的硬件加速其实是指OpenGL,Core Animation/UIKit基于GPU之上对计算机图形合成以及绘制的实现

Unity3D游戏在iOS上因为trampolines闪退的原因与解决办法

http://7dot9.com/?p=444 http://whydoidoit.com/2012/08/20/unity-serializer-mono-and-trampolines/ 确定具体原因 那么好吧,打一个测试版本再来看,然后再等着崩溃,查看崩溃日志吧,最终看到的崩溃日志中,崩溃线程输出信息如下: Thread 27 Crashed: 0 libsystem_kernel.dylib 0x38e671fc __pthread_kill + 8 1 libsystem_pthrea

Unity3D for iOS初级教程:Part 1/3(上)

转自:http://www.cnblogs.com/alongu3d/archive/ 如果图片看不到,请查看原文 这篇教材是来自教程团队成员 Christine Abernathy, 他是Facebook的开发支持团队的工程师.Unity是最为流行的游戏引擎之一.这是有充分缘由的:Unity有一个让它非常容易上手的强大的可视化编辑器,功能强大,好的社区支持,有吸引力的价格,等等!如果你渴望尝试Unity,没有比这篇教程更适合你的了!在这篇教程中,你会学习如何用Unity创建一个简单的iOS游戏

复杂TableView在iOS上的性能优化

声明:本文翻译自<iOS performance optimization>,原文作者 Khang Vo.翻译本文纯属为了技术交流的目的,并不具有任何的商业性质,也不得利用本文内容进行商业盈利.欢迎转载,但是希望转载的时候加上出处连接,谢谢.译者联系方式 [email protected],如果有 iOS 开发之类的问题,欢迎?一起讨论,谢谢.另,由于本人翻译经验不多,如果翻译不妥或者理解不到位的地方,希望各位朋友海涵,可以发信到上述邮箱,我会及时地根据大家的反馈,对翻译稿做及时地修改,谢谢!

Unity3D for iOS初级教程:Part 3/3(上)

转自:http://www.cnblogs.com/alongu3d/archive/2013/06/01/3111738.html 欢迎来到第三部分,这是Unity 3D for iOS初级系列教程的最后一个部分!在这个系列的第一部分,你参观了基本的Unity工具,创建了带有一个简单角色控制机制的游戏,并且学习了如何部署你的项目到iOS上. 然后在这个系列的第二部分,你增强了你英勇的小方块的移动,并且给这个世界带来一些生命,它拥有了天空,草地和一个起伏的地形. 在第三部分,也是最后一部分,你将

Unity3d 开发之 lua 在 IOS 上坑的总结

相同的 lua 代码在安卓上能正常运行,但在 IOS 上可能不会正常运行而导致报红,崩溃等,我在使用 lua 编程时遇到的一些坑总结如下: 1. File.ReadAllText, 诸如以下代码在 ios 上会崩: local path="C:/1.txt"; local file=luanet.import_type("System.IO.File"); local text=file.ReadAllText(path); 正确写法如下: local path=&

Unity3D在iOS下为啥不能更新的资料收集

几个基本概念 Mono 是什么鬼? Mono是一个.Net工具,包括c#编译器和共通语言执行平台,可运行在winodws linux mac unix各种平台,其虚拟机包含一个实时编译引擎, Unity3d就是用mono这个东西实现跨平台的估计 CIL(Common Intermediate Language通用中间语言) CIL可以在任何支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中运行,就像.NET是微软对这一标准的实现,Mono则是对C

基于Unity3d 引擎的Android游戏优化(转)

转载源:http://www.manew.com/thread-47240-1-1.html 最近项目进入收尾阶段,之前对项目做了很多优化,mesh合并 ,减少DrawCall和模型骨骼以及物理计算,合并材质球,优化代码等等,在IOS上还好,但是上,试过几款手机,从低端到高端,发现性能还是很差,所以又花了几天来研究摸索,终于把游戏性能搞定.记录下来,留作以后参考. 1. 更新不透明贴图的压缩格式为ETC 4bit,因为android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他

移动web开发问题和优化小结

1.前言 到目前为止,互联网行业里,手机越来越智能化,移动端占有的比例越来越高,尤其实在电商,新闻,广告,游戏领域.用户要求越来越高,网站功能越来越好,效果越来越炫酷,这就要求我们产品质量越来越高,web前端开发而言是一个挑战,是一个难题,也是一个机遇.如何让我们所开发的手机页面能有更好的交互体验,就是这篇文章的主旨:移动web开发问题和优化小结.这个只是我自己在开发的时候知道的坑,如果大家有遇到什么别的坑,欢迎补充,或者觉得我哪里写错了,欢迎指点! 2.Meta标签 页面在手机上显示时,增加这