这里是初学者。我注意到在 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();
我一直交替使用这两种方法,但没有任何保留。两者有什么区别?每一项如何影响性能?
我绝不是专家,但这就是我认为它的工作原理:
BeginXX()
函数设置可更改的模式,在其中渲染绘制调用(DrawXX()
函数)。
在
BeginDrawing()
模式下,像 DrawTexture()
这样的绘制调用会输出到屏幕上。
在
BeginTextureMode(renderTexture)
中,它们被输出到(渲染)纹理。
两种模式都适用于绘制调用,绘制调用始终与 GPU 通信(因此可能会快速影响您的性能)。
当你看第二个例子时,它会变得有趣:
您进行了两次绘图调用。 首先,使用
DrawTexture()
将纹理“纹理”绘制/渲染到纹理“目标”,然后使用 DrawTextureRec(target)
将该“目标”渲染到屏幕上。
虽然您可以通过直接渲染到屏幕来保存一次绘制调用(就像您在第一个示例中所做的那样),但您实际上所做的是存储纹理数据以供将来/重复使用。
想象一下,您不仅对一个纹理“纹理”执行上述操作,而且对数百或数千个纹理(例如地图的图块)执行上述操作:
如果您使用第一种方法执行此操作,您将向 GPU 每一帧发送 X 个单独的绘制调用。即使纹理很小,与 GPU 的通信也相对较慢,因此这可能会影响性能。您希望最大限度地减少必要的绘制调用量。
如果您将它们全部渲染一次(例如,在
init()
部分)到纹理“目标”(仍然需要大量绘制调用,但仅一次),您现在可以发送“目标” 在单个绘制调用中每帧包含 GPU 的所有 X 纹理的数据!这就是 GPU 所擅长的,可以一次处理提供的大量数据。
显然,你仍然需要绘制会变化的东西,但是你的数据越静态(=它们变化越少),使用上述概念缓冲/缓存东西就越有意义。
“块”是另一个像这样工作的主题:将数据一起批处理以一起处理。
希望有帮助。
如果有人更了解,请随时纠正我任何可能错误的地方!