Unity内存优化技术测试案例

原创 2017年07月13日 15:36:27

笔者介绍:姜雪伟,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内存优化经验分享

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...
  • jxw167
  • jxw167
  • 2017年01月08日 12:55
  • 1446

U3D内存优化之(四)

Unity开发者的C#内存管理(中篇) 第一篇介绍了在 .NET/Mono 和Unity里内存管理的基础,并且提供了一些避...
  • ywjun0919
  • ywjun0919
  • 2016年02月18日 19:25
  • 3499

Unity性能优化(主要是内存的优化)

Unity手游的性能优化过程更像是一门时空转换的艺术, 持续在CPU和内存之间取得一个平衡。空间不足时则需要释放一些无用数据,以获得更优的空间使用率;时间太长时就需要降低不必要的函数开销。以下是腾讯游...
  • u010377179
  • u010377179
  • 2016年10月25日 15:17
  • 2493

自动化回归测试案例评价标准 MeRest

自动化回归测试案例评价标准试图定义不同维度来评价自动化案例的优劣,作为后续我们评判讨论测试框架、测试技术和测试案例编写模式的基础。那什么是好的自动化回归测试案例呢?简而言之,就是投资回报率高的案例,因...
  • adwu73
  • adwu73
  • 2013年08月09日 18:48
  • 9345

Unity性能优化之内存篇(上)

项目的性能优化主要围绕CPU、GPU和内存三大方面进行。接上期CPU优化专讲,我们本期和大家分享内存方面的优化心得。 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重。 然而,在我们测评过...
  • UWA4D
  • UWA4D
  • 2016年12月14日 18:45
  • 5044

Unity内存优化方案集合

https://github.com/mc-gulu/dev-awesomenesses/blob/master/unity-gc-cheatsheet-references.md ...
  • wxlguitar
  • wxlguitar
  • 2017年09月07日 10:42
  • 96

Unity笔记 资源加载 内存优化

unity本机堆(Native Heap)
  • fjl2007
  • fjl2007
  • 2015年07月15日 13:55
  • 689

Unity关于对象池

[译]Unity3D内存管理——对象池(Object Pool) 原文地址:C# Memory Management for Unity Developers (part 3 of 3), ...
  • cxihu
  • cxihu
  • 2016年09月09日 11:29
  • 602

Unity3d 如何优化内存

前言:一提到内存这个东西我相信很多做技术的都头大,我也不例外,如何平衡内存值和手游的表现真的是需要去反反复复去琢磨的。下面记录下我们游戏的内存优化以及一些技巧 首先我们需要一个目标,也就是我们需要把我...
  • pdw_jsp
  • pdw_jsp
  • 2017年04月01日 17:46
  • 692

【Unity】内存优化

1.压缩自带类库; 2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉; 3.释放AssetBundle占用的资源;AssetBundle资源包; 4.降低模型的片面数,降低模型的...
  • chenxuezhi123
  • chenxuezhi123
  • 2015年04月27日 11:34
  • 472
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity内存优化技术测试案例
举报原因:
原因补充:

(最多只允许输入30个字)