我正在读一本名为《Monogame Mastery》的书,介绍 .NET 的 Monogame 框架。在第 04 章中,有一部分解释了我们如何缩放和定位游戏内容以将其正确放置在窗口上。我对 RenderRectangle2D 是什么感到困惑。你能用简单的话解释一下那是什么吗? 章节代码:
protected override void Draw(GameTime gameTime)
{
// Render to the Render Target
GraphicsDevice.SetRenderTarget(_renderTarget);
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
_currentGameState.Render(spriteBatch);
spriteBatch.End();
// Now render the scaled content
graphics.GraphicsDevice.SetRenderTarget(null);
graphics.GraphicsDevice.Clear(ClearOptions.Target, Color.Black, 1.0f, 0);
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.Opaque);
spriteBatch.Draw(_renderTarget, _renderScaleRectangle, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
我会把它解释为一张草稿纸,你可以在上面画画,然后才将其显示在屏幕上。现在我的理解好了吗?如果是的话,当我们可以直接在屏幕上绘图时,为什么我们需要它?
渲染目标充当中间纹理。在某些特定情况下,您希望首先在 RenderTarget2D 上进行渲染。这里有几个用例
如果您想要可调整大小的游戏窗口,您可以首先在 RenderTarget2D 之上渲染整个游戏,然后将其缩放以适合整个窗口。
SpriteBatch 支持像素着色器或效果。它们充当图像过滤器,允许您非常快速地更改纹理的每个像素的颜色。有时您需要将效果应用到整个屏幕,而不是单独应用到每个精灵。在这种情况下,您首先在 RenderTarget2D 上绘制所有精灵,然后在屏幕上绘制具有指定效果的 RenderTarget2D(如果要应用其他效果,则在另一个 RenderTarget2D 之上)
假设您需要每帧渲染 10000 个图块的网格(例如在 Terraria 或 Noita 中)。您可以在 RenderTarget2D 之上渲染一次,然后仅重新渲染已更改的部分,而不是每帧从头开始重新渲染。这样你就可以节省很多 FPS