Unity 收藏本版 已有9人收藏 +发表新主题
查看: 31919|回复: 4
打印 上一主题 下一主题

[分享] Unity中的优化

[复制链接]

[分享] Unity中的优化

Skyman 发表于 2013-6-29 17:30:44 浏览:  31919 回复:  4 只看该作者 复制链接

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

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

- 合并网格物体

- 合并材质张数

- 不要用网格碰撞.

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

1. 尽量避免每帧处理
比如:
function Update() { DoSomeThing(); }
可改为每5帧处理一次:
function Update() { if(Time.frameCount % 5 == 0) { DoSomeThing(); } }

2. 定时重复处理用 InvokeRepeating 函数实现
比如,启动0.5秒后每隔1秒执行一次 DoSomeThing 函数:
function Start() { InvokeRepeating("DoSomeThing", 0.5, 1.0); }

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

4. 主动回收垃圾
给某个 GameObject 绑上以下的代码:
function Update() { if(Time.frameCount % 50 == 0) { System.GC.Collect(); } }

5. 运行时尽量减少 Tris 和 Draw Calls
预览的时候,可点开 Stats,查看图形渲染的开销情况。特别注意 Tris 和 Draw Calls 这两个参数。
一般来说,要做到:
Tris 保持在 7.5k 以下
Draw Calls 保持在 20 以下

6. 压缩 Mesh
导入 3D 模型之后,在不影响显示效果的前提下,最好打开 Mesh Compression。
Off, Low, Medium, High 这几个选项,可酌情选取。

7. 避免大量使用 Unity 自带的 Sphere 等内建 Mesh
Unity 内建的 Mesh,多边形的数量比较大,如果物体不要求特别圆滑,可导入其他的简单3D模型代替。

8. 优化数学计算
比如,如果可以避免使用浮点型(float),尽量使用整形(int),尽量少用复杂的数学函数比如 Sin 和 Cos 等等。
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部分
-对于一个mesh不要使用多张materials。我遇到过这样的问题是一个小模型拥有2张materials导致了2倍甚至更多的时间!而当我减少一个material的时候,时间减少了一半。

-使用多边形粉碎机降低你mesh的面熟,但是虽然你的mesh看起来像一个正方形。你可以通过调整在导入区的” smoothing angle”选项来进行补偿。对于一个高优化的mesh,调整平滑角度到80甚至120度,你的mesh将看起来很配合虽然只是一点点的数量

-不要尝试使用任何昂贵消耗的数学公式,例如sin() 或 cos(),用预定义好的0到360度的sin(x)和cos(x)的值组成链表来替代。当然了前提是你不需要太精确。

-尽可能的使用整形。如果你有一个检测屏幕位置的变量或者一个计数器,定义成整形会更快。


分享至:
| 1 人收藏
回复

使用道具 举报

该用户从未签到

沙发
777 发表于 2013-7-2 16:14:32 只看该作者
说的好高端   听不懂。 --     
回复 支持 反对

使用道具 举报

该用户从未签到

板凳
Skyman
 楼主|
发表于 2013-7-3 08:22:09 只看该作者
777 发表于 2013-7-2 16:14
说的好高端   听不懂。 --

多做几次开发就懂了
回复 支持 反对

使用道具 举报

爱生活爱AR 该用户已被删除
地板
爱生活爱AR 发表于 2013-7-3 09:02:38 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

该用户从未签到

5#
Skyman
 楼主|
发表于 2013-7-3 09:41:22 只看该作者
爱生活爱AR 发表于 2013-7-3 09:02
哈哈,路过,看看,网格碰撞和物体数太TM占资源了,测试过!学学其它的,每次用的是PAD4,都没考虑过其它问 ...

千万不要用安卓千万不要用安卓千万不要用安卓
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

超级版主

Copyright © 2013-2017 ARinChina-增强现实中国技术论坛   All Rights Reserved.