最近聊天的时候聊到了这个话题,身边的人对这个貌似也不是很了解
顺便水篇博客
Godot中的内存管理
首先明确一点,所有的节点的内存生命周期都是由Godot本身管理
无论通过任何语言任何方式编写的代码,所有节点内存的生命周期都是由Godot管理
语言只是通过一些绑定的语法访问其中的功能而已
而节点可以附加脚本,脚本的生存周期可以是额外的
(当然,目前只有GDScript和C#可以作为脚本语言,这里主要讲的也是C#)
也就是说,使用C#脚本,脚本的生存周期是由C#管理的
Godot中的ClassDB
Godot本身有自己的类型系统,通过自己的类型系统实现了跨语言的开发支持
而ClassDB记录了Godot中所有注册的类型
所有注册的类型都有一个APIType的枚举类型,表示类型的来源与作用
- API_CORE:原生核心类型
- API_EDITOR:原生编辑器类型
- API_EXTENSION:GDExtension类型
- API_EDITOR_EXTENSION:GDExtension编辑器类型 原生类型表示Godot自带的,GDExtension类型表示通过GDExtension系统导入的类型
只有ClassDB中的类型,才会被识别为独立的类型
也即只有在ClassDB中的节点类型,才能附加自己的脚本
C#就比较尴尬了
Godot中的[GlobalClass]虽然可以在添加节点界面中添加自己实现的节点
但这只是自动给基类节点附加了脚本而已,没有在ClassDB中注册
要附加新的脚本就必须替换原有的脚本,通过类型继承的方式添加新的行为
所以目前其实C#在Godot的地位有点尴尬,论易用性不如GDScript,论扩展性不如直接使用GDExtension系统
GDScript可以通过内置的ClassDB信息给到LSP,可以很方便的调用内置类型与GDExtension类型
直接使用GDExtesion系统就相当于直接给Godot写插件,可以控制的东西更多且具有与内置类型同等地位
由于C#是静态类型语言,导致必须通过一些绑定的语法操作类型
但目前Godot社区还没有统一的为GDExtension生成绑定代码的方案