笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN视频网址:http://edu.csdn.net/lecturer/144

Unity引擎优化技术,无非涉及到三点:CPU优化,GPU优化,内存优化。

先谈谈内存优化:大概可以分成三大部分:

1、 Unity3D内部的内存

2、 Mono的托管内存

3、 引入的DLL或者第三方DLL所需要的内存。

其中Unity3D内部的内存包括如下:

  • 资源:纹理、网格、音频等等
  • GameObject和各种组件。
  • 引擎内部逻辑需要的内存:渲染器,物理系统,粒子系统等等
   我们接下来通过代码执行的时间方式给读者介绍一下关于组件的使用效率问题,代码如下所示:
using UnityEngine;

public class CachedMB : MonoBehaviour
{

	Transform _transform;
	public Transform transform
	{
		get { return _transform ?? (_transform = base.transform); }
	}

	//for testing
	public Transform uncachedTransform
	{
		get { return base.transform; }
	}

	Rigidbody _rigidbody;
	public Rigidbody rigidbody
	{
		get { return _rigidbody ?? (_rigidbody = base.GetComponent<Rigidbody>()); }
	}

	Camera _camera;
	public Camera camera
	{
		get { return _camera ?? (_camera = base.GetComponent<Camera>()); }
	}

	Light _light;
	public Light light
	{
		get { return _light ?? (_light = base.GetComponent<Light>()); }
	}

	private Animation _animation;
	public Animation animation
	{
		get { return _animation ?? (_animation = base.GetComponent<Animation>()); }
	}

	private ConstantForce _constantForce;
	public ConstantForce constantForce
	{
		get { return _constantForce ?? (_constantForce = base.GetComponent<ConstantForce>()); }
	}

	private Renderer _renderer;
	public Renderer renderer
	{
		get { return _renderer ?? (_renderer = base.GetComponent<Renderer>()); }
	}

	private AudioSource _audio;
	public AudioSource audio
	{
		get { return _audio ?? (_audio = base.GetComponent<AudioSource>()); }
	}

	private GUIText _guiText;
	public GUIText guiText
	{
		get { return _guiText ?? (_guiText = base.GetComponent<GUIText>()); }
	}

	private GUITexture _guiTexture;
	public GUITexture guiTexture
	{
		get { return _guiTexture ?? (_guiTexture = base.GetComponent<GUITexture>()); }
	}

	private NetworkView _networkView;
	public NetworkView networkView
	{
		get { return _networkView ?? (_networkView = base.GetComponent<NetworkView>()); }
	}

	private Collider _collider;
	public Collider collider
	{
		get { return _collider ?? (_collider = base.GetComponent<Collider>()); }
	}

	private HingeJoint _hingeJoint;
	public HingeJoint hingeJoint
	{
		get { return _hingeJoint ?? (_hingeJoint = base.GetComponent<HingeJoint>()); }
	}

	private ParticleEmitter _particleEmitter;
	public ParticleEmitter particleEmitter
	{
		get { return _particleEmitter ?? (_particleEmitter = base.GetComponent<ParticleEmitter>()); }
	}

	private ParticleSystem _particleSystem;
	public ParticleSystem particleSystem
	{
		get { return _particleSystem ?? (_particleSystem = base.GetComponent<ParticleSystem>()); }
	}

	private GameObject _gameObject;
	public GameObject gameObject
	{
		get { return _gameObject ?? (_gameObject = base.gameObject); }
	}

	private string _tag;
	public string tag
	{
		get { return _tag ?? (_tag = base.tag); }
		set { _tag = value; base.tag = value; }
	}

	private string _name;
	public string name
	{
		get { return _name ?? (_name = base.name); }
		set { _tag = value; base.tag = value; }
	}

}

接下来开始写测试代码案例:

using UnityEngine;
using System.Collections;
using System.Diagnostics;
using System.IO;
using System.Collections.Generic;

public class CacheTest : CachedMB
{
	const int ITERATIONS = 1000000;
	// Use this for initialization

	Transform cached;

	IEnumerator Start()
	{
		cached = uncachedTransform;

		for (; ; )
		{
			yield return null;
			if (!Input.GetKeyDown(KeyCode.T)) continue;

			var sw1 = Stopwatch.StartNew();
			{
				Transform trans1;
				for (int i = 0; i < ITERATIONS; i++)
					trans1 = GetComponent<Transform>();
			} sw1.Stop();

			var sw2 = Stopwatch.StartNew();
			{
				Transform trans2;
				for (int i = 0; i < ITERATIONS; i++)
					trans2 = transform;
			} sw2.Stop();

			var sw3 = Stopwatch.StartNew();
			{
				Transform trans3;
				for (int i = 0; i < ITERATIONS; i++)
					trans3 = cached;
			} sw3.Stop();

			var sw4 = Stopwatch.StartNew();
			{
				Transform trans4;
				for (int i = 0; i < ITERATIONS; i++)
					trans4 = uncachedTransform;
			} sw4.Stop();

			UnityEngine.Debug.LogWarning(ITERATIONS + " iterations");
			UnityEngine.Debug.LogWarning("GetComponent " + sw1.ElapsedMilliseconds + "ms");
			UnityEngine.Debug.LogWarning("MonoBehaviour " + sw4.ElapsedMilliseconds + "ms");
			UnityEngine.Debug.LogWarning("CachedMB " + sw2.ElapsedMilliseconds + "ms");
			UnityEngine.Debug.LogWarning("Manual Cache " + sw3.ElapsedMilliseconds + "ms");
		}
	}
}

执行结果如下所示:



通过显示的结果,我们知道,GetComponent是比较耗费时间的,在游戏开发中尤其是在每帧调用中少用。Manual Cache是耗费时间最少的,应该在游戏开发中尽量多用。
  


Unity内存优化技术测试案例的更多相关文章

  1. Unity内存优化

    [Unity内存优化] 1.在Update方法或循环中,少用string类,因为string类的每次操作都会调用new生成新字符串对象.用StringBuilder代替string,StringBui ...

  2. Unity内存优化(贴图层面)

    聊聊近况: 距离上一篇文章已经过了好久,主要原因是我懒了.公司项目也到了开始优化的阶段,上网找的资料,看过了就忘.还是想把它整理一下,写出来.其实我说的东西,网上都有,我只是搬运工而已. 贴图压缩: ...

  3. Unity内存优化之视频讲解

    视频为中文讲解,mp4格式,大小3.05GB 目录   扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主

  4. Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术

    转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...

  5. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

  6. 【Unity技巧】Unity中的优化技术

    http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...

  7. Unity堆内存优化

    unity中减少堆内存分配以减少垃圾回收处理:只有局部变量且为值类值的变量是从stack栈中分配内存,其它所有情况都是从heap堆中分配内在.* 缓存获取到的数据.* 频繁被调用的函数中尽量少的分配空 ...

  8. Unity中的优化技术

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/candycat1992/article/ ...

  9. 【MDCC技术大咖秀】Android内存优化之OOM

    大神分析的很全面,所以就转过来保存一份,转自:http://www.csdn.net/article/2015-09-18/2825737/1 以下为正文: Android的内存优化是性能优化中很重要 ...

随机推荐

  1. 20145313张雪纯 《Java程序设计》第5周学习总结

    20145313张雪纯 <Java程序设计>第5周学习总结 教材学习内容总结 JAVA中所有错误都会被打包成对象,可以用尝试(try)捕捉(catch)代表错误的对象后做一些处理.使用tr ...

  2. [翻译]小提示:使用figure和figcaption元素的正确方式

    figure和figcaption是一对经常被一起使用的语义化标签.如果你还没有看过规范中的定义,现在有机会在你的项目中使用它们了.如果你不知道怎么用,下面是关于如何正确使用它们的一些提示. figu ...

  3. 混合开发的大趋势之一React Native之页面跳转(2)+物理返回+特定平台代码

    转载请注明出处:这里写链接内容 今天是10月份的最后一天,我加了3个月来的第一个班,挤出了这篇. 废话不多先安利,然后继续学习 RN 有好东西都往里面丢,努力做好归纳 https://github.c ...

  4. Spring容器基础ClassPathXmlApplicationContext(一起看源码)

    ApplicationContext相比较于BeanFactory,扩展了很多功能.也就是说前者包含了后者的所有功能.使用前者加载XML的方式:ApplicationContext app=new C ...

  5. Linux 动态链接库包含静态链接库的方法

    今天老司机们在讨论一个编译问题  A是一个静态库  C是一个动态库  B是运行程序,能不能将A打包到C 然后B只需要链接C 就可以了. 这个问题我以前在出来zlib库版本冲突的时候有点印象,所以写了个 ...

  6. 数据结构实习 problem O Huffman Tree

    Huffman Tree 题目描述 对输入的英文大写字母进行统计概率 然后构建哈夫曼树,输出是按照概率降序排序输出Huffman编码. 输入 大写字母个数 n 第一个字母 第二个字母 第三个字母 .. ...

  7. windows组策略屏蔽

    点“IP安全策略,在本地机器”——>创建IP安全策略---->下一步---->名称随便写,如输入阻止,然后一直点下一步,出现提示点是,一直到完成,这个时候就创建了一个名为“阻止”的策 ...

  8. 在Extjs 的 TabPanel在 title标题栏上加按扭button

    如何在tabPanel的 标题栏的右侧添加操作按扭,效果如图,我总结了两种实现的方案: 第一种方案: 使用tabPanel的tabPbar: Ext.define("CisApp.view. ...

  9. ubuntu install git vim Plug manage

    在UBUNTU采用163或是阿里云来更新源,最新的更新源地址可以在网上查阅, 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restric ...

  10. 1.JSON 转换对象失败问题 2.spring注入失效

    今天做项目中将一个json 字符串转换为对象,但结果怎么都转换不了!——————最后发现问题,原来是因为这个类我给他添加了带参数的构造器!导致转换失败! 在添加一个无参的构造器就好了! 第二个:今天调 ...