【问题标题】:Trouble understanding render targets and back buffers in monogame无法理解单体游戏中的渲染目标和后台缓冲区
【发布时间】:2026-01-11 21:20:07
【问题描述】:

我的图形设备设置如下:

GraphicsDeviceManager = new GraphicsDeviceManager(GameBase.GameRef);
GraphicsDeviceManager.PreferredBackBufferWidth = 640;
GraphicsDeviceManager.PreferredBackBufferHeight = 480;
GraphicsDeviceManager.ApplyChanges();

我在 google 上找不到任何地方确切解释首选后台缓冲区宽度的含义。

我这样设置渲染目标:

RenderTarget = new RenderTarget2D(
    GraphicsDeviceManager.GraphicsDevice,
    640,
    480,
    false,
    GraphicsDeviceManager.GraphicsDevice.PresentationParameters.BackBufferFormat,
    DepthFormat.Depth24);

我在谷歌上找不到任何关于 640 和 480 对渲染目标的绘制方式的实际含义。

我遇到的问题是,如果我调整窗口大小,一切都会拉伸。我正在尝试了解 monogame 是如何导致这种情况的,然后最终找出解决方案。

一开始我的窗口是 640x480,PreferredBackBufferWidth 和高度是 640/480,渲染目标是 640/480

例如,如果我将窗口大小调整为 1920x1080,一切都会拉伸,因此 monogame 不再将 640x480 纹理渲染到屏幕的 640x480 部分,但我没有更改任何值或为此编写任何代码。

如果我调整屏幕大小,渲染目标应该被销毁并以新的窗口大小重新创建,还是应该更改后台缓冲区的宽度和高度,或两者兼而有之,还是其他?

我很困惑,没有任何在线技术文档足以详细回答。一旦我理解了它,我应该能够编写一些代码,这样当你调整屏幕大小时什么都不会发生,一切都保持相同的大小,并且在右/下边缘周围有一个黑色区域,因为窗口比我大渲染到。

【问题讨论】:

  • 目前无法检查。但据我记得,两者都应该调整大小。将后台缓冲区视为“您正在绘制的纸张”,而 RenderTarget 是“您将已绘制的图片投影到的平面”。因此,如果您不想拉伸,那么您需要更改后台缓冲区以在“纸”上有更多空间,然后更改 RenderTarget 以实际有一些“显示绘图的位置”。
  • 所以我是一个简单的(示例)场景,您的后台缓冲区应该具有您计划定位的最大大小。
  • 我知道你的意思,在 XNA 还活着的时候,很容易找到关于 XNA 教程的帮助,而不是 MSDN 上的基本参考主题。我能找到的最好的是this article,纵横比也有一点。希望对你有帮助
  • 你用RenderTarget做什么?如果您只是在屏幕上进行简单的绘制,则不需要单独的渲染目标。

标签: c# xna monogame


【解决方案1】:

后台缓冲区是显示在屏幕上的特殊渲染目标。它被拉伸以填充窗口,如果窗口大小不匹配,则会导致缩放。

您可以在窗口大小更改时调整后台缓冲区的大小。发生这种情况时会触发Game.Window.ClientSizeChanged 事件(请注意,如果用户通过拖动来调整窗口大小,它可能会被触发多次)。然后调整后台缓冲区的大小很简单

GraphicsDeviceManager.PreferredBackBufferWidth = Window.ClientBounds.Width;
GraphicsDeviceManager.PreferredBackBufferHeight = Window.ClientBounds.Height;
GraphicsDeviceManager.ApplyChanges();

您是否应该重新创建 RenderTarget 取决于您使用它的目的。

【讨论】:

  • 我希望能够拉伸输出以适应窗口大小,但可以选择打开/关闭它。有时我想让它伸展,有时我想渲染更多的屏幕(所以你会在游戏中看到更多的“瓷砖”)。大概两者应该是相同的大小。我将对此进行试验。