2014-03-19 33 views
0

從我幾年圖形編程經驗的,有一件事我學到的是,你不應該在參考傳遞給圖形上下文的對象,並對其進行了程序的時間進行操作(JOGL明確指出這一點)。當圖形設備(GPU)等設備被重置,關閉或其他奇怪的事情發生時,上下文可能會失效。 我最近回顧了XNA 4.0中的編程問題,其中一個項目涉及需要了解窗口/視口大小的對象,窗口大小調整時以及動態緩衝區丟失了其內容(需要緩衝區在可能無效的GraphicsDevice上重建)。我沒有將GraphicsDevice和GameWindow傳遞給更新階段或Disposal中的許多方法,而是選擇將它們傳遞給構造函數。例如:XNA 4的GraphicsDevice

public Camera(GameWindow w, GraphicsDeviceManager m) { 
    // ... Yada-yada matrices 
    gdm = m; 
    window = w; 
    window.ClientSizeChanged += OnWindowResize; 
} 
public void Dispose() { 
    window.ClientSizeChanged -= OnWindowResize; 
    window = null; 
    gdm = null; 
} 
// Control Logic ... 
public void OnWindowResize(object Sender, EventArgs args) { 
    Vector2 s = new Vector2(gdm.GraphicsDevice.Viewport.TitleSafeArea.Width, gdm.GraphicsDevice.Viewport.TitleSafeArea.Height); 
    // Recalculate Projection ... 
} 

它是安全的做這樣的事情,或者是東西,我需要知道的背景下發生的?

回答

0

我在我目前的遊戲項目運行遊戲作爲一個單身,這使得它在命名空間內的靜態上下文可以解決這個問題。即使上下文已更改,Game.Instance.graphicsDevice也將始終指向當前的圖形設備對象。當上下文無效/更改/重置/等時,XNA會引發各種事件,並且您可以通過掛接這些事件來重新加載/重新渲染事件並根據需要調整緩衝區的大小。假設實例化對象的調用方要麼具有原始參考對象,要麼通過ref關鍵字將GraphicsDevice傳遞給ref關鍵字,該關鍵字可能是一個快速的插入修復程序,只需與原始調用方具有相同的引用即可GraphicsDevice也通過ref傳遞給它。