从我几年的图形编程经验来看,我学到的一件事是你永远不应该将对图形上下文的引用传递给一个对象,并在程序的持续时间内对它进行操作(JOGL明确指出这一点) )。当诸如图形设备(GPU)之类的东西被重置,关闭或者发生一些其他奇怪的事情时,上下文可能无效。 我最近已经深入研究了XNA 4.0中的编程,我的一个项目涉及需要了解窗口/视口大小的对象,调整窗口大小时以及动态缓冲区丢失内容时(需要缓冲区)在可能无效的GraphicsDevice上重建)。我没有将GraphicsDevice和GameWindow传递给更新阶段或Disposal中的众多方法,而是选择将它们传递给构造函数。例如:
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 :(得分:0)
我通过将游戏作为单例运行来解决当前游戏项目中的这个问题,这使得它可以在命名空间内的静态上下文中使用。 Game.Instance.graphicsDevice
将始终指向当前图形设备对象,即使上下文已更改。当上下文无效/更改/重置/等时,XNA会引发各种事件,您可以通过挂钩这些事件来重新加载/重新渲染事物并根据需要调整缓冲区大小。
或者,您可以使用GraphicsDevice
关键字传递ref
,这可能是一个快速的插入式修补程序,只需与原始调用方相同的引用,假设调用者实例化了您的对象要么具有原始参考对象,要么将GraphicsDevice
传递给ref
。