【Godot 筆記】既然用 C# 又何必囿于 gdscript?
????????之前從 gdscript 轉(zhuǎn)到用 C#,還一直用 gdscript 的寫法,自己寫的類仍然是繼承自 Godot.Object 和 Godot.Reference,數(shù)組也只用 Godot.Collections.Array。后來(lái)實(shí)驗(yàn)發(fā)現(xiàn)這不是很好的選擇。
1 對(duì)比實(shí)驗(yàn)
????????實(shí)驗(yàn)的容器有2個(gè),分別是 System.Collections.Generic.List 與 Godot.Collections.Array,容器內(nèi)裝的對(duì)象分別繼承自 Godot.Object、Godot.Reference 和 System.Object,則排列組合共6種情況。比較的算法框架如下:
2 實(shí)驗(yàn)結(jié)果
2.1 容器為 Godot.Collections.Array
1、容器元素為 Godot.Object

2、容器元素為 Godot.Reference

3、容器元素為 System.Object
報(bào)錯(cuò):
E 0:00:01.738 ? mono_object_to_variant_impl: Attempted to convert an unmarshallable managed type to Variant. Name: 'NumSysObj' Encoding: 18.
? <C++ 錯(cuò)誤> ? ? ?Method failed. Returning: Variant()
? <C++ 源文件> ? ? modules/mono/mono_gd/gd_mono_marshal.cpp:1124 @ mono_object_to_variant_impl()
? <棧追蹤> ? ? ? ? :0 @ Int32 Godot.Collections.Array.godot_icall_Array_Add(IntPtr , System.Object )()
? ? ? ? ? ? ? ? Array.cs:173 @ Int32 Godot.Collections.Array.Add(System.Object )()
? ? ? ? ? ? ? ? Array.cs:531 @ void Godot.Collections.Array`1[[NumSysObj, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].Add(NumSysObj )()
? ? ? ? ? ? ? ? 不使用內(nèi)置類型.cs:43 @ void 不使用內(nèi)置類型.TestGdArraySysObj()()
? ? ? ? ? ? ? ? 不使用內(nèi)置類型.cs:33 @ void 不使用內(nèi)置類型._Input(Godot.InputEvent )()
2.2 容器為 System.Collections.Generic.List
1、容器元素為 Godot.Object

2、容器元素為 Godot.Reference

3、容器元素為 System.Object

3 結(jié)論
? ? ? ? System 的 List 與 Godot 的 Array 大體相同,除了 Godot 的 Array 的元素一定要是 Godot 內(nèi)置的類型。
????????繼承自 Godot.Object 的對(duì)象不會(huì)垃圾回收,符合預(yù)期。
????????繼承自 Godot.Reference 的對(duì)象沒(méi)有如同在 gdscript 里那樣馬上回收(在 gdscript 中,監(jiān)視器的 Objects 曲線是水平直線),而且比繼承自 System.Object 的對(duì)象的回收頻率低。在本例中,Godot.Reference 是大概每十余萬(wàn)個(gè)對(duì)象回收一次,而 System.Object 是大概每4千個(gè)對(duì)象回收一次。不懂,既然 Godot 是 C++ 寫的,那怎么 Reference 到了 C# 就不能馬上回收呢?

????????所以用 C# 就不必用 Godot.Reference 和 Godot 的 Array 了。既然用了 C# 又何必囿于 gdscript?