unity优化全攻略(不定期更新)

1.Camera ClearFlags 千万别选 DontClear

2.代码中空的Update也是消耗性能的 应当清理掉

3.在Update使用的东西,能缓存的尽量缓存,不要在Update出现诸如GetComponent的东西

4.能够复用的东西使用类型池
实例化和销毁一个对象通常比停用和重新激活它要昂贵得多,如果对象包含启动代码,例如在Awake()或Start()函数中对GetComponent()的调用,则尤其如此。

5.Transform , Transform.position是一个访问器,频繁使用是有消耗的,如果需要使用建议缓存

6.vector3和vector3的平方根操作影响性能很大,建议将vector3.magnitude 替换成vector3.sqrMagnitude

7.Camera.main 这看起来是一个变量,其实也是一个访问器,内部涉及到find,所以也应该缓存

8.只有不运行的代码才是好代码,在摄像机看不到的地方,我们可以不执行显示相关或者其他不影响游戏的代码.
比如:

private Renderer myRenderer;

void Start()
{
    myRenderer = GetComponent<Renderer>();
}

void Update()
{
    UpdateTransformPosition();

    if (myRenderer.isVisible)
    {
        UpateAnimations();
    }
}

或者使用OnBecameInvisible()和OnBecameVisible()

9.如果可以尽量使用struct 这种数值类型代替class

10. 数组结构的重用,建议建立一个 成员list,作为那些需要临时创建list的函数内部使用,这样可以有效减少GC.

11.C#中的所有方法引用都是引用类型,因此在堆上分配。通过将方法引用作为参数传递,都会临时分配内存。不管传递的方法是匿名方法还是预定义方法,都会进行这种分配。

其次,将匿名方法转换为闭包将大大增加将闭包传递给接收闭包的方法所需的内存量。

闭包过程就是 引用匿名函数外部变量的过程.

12.避免装箱和拆箱,就是,数值类型转换为引用类型,引用类型转换为数值类型

13.字典和枚举.
通常,我们的 new Dictionary<Enum, object>();其实是有问题的, enmu会被装箱和拆箱
在使用add,tryGetValue,remove 等等.
所以我们这么写可以避免装箱和拆箱操作

   public  enum MyEnum { a, b, c };

    public class MyEnumComparer : IEqualityComparer<MyEnum>
    {

        public bool Equals(MyEnum x, MyEnum y)
        {

            return x == y;

        }

        public int GetHashCode(MyEnum x)
        {

            return (int)x;

        }

    }

        MyEnumComparer mycomper = new MyEnumComparer();
        var myDictionary = new Dictionary<MyEnum, object>(mycomper);

14.访问unity自带数组结构时,需要提前提出,避免重复,因为你不知道这个类型到底是不是一个访问器还是什么.安全起见全部提出.
比如

//mesh.vertices将会不断的创建新的副本
for(int i = 0; i < mesh.vertices.Length; i++)

{

//修改成这样就好很多.
var vertices = mesh.vertices;
for(int i = 0; i < vertices.Length; i++)

{


15.对于数组类型的返回时,尽量返回零长数组而不是null,避免之后有余数值为空造成的各种影响.

16.需要携程等待一帧,最好使用 yield return null 代替 yield return 0, 因为0时数值类型会有装箱操作.

17.结构体内如果包含引用类型,GC会检查整个机构体,所以,尽量的,结构体内不要包含引用类型.

18.函数返回的类型最好使用数值类型.

19. 在使用一些需要传入字符串操作的时候其实可以先将字符串转换为ID

//优化前
material.SetColor("_MainColor",Color.White);
animator.SetTrigger("attack")

//优化后,重复使用
static readonly int material_Color = Shader.PropertyToID("_Color")
static readonly int anima_Attack= Animator.StringToHash("attack")

material.SetColor(material_Color ,Color.White);
animator.SetTrigger(anima_Attack)

20. 字符串比较

//性能羸弱的方式 1
string.Equals("a","a");

//性能羸弱的方式 2
String.Compare("a","a") == 0

//性能优越
myString.Equal(otherString,StringComparison.Ordinal)

//StringComparison的其他枚举定义
public enum StringComparison{
CurrentCulture,
CurrentCultureIgnoreCase,
InvariantCulture,
InvariantCultureIgnoreCase,
Ordinal,
OrdinalIgnoreCase
}
//CurrentCulture 使用区域敏感排序规则和当前区域比较字符串。
//CurrentCultureIgnoreCase 使用区域敏感排序规则、当前区域来比较字符串,同时忽略被比较字符串的大小写。
//InvariantCulture 使用区域敏感排序规则和固定区域比较字符串。
//InvariantCultureIgnoreCase 使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写。

//Ordinal 使用序号排序规则比较字符串。

//OrdinalIgnoreCase 使用序号排序规则并忽略被比较字符串的大小写,对字符串进行比较。

21.将 vector3.zero 之类全部做成一个 const 或者 static readonly 将会大大提升效率

22.遍历的时候,将count提出,可以减小访问,起到优化的作用

23.内存紧密排布的结构,比如数组用for来遍历比较好,但是内存散乱的用,foreach比较好

24.在使用RenderTexture的时候,如果你需要频繁的创建,那最好用GetTemporary 释放的时候ReleaseTemporary,unity内部会为我们维护一个内存池, 别忘了释放,不然内存无限叠加.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容