• JP Lee

unity3D Ver5 engine structure


UNITY3D Ver5 除了compile以外的其它工作


Analyzing to Individually of script.

把Individually of Component 的函数信息 Recording to information

  • 为了实现这一步骤需使用REFLECTION(不是程序设计专业术语反射的意思)

将记录到的信息记录到Lookup Table中

Lookup Table的组成

• Key : String.(字符串)

• Value : function Pointer.(函数指针)

• Static function(静态函数)类外

Reserve function(reserve函数)


Unity3D特有的Functions.

Reserve function(reserve函数)的类型


除了Awake,Start , OnEnable , OnDisable , LateUpdate , FixedUpdate , OnRenderObject , OnDrawGizmos , OnDestroy , OnAudioFilterRead , OnGUI , OnRenderingImage外的其它内部函数


reserve函数中有几个Function应该再次测试

  • Update不能调用Coroutine

  • OnEnable不能调用Coroutine

分两步执行

这样定义的函数DB可以广泛应用

  • SendMessage(函数名)

  • Invoke(函数名)

  • StartCoroutine(函数名)

因为DB是提前定义好的,可以马上获取函数指针。


Unity3D engine Structures abut scripts.


Script object

为了内存分区(memory allocation),创建heap block。

Heap枯竭,Garbage collector开始工作。

如果需要更多内存(memory)的话,就需要创建更多的heap block。

新增的heap block可以再次缩小。但是Fragmentation effect严重的话,有可能就不能再创建更多的heap block了。

A. Fragmentation :小的内存分区(memory allocation)经常会出现的情况



B. 建议方法

① 一次性创建一个大的memory进行循环使用

• Object pool system build是必需的

② 与Class相比,推荐使用Structure

• Class是heap区的,Structure是stack区的

③ 禁止使用OnGUI函数

• Immediate Mode的问题

Native Object Wrapper

管理Native Object的Script class.

一个Class管理多个Native Memory



两种架构的问题

清理Script Memory– Garbage Collector

释放Native Memory 의 해제 – Finalizer

以上两个Memory各自独立运作


手动清理memory的方法

手动的Garbage collector

System.GC.Collet();

手动的Finalizer

Idisposable.Dispose();



UNITY NATIVE SYSTEM : C++

Asset data

Texture , Mesh , Audio , Animation…

Object

Game Objects

Assets Bundle

Components


Asset Bundle的工作

AssetBundle ab = www.assetBundle;

Texture2D tex = ab.Load(“myTex” , typeof(Texture2D));

Asset Bundle的清理

ab.Unload(false);

www.Dispose( );

System.GC.Collect( );

UnloadUnusedAssets( );



Conclusion

为了更好的使用Unity3d,希望使用者能掌握Unity3d内部引擎的工作原理和Mono的工作原理。

不要依赖自动内存(memory)管理。

Rendering Loop

渲染循环的运作(渲染循环是如何运作的)

每一个组件里都存在着很多的Manager。

Script全部由Behavior Manager管理。

渲染循环中各Manager按下面的顺序工作。



物理循环的伪代码

Float time = GetCurrentTime( );

While(fixedTime < time)

{

fixedTime +=fixedDeltaTime;

进行物理插值

Audio更新

调用FixedUpdate函数

处理动画

更新 Physics Manager

Coroutine处理

}

总结

  • 和注释不同,初始化时最好不要用Start函数

  • 初始化时最好用Awake函数

  • 建议在使用Object Pooling时用OnEnable函数

关闭后再开启特定的组件可以提高performance

조회 25회

© 2014 by LEEGOONZ HOME.