【Godot 笔记】既然用 C# 又何必囿于 gdscript? 今日快讯

时间:2023-04-16 16:57:04     来源:哔哩哔哩

之前从 gdscript 转到用 C#,还一直用 gdscript 的写法,自己写的类仍然是继承自 Godot.Object 和 Godot.Reference,数组也只用 Godot.Collections.Array。后来实验发现这不是很好的选择。

1 对比实验

实验的容器有2个,分别是 System.Collections.Generic.List 与 Godot.Collections.Array,容器内装的对象分别继承自 Godot.Object、Godot.Reference 和 System.Object,则排列组合共6种情况。比较的算法框架如下:


(相关资料图)

2 实验结果

2.1 容器为 Godot.Collections.Array

1、容器元素为 Godot.Object

2、容器元素为 Godot.Reference

3、容器元素为 System.Object

报错:

E 0:00:01.738   mono_object_to_variant_impl: Attempted to convert an unmarshallable managed type to Variant. Name: 'NumSysObj' Encoding: 18.

<C++ 错误>      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 )()

不使用内置类型.cs:43 @ void 不使用内置类型.TestGdArraySysObj()()

不使用内置类型.cs:33 @ void 不使用内置类型._Input(Godot.InputEvent )()

2.2 容器为 System.Collections.Generic.List

1、容器元素为 Godot.Object

2、容器元素为 Godot.Reference

3、容器元素为 System.Object

3 结论

System 的 List 与 Godot 的 Array 大体相同,除了 Godot 的 Array 的元素一定要是 Godot 内置的类型。

继承自 Godot.Object 的对象不会垃圾回收,符合预期。

继承自 Godot.Reference 的对象没有如同在 gdscript 里那样马上回收(在 gdscript 中,监视器的 Objects 曲线是水平直线),而且比继承自 System.Object 的对象的回收频率低。在本例中,Godot.Reference 是大概每十余万个对象回收一次,而 System.Object 是大概每4千个对象回收一次。不懂,既然 Godot 是 C++ 写的,那怎么 Reference 到了 C# 就不能马上回收呢?

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

标签:

最新文章推荐