繁体   English   中英

C# MonoGame 内存管理

[英]C# MonoGame Memory Management

我来自 C/C++ 背景,正在学习 C#。 我在网上找到了这个例子。

KeyboardState state = Keyboard.GetState();​​​​​​​​

...​​​​

previousState = state;

乍一看,这似乎不是最谨慎的做法。 我把它改成这样:

Array.Clear(pressedKeys, 0, 103);

Array.Copy(Keyboard.GetState().GetPressedKeys(), pressedKeys, Keyboard.GetState().GetPressedKeys().Length);

...

Array.Clear(prevKeys, 0, 103);

Array.Copy(pressedKeys, prevKeys, pressedKeys.Length);

但后来我又看了一遍原始代码,现在我很困惑。 对我来说,最初看起来我的方式更好,因为我认为我没有留下分配的内存空间,但似乎 Keyboard.GetState() 创建了一个新的状态对象,而不是仅仅返回对其自己成员的引用,如每个游戏循环都必须调用它(我对此进行了测试)。 因此,如果是这种情况,无论哪种方式都会留下一个未引用的键盘状态对象供垃圾收集器清理:示例中的 previousState 对象,以及在我的第一个 Array.Copy() 的函数调用中返回的对象。 如果是这样的话,我的会稍微糟糕一些,因为它持有两个额外的数组并对它们执行额外的操作。 这是必然的吗? 或者我不知道我在说什么?

KeyboardState 是一个结构体。 它在堆栈上分配并按值复制,因此不涉及 GC,除非您以某种方式将它装箱到托管堆中。

以最自然的方式(第一种方式)编写代码,然后在您拥有实际显示存在瓶颈的分析数据时优化瓶颈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM