问题描述
我来自C / C ++,并且正在学习C#。我在网上找到了这个例子。
KeyboardState state = Keyboard.GetState();
...
prevIoUsstate = state;
乍一看,这似乎不是最谨慎的方法。我将其更改为:
Array.Clear(pressedKeys,103);
Array.copy(Keyboard.GetState().GetpressedKeys(),pressedKeys,Keyboard.GetState().GetpressedKeys().Length);
...
Array.Clear(prevKeys,103);
Array.copy(pressedKeys,prevKeys,pressedKeys.Length);
但是后来我再次查看了原始代码,现在我很困惑。在我看来,本来看来我的方法更好,因为我认为自己并没有留下分配的内存空间,但是看来Keyboard.GetState()创建了一个新的状态对象,而不仅仅是将引用返回给自己的成员,例如必须在每个游戏循环中调用它(我对此进行了测试)。因此,如果是这种情况,则任何一种方式都将留下一个未引用的键盘状态对象以供垃圾收集器清理:示例中的prevIoUsstate对象,以及在我的第一个Array.copy()函数调用中返回的对象。如果是这样,我的情况会更糟,因为它拥有两个额外的数组并对它们执行额外的操作。一定是这样吗?还是我不知道我在说什么?
解决方法
KeyboardState是一个结构。它是在堆栈上分配并按值复制的,因此不涉及GC,除非您以某种方式将其装箱到托管堆上。
以最自然的方式(第一种方式)编写代码,然后在分析数据时发现瓶颈时优化瓶颈。