之前关于 Godot C# API 在热路径中调用的内存分配问题终于有阶段性成果啦!可以看到 Godot 开发人员对于社区意见的重视,这些大佬真的,我哭死QAQ
之前的讨论详见我翻译的这两篇文章,这次是讨论过后的阶段性成果。
---
考虑到 Unity 转到 Godot 的 C# 开发人员对内存分配这件事真的是太太太重视了,Godot 创始人之一 Juan Linietsky 发布了一个提案用于改善热路径中的内存分配。
热路径 (hot path)是程序非常频繁执行的一系列指令。例如这次主要针对的就是可能在帧函数中大量调用的 API
提案中提到的内存分配(memory allocation)是指被 C# 运行时托管的变量在创建时会进行内存的分配,这些变量因为是被托管的,所以是由 C# 的 GC(垃圾回收)机制自动回收的。这些回收的时机对于开发者来说,相对不可预知,所以就可能出现在帧函数调用期间出现被大量回收导致卡顿。因此在 Unity 使用 C# 的开发者中会极力避免在热路径中出现内存分配。
虽然原本 Godot 系统中设计的动态变量类型规避了大量内存开辟的问题,但是作为引擎核心的 C++ 部分和 C# API 部分传递变量时不可避免还是有少量变量会被分配内存。
对此,Juan Linietsky 的意见是除了原来的 api 外,对涉及热路径的,再生成一套保证一定不会出现内存分配的 api,这些 api 会把引擎核心中 C++ api 生成的变量通过 NoAlloc 的方式直接转移到 C# 中,这样就不会出现新变量和拷贝了。
游戏开发者到时就会有两种选择:
一、不看重内存分配问题的就使用原 api,得到的变量和官方 C# 那些一摸一样(Array、Collection、Dictionary什么的),不用关心什么奇怪的变量类型;
二、看重内存分配问题的就使用新 api,虽然会用一些Godot 创造的方言类型(Godot.SetArray巴拉巴拉的),但是性能会拉满。
提案底下几位开发者还在讨论具体的实现方法,要看明白需要对 C# 和 C++ 都比较了解,我实在是菜看不太懂就没法翻译了……感兴趣可以自己去围观!
https://github.com/godotengine/godot-proposals/issues/7842
祝开源社区越来越好!开源万岁!
暂无关于此日志的评论。