【问题标题】:XNA 4 GraphicsDeviceXNA 4 图形设备
【发布时间】:2014-03-19 22:20:17
【问题描述】:

根据我几年的图形编程经验,我学到的一件事是,您永远不应该将图形上下文的引用传递给对象并在程序执行期间对其进行操作(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 ...
}

这样做是否安全,或者我需要注意在后台发生的事情?

【问题讨论】:

    标签: graphics xna-4.0 dispose


    【解决方案1】:

    我在当前游戏项目中通过将游戏作为单例运行解决了这个问题,这使它在命名空间内的静态上下文中可用。 Game.Instance.graphicsDevice 将始终指向当前图形设备对象,即使上下文已更改。当上下文无效/更改/重置/等时,XNA 会引发各种事件,您可以通过挂钩这些事件根据需要重新加载/重新渲染内容并调整缓冲区大小。

    或者,您可以使用 ref 关键字传递 GraphicsDevice,这可能是一个快速的直接修复,只需与原始调用者相同,假设实例化您的对象的调用者具有原始引用对象或将GraphicsDeviceref 一起传递给它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多