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