raylib中的BeginTextureMode()和DrawTexture有什么区别?

问题描述 投票:0回答:1

这里是初学者。我注意到在 raylib 中将新纹理绘制到屏幕上的两种方法,首先在绘图阶段直接使用 DrawTexture:

BeginDrawing();
   DrawTexture(texture, posX, posY, WHITE);
EndDrawing();

另一个方法是将你的Texture2D绘制到RenderTexture2D,然后再绘制RenderTexture2D:

BeginTextureMode(target);
   DrawTexture(texture, posX, posY, WHITE);
EndTextureMode();

BeginDrawing();
     DrawTextureRec(target.texture, (Rectangle) { 0, 0, (float)target.texture.width, (float)-target.texture.height }, (Vector2) { 0, 0 }, WHITE);
EndDrawing();

我一直交替使用这两种方法,但没有任何保留。两者有什么区别?每一项如何影响性能?

c++ textures game-development raylib
1个回答
0
投票

我绝不是专家,但这就是我认为它的工作原理:

BeginXX()
函数设置可更改的模式,在其中渲染绘制调用(
DrawXX()
函数)。

BeginDrawing()
模式下,像
DrawTexture()
这样的绘制调用会输出到屏幕上。

BeginTextureMode(renderTexture)
中,它们被输出到(渲染)纹理。

两种模式都适用于绘制调用,绘制调用始终与 GPU 通信(因此可能会快速影响您的性能)。

当你看第二个例子时,它会变得有趣:

您进行了两次绘图调用。 首先,使用

DrawTexture()
将纹理“纹理”绘制/渲染到纹理“目标”,然后使用
DrawTextureRec(target)
将该“目标”渲染到屏幕上。

虽然您可以通过直接渲染到屏幕来保存一次绘制调用(就像您在第一个示例中所做的那样),但您实际上所做的是存储纹理数据以供将来/重复使用。

想象一下,您不仅对一个纹理“纹理”执行上述操作,而且对数百或数千个纹理(例如地图的图块)执行上述操作:

如果您使用第一种方法执行此操作,您将向 GPU 每一帧发送 X 个单独的绘制调用。即使纹理很小,与 GPU 的通信也相对较慢,因此这可能会影响性能。您希望最大限度地减少必要的绘制调用量。

如果您将它们全部渲染一次(例如,在

init()
部分)到纹理“目标”(仍然需要大量绘制调用,但仅一次),您现在可以发送“目标” 在单个绘制调用中每帧包含 GPU 的所有 X 纹理的数据!这就是 GPU 所擅长的,可以一次处理提供的大量数据。

显然,你仍然需要绘制会变化的东西,但是你的数据越静态(=它们变化越少),使用上述概念缓冲/缓存东西就越有意义。

“块”是另一个像这样工作的主题:将数据一起批处理以一起处理。

希望有帮助。

如果有人更了解,请随时纠正我任何可能错误的地方!

© www.soinside.com 2019 - 2024. All rights reserved.