找回密码
 立即注册
楼主: 强子

[测试优化] Unity3D开发iphone如何将资源优化到最小?

[复制链接]
发表于 2013-2-14 12:43 | 显示全部楼层 |阅读模式
Unity3D是一款优秀的3D游戏引擎,支持iPhone游戏开发。但是由于硬件限制,如果不进行优化,有时开发好的游戏放到真机运行效率是比较低的。以下是一些优化的小技巧:



- 试试把gameobject 一个一个禁用,确定下什么最影响性能



- stats 里面有多少个 Draw calls & 三角形



- 合并网格物体



- 合并材质张数



- 不要用网格碰撞.



- Unity对带动作的模型渲染消耗比较大,如果是静态的不带动作文件的模型渲染不会出现效率问题,但是要确保只绘制屏幕内的东西

 楼主| 发表于 2013-2-14 12:44 | 显示全部楼层
1.将所有音频设置为MP3,在iphone中解码的时候最省资源。
2.以及摄像机的顶点光照
3.unity3d自带的quality setting 质量优化设置
4.光照剔除优化  光照烘焙优化 建模中多边形数减少优化
5.内存池的核心思想就是在游戏进行中经常重复出现的物体不要用Instantiate和Destroy来生成和销毁(尤其在处理子弹的时候,会特别的卡),而是用GameObject.active = true/false来激活或者隐藏物体。
你可以在游戏初始化的时候用Instantiate来生成所有你需要的物体,然后隐藏(GameObject.active = false),在需要的时候再激活他们(GameObject.active = true)就行了。
http://unity3d.com/support/docum ... ternalProfiler.html
 楼主| 发表于 2013-2-14 12:44 | 显示全部楼层
优化心得   

第一个3D游戏开始优化. 写一点心得, 留作备份.  为什么写在论坛里. 因为我做优化的时候没搜到, 所以分享一下.

2011.5.1
1. 测试时候注意看Stats很重要, drawCalls 上限35(具体怎么降低DrawCalls,请自己搜搜)

1.1. V大说可以用GUI插件把所有gui的drawCall整合成1次, 还没问具体怎么办.  

2. Batched越高越好, 整合渲染,

2.1. 具体还不知道怎么搞

3. 灯光能不用就不用, 阴影用个面代替, 投射阴影和实时灯光,简直就是frameKller.

4. 模型尽量减少面. 这个和drawCall相辅相成. 我上个游戏满屏只有400面, drawCalls都干到快90了,还一样能跑到30帧在真机上. 当然没有复杂的运动是另个方面.

5. 模型尽量不要分开, 比如我现在坦克游戏, 车身和履带是分开的, 分别都是一次drawCalls,(打英文太烦了,以后drawCall 翻译为"绘图调用") 做到一起,就是一次

5.1. 用CombineInstance似乎也能实现, 还没细研究.

6. http://www.unifycommunity.com/wi ... e_Optimization_Tips     这个地址说了很多实用技巧, 总结如下:

6.1. 别用ragdoll, 我没用过,似乎是纸娃娃系统

6.2. 骨骼很重要, 暂时没用过

6.3. 最终输出的时候,在unity - edit - project setting - player 里, 把 other settings - script call optimization 改成 快速, 但没有例外. fast but no exceptions

6.4. 注意音乐设置,暂时没用过

6.5. unity - edit - project setting - time 里, 把 maximum allowed timestep 改成0.1

6.6 绘图调用次数保持20. 估计帖子比较老

6.7 一些脚本的优化手段,自己去看把, 写的了代码,看不懂英文,可以自 杀了.

7. http://wg2009perfect.blog.163.co ... 663201071534837653/   整合技巧, 看看不错

8. 整合模型, 在max里和程序里都可以
 楼主| 发表于 2013-2-14 12:45 | 显示全部楼层
unity特性
我如何使用触摸屏和加速度计?
答:在scripting reference中,你会找到一些iPhoneInput类,还有iPhoneSettings和其他一些。这些新增的iPhone类负责钩起设备指定功能。

难道iPhone支持unity的地形引擎?
答:在unity iPhone中目前不支持地形。在iPhone上您需要绘制low poly地形。地形系统没有这个功能,所以使用low poly是更好的选择。

我现有的粒子系统运行在iPhone上时很慢。我应该怎么办?
答: iPhone拥有相对较低的fillrate 。如果您的粒子效果覆盖大部分的屏幕,而且是multiple layers的-这样即使最简单的shader,也能让iphone傻眼。我们建议把您的粒子效果baking成纹理序列图。然后在运行时可以使用1-2个粒子,通过动画纹理来显示它们。这种方式可以取得很好的效果,以最小的代价。

我是否可以在游戏中,使用复杂的物理仿真?
答:iPhone运算物理仿真代价很高,我们建议您尽可能少使用它们。物理需要做很多浮点数运算不适合iPhone的ARM处理器。如有可能,完全避免使用MeshColliders,但必要时它们是可用的。要提高性能,使用一个低的固定帧率在 Edit“Time”->"Fixed delta Time"。建议控制在10-30。在降低物理帧速率的同时,可以使用刚体插值以实现平滑的动作效果。为了实现完全流畅的帧率而不卡机,最好是选择Fixed deltaTime value base,使您的游戏在iPhone上获得一个平均的帧率 。建议要么1:1或一半的帧速率。例如,如果您获得每秒30张,您应该使用15或30 fps为物理固定刷新率( 0.033或0.066 )

使用UnityGUI的考虑
使用UnityGUI将会对我的游戏性能产生什么影响吗?
答: 当有许多交互控制时,UnityGUI的使用代价是相当昂贵的,。理想的方法是限制使用UnityGUI游戏菜单,或在游戏运行中尽量少用GUI控制。重要的是要注意,每个对象脚本的OnGUI ( )调用将需要更多的处理器时间,即使它是一个空OnGUI ( )块。最好的方法是禁止此脚本调用GUI元件,如果它没有使用。为此,您可以标记脚本为Enabled=false。

UnityGUI 有没有其他的使用技巧?
尽可能少尝试使用GUILayout。如果您的GUILayout不是都从一个OnGUI调用,您可以停用所有GUILayout渲染使用MonoBehaviour.useGUILayout =false;这能双倍提高GUI图形渲染性能。最后,尽量少用GUI元件,在绘制三维场景的同时。

设备的图形性能
什么是网格量化?
答:在iPhone中内存带宽是另一个宝贵的资源,(因为CPU和GPU需要共享带宽) 。 iPhone支持32 ,16和8bit类型的vertex components。量化网格图形数据到这些指定类型,可以尽量压缩顶点数据尺寸(鉴于它可以容忍一些用户指定错误)。由于访问数据量的减少,可以提高性能。

我可以在iphone上使用bumpmapped 吗?
答: iPhone拥有介于TNT2和GeForce1之间的片段处理能力。它可以加或乘两个纹理在一起,但法线贴图只能歇菜。

基本的顶点计数原则是什么?
答:为了实现每秒30张在iPhone上,你应该让每帧顶点计数明显低于7000个。每个场景顶点数量则没有限制。只要您确保不超过7000个顶点在同一可见画面中,就能保证unity的高帧率。使用新的遮挡筛选功能,可以确保只有7000顶点可见。

Xcode
我收到了很多编译错误Xcode 。这是怎么回事?
答:请确认您选择了“Device”模式,而不是“simulator”。

有时,当我点击“Build and go” ,我看到奇怪的错误。
答:这是一个Xcode的Bug ,并且不破坏您的项目。只要按一下确定以绕过消息,您的游戏应该功能完全正常。

我该如何设定我的应用程序图标在iphone主页屏幕?
答:你需要从Xcode中处理这个 。有一些简单的步骤如下:

创建您的57x57像素png图像。
将其命名为“ Icon.png ” ,并将其放置在Xcode项目的根目录
在Xcode ,右键单击该项目文件中“Group&File”
选择Add...->Existing files并添加您的图片。
找到Info.plist在Xcode ,双击它
改变“Icon file”属性值为“ Icon.png ”

如何设置启动画面为我的应用(只支持unity iPhone专业版)
答:你需要在Xcode中实现 。有一些简单的步骤如下:

创建一个320x480像素的png图片
其命名为“ Default.png ” ,并将其放置在Xcode项目的根目录
在Xcode ,右键单击该项目文件中“Group&File”
选Add...->Existing Files并添加您的图片。
摘自互联网--
 楼主| 发表于 2013-2-14 12:45 | 显示全部楼层
Unity3d的Iphone开发代码优化注意事项
1、        ArrayList的对象在使用时应该注意以下事项
使用
arraylen = myarray. length;
for (i=0; i< arraylen; i++)
{
}
避免
for (i=0; i<myarray.length; i++) {
}

2、        少用临时变量
使用
var touch:Vector2;

function Update(){
if (count==0) { touch=iPhone.GeTouch(0).position;}
}
避免
function Update(){
if (count==0) {
var touch:Vector2=iPhone.GeTouch(0).position;
}
}

3、        少用算数符号/,改为乘以相应小数
使用
x * 0.5f
避免
x/2

4、        动作和AI不需要每帧都执行
if (GLO.count%3){
// execute the enemy aim at your player every 3 Update
}
if (GLO.count%5){
// execute player IA every 5 Update
}

5、        Mesh部分
原文:
- do not use several materials for one mesh. I got the problem with a little model that had 2 materials. It was taking 2 time more polys! When i removed one material, it was showing at half his the size. I don't know why. Usually each material = 1 draw call, so use texture atlas!
个人译文:
-对于一个mesh不要使用多张materials。我遇到过这样的问题是一个小模型拥有2张materials导致了2倍甚至更多的时间!而当我减少一个material的时候,时间减少了一半。

原文
- Use polygon cruncher to lower your mesh polys but even if your mesh look a little square, you can compensate this by tweaking "smoothing angle" in the importer inspector. For a highly optimized mesh, change the smoothing angle to 80 or even 120 and you mesh will look more smooth even with just a few polygons.
个人译文:
使用多边形粉碎机降低你mesh的面熟,但是虽然你的mesh看起来像一个正方形。你可以通过调整在导入区的” smoothing angle”选项来进行补偿。对于一个高优化的mesh,调整平滑角度到80甚至120度,你的mesh将看起来很配合虽然只是一点点的数量(???)

原文
- try not to use any expensive arithmetic like sin() or cos(). instead fill an array with precalculated values with x=0 to 360) sin(x) and cos(x) and use the values of this table. Of course it is in the case of you don't need precision.
个人译文
不要尝试使用任何昂贵消耗的数学公式,例如sin() 或 cos(),用预定义好的0到360度的sin(x)和cos(x)的值组成链表来替代。当然了前提是你不需要太精确。

原文
- force integer when possible. If you have a counter or check the position on the screen, declare the variable as INT, they are faster.
个人译文
尽可能的使用整形。如果你有一个检测屏幕位置的变量或者一个计数器,定义成整形会更快。















Unity3d的一些小窍门
1、防止黑屏
In script change iPhoneSettings.screenCanDarken to false. This basically does the same as:
//Objective-C call [UIApplication sharedApplication].idleTimerDisabled = YES;
It prevents the auto lock on iPhone to kick-in.

发表于 2017-2-18 19:37 | 显示全部楼层
楼主是超人
发表于 2017-2-18 19:16 | 显示全部楼层
真心顶
发表于 2017-2-18 19:34 | 显示全部楼层
难得一见的好帖
发表于 2017-2-18 19:11 | 显示全部楼层
说的非常好
发表于 2017-2-18 18:55 | 显示全部楼层
不错不错
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 13:09 , Processed in 0.071591 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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