我正在開發一款使用XNA和C#的遊戲,並試圖避免每幀調用new struct()
類型代碼,因爲我認爲它會使GC出奇。 「但是等等,」我對自己說,「struct是一個值類型,那麼GC不應該被調用,對吧?」那麼,這就是我在這裏問的原因。創建值類型時會發生什麼?
我只對value類型會發生什麼非常模糊的想法。如果我在函數調用中創建一個新的結構體,那麼這個結構體是在堆棧上創建的嗎?它是否會被推動並彈出,性能不會受到影響?此外,如果我需要在一次調用中創建多個實例,是否會有一些內存限制或性能影響?
採取的,例如,此代碼:
spriteBatch.Draw(tex, new Rectangle(x, y, width, height), Color.White);
矩形在這種情況下是一個結構。當新的Rectangle被創建時會發生什麼?不得不多次重複這條線的含義是什麼(比如說,成千上萬次)?是否創建了此矩形,將副本發送到Draw方法,然後丟棄(意味着沒有更多的內存被更多的Draw在同一個函數中以這種方式調用)?
P.S.我知道這可能是過時的優化,但我主要是好奇,希望對發生的事情有更好的理解。
如果我反覆調用同一個函數,是否有新的Rectangle將每次調用都推送到Draw,並在Draw返回時彈出? – Bob 2010-03-15 18:31:00
是的,但請記住推動和彈出堆棧幀只是遞增/遞減指針(單個機器指令)。無論如何,JIT編譯器會優化所有的王國。 – thecoop 2010-03-15 18:33:17
@Bob:是的,儘管我猜想理論上可能的是,JIT *可以*看到相同的調用並緩存提交的值多次,但這似乎不太可能,因爲啓發式會涉及到檢測,並且很容易被排除。 – 2010-03-15 18:33:44