找回密码
 立即注册
查看: 4070|回复: 49

[优化测试] Unity3D IOS优化技巧总结

[复制链接]
发表于 2012-12-30 21:27 | 显示全部楼层 |阅读模式
资源信息 Tutorial Information
教程名称: Unity3D IOS优化技巧总结(发帖教程)
适用引擎:   (适用引擎,为空默认为Unity)
教程语种: 中文
教程等级: 1
教程格式: 图文(请用IE9以上浏览器访问本版块)
教程作者: 转载自互联网 (如有问题请短消息联系作者或发表回复)
下载地址: (兑换积分)
点击查看原图
美丽分割线
1.做减法大量代码在Update()或FixedUpdate()中做处理,意味着无论代码的执行速度如何,都将在每次帧刷新的时候调用到,
public class MyHoming : MonoBehaviour {
public void Update() {
  // expensive targetting and not so expensive trajectory calculations in here
  // currently called every frame
}
}

但是大多数时候我们并不用这样做,考虑使用下面的方法
public class MyHoming : MonoBehaviour {
public float targettingFrequency = 1.2f;
public float trajectoryFrequency = 0.2f;
public float trajectoryBlend = 1.0f;
private Vector3 updatedTrajectory = Vector3.zero;
private Vector3 currentTrajectory = Vector3.zero;

public void Start()
{
  InvokeRepeating("DoTargetting", targettingFrequency*Random.value, targettingFrequency);
  InvokeRepeating("DoTrajectory", trajectoryFrequency*Random.value, trajectoryFrequency);
  DoTargetting();
  DoTrajectory();
}

public void DoTargetting() {
  // search for targets here, we don't do it often because it's expensive
}

public void DoTrajectory() {
  // trajectory isn't as expensive but it's not something we need to do every frame
}

public void Update() {
  // Just interpolate values each frame
  currentTrajectory = SetTrajectory(Vector3.Lerp(currentTrajectory, updatedTrajectory, Time.DeltaTime*trajectoryBlend);
}
}
}

它看上去更复杂一些,其实不然.只有在必要的时候才会执行代码.

2.强制指定垃圾回收的频率
using UnityEngine;
class GarbageCollectManager : MonoBehaviour {
public int frameFreq = 30;
void Update() {
  if (Time.frameCount % frameFreq == 0)
   System.GC.Collect();
}
}

这个操作不会改进你的fps,但是会降低内存的使用量.
(主要针对Hashtable, Array之类C#的数据类型,只是对于GameObject这类UnityEngine的类型无效。)

3.三角形和绘图函数的调用计数
保持三角形低于7500
保持Draw Call 低于20
可能的话使用XCODE中的工具instruments来调试图形性能.

cratesmith Link
cocoachina Link

使用Strict
在你所有脚本的顶部使用 #pragma ,脚本将是强类型的,避免写代码的时候错误的类型赋值.

避免Object.Instantiate() 和 Object.Destroy()
Instantiating 和 Destroying 都不好,因为他们需要在创建和销毁对象的时候动态的分配内存,这样会短暂的影响到性能.
考虑的代替方案是使用他写的SpawnManager类.它在游戏一开始就初始化所有的对象,这样能在游戏载入的时候一同载入对象,从而让人感觉不到影响.禁用对象的时候也保持在内存中,当需要他们的时候只需要在启用就行.
(重点在于这个SpawnManager class 似乎没有公开,不知谁看到过)

Cache Component Lookups
不要总查找component,做必要的缓存.

Use iTween Sparingly
谨慎使用itween,实例化一个itween组件,将有component查找,销毁.这些都影响性能,最糟糕的是大量的垃圾回收。

Avoid SetActiveRecursively()
避免setActiveRecursively(),

Use Builtin Arrays
使用u3d的array

Avoid String Comparison
避免string比较,例如if(collision.gameObject.tag=="Cliffs")  尽量使用if(collision.gameObject.layer==9)

Avoid Vector3.magnitude & Vector3.Distance()
避免平方根计算,比较距离尽可能使用Vector3.sqrMagnitude
toxicblod Link


本帖子中包含更多资源

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

×
发表于 2013-6-9 00:58 | 显示全部楼层
我有spawnmanager的代码,楼主要不?

点评

Spinach, 你可以发一份 spawnmanager的代码给我么?感激不尽, , 我的邮箱  详情 回复 发表于 2013-9-28 09:04
发表于 2013-8-8 18:46 | 显示全部楼层
感谢楼主无私奉献
发表于 2013-9-28 09:04 | 显示全部楼层
Spinach 发表于 2013-6-9 00:58
我有spawnmanager的代码,楼主要不?

Spinach, 你可以发一份 spawnmanager的代码给我么?感激不尽, 591179431@qq.com, 我的邮箱
发表于 2016-8-30 22:51 | 显示全部楼层
非常好非常好非常好非常好非常好非常好
发表于 2017-2-12 12:06 | 显示全部楼层
楼主是超人
发表于 2017-2-12 12:07 | 显示全部楼层
顶顶多好
发表于 2017-2-12 12:55 | 显示全部楼层
难得一见的好帖
发表于 2017-2-12 12:04 | 显示全部楼层
说的非常好
发表于 2017-2-12 12:11 | 显示全部楼层
LZ真是人才
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 16:56 , Processed in 0.117013 second(s), 36 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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