游戏优化第二版 (第二章 脚本策略)

简述

本章讲探索性能优化用于下述领域的方式:

  • 访问组件
  • 组件回调(Update Awake等)
  • 协程
  • GameObject和Transform的使用
  • 对象间通信
  • 数学计算
  • 场景和预制加载等的反序列化

使用最快的方法获取组件

GetComponent()方法有一些变体,他们的性能消耗不同,因此要谨慎地调用该方法的最高效版本。3个可用的重载版本GetComponent(string), GetComponent<T>()和GetComponent(typeof(T)).最好使用的是

 GetComponent<T>()

移除空的回调定义

最常使用的四个回调:Awake(),Start().Update().FixedUpdate().
如果没有用到,一定要记得去掉空调用

缓存组件的引用

这个也没有什么好说的,基本就是关于GetConmponet的调用,如果频繁,最好有一个全局变量进行引用。

这个其实很重要, 尤其是在lua中,使用也很频繁,要学会用local来替代多个.的调用。

local toolList = DataCenter.jibanData:giftToolList();

共享计算输出

每次执行复杂的操作时候,要考虑是否从多个位置调用它,但总是得到相同的输出。简单来说,是否需要重复调用。

Update、Coroutines、InvokeRepeating

如果不是频繁调用,推荐后面两个,节省更多性能,其中最后一个更好

InvokeRepeating的停用方法是在给定的monoBehavior中调用cancelInvoke(),另一种方法是销毁对应的物体,注意不是禁用

using UnityEngine;
using System.Collections;

public class DelayScript : MonoBehaviour {
    //当前时间
    private float nowTime;
    //执行重复方法的次数
    private int count;
    // Use this for initialization
    void Start () {
        nowTime = Time.time;
        Debug.Log("时间点:"+nowTime);
        this.Invoke("setTimeOut", 3.0f);
        this.InvokeRepeating("setInterval", 2.0f, 1.0f);
    }

    private void setTimeOut()
    {
        nowTime = Time.time;
        Debug.Log("执行延时方法:" + nowTime);
    }

    private void setInterval()
    {
        nowTime = Time.time;
        Debug.Log("执行重复方法:" + nowTime);
        count += 1;
        if(count==5)
            this.CancelInvoke();
    }
}

更快的空引用检查

这个倒是挺稀奇的,之前没有考虑过
以前:

if(gameObject != null){
}

现在:

if(!System.Object.ReferenceEquals(gameObject,null)){
}

避免从GameObject中去除字符串属性

通常不要用.name 进行比较,考虑用tag,而对于tag的比较,要考虑GameObject提供的CompareTag(),这个不会额外占用内存

使用合适的数据结构

这个到没啥,就是列表和字典的区别,即采用顺序存储还是链式存储

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值