[英]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.