Monogame:哪种情况会运行得更快? Texture2D.SetData()

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

我正在编写一个落沙模拟器,我正在尝试确定在屏幕上绘图的最佳方式。 我注意到Texture2D.SetData非常慢,但我不确定是什么让它变慢。

我正在想办法花掉抽奖。

哪种情况最快?

案例A(目前,我正在做什么):

创建像素阵列。更新它,然后在Texture2D.SetData方法中使用像素数组

案例B:

将像素阵列和纹理分成小块。每个卡盘可以有自己的像素阵列和纹理。当需要绘制时,仅在最后一帧卡盘发生变化时才绘制该卡盘。

情况C(可能不可能):

有一个像素阵列但有两个纹理。一种纹理称为前缓冲区,另一种称为后缓冲区。当程序启动时,使用像素数组设置两个纹理。每次绘制时,运行一个线程将像素数组设置到后台缓冲区,当线程完成时,主线程交换前台缓冲区和后台缓冲区纹理。唯一的想法是阻止Texture2D.SetData方法阻塞主线程。

xna monogame
1个回答
0
投票

Texture.SetData 然后绘制该纹理,本质上是在 cpu 上完成所有工作,而不是在 GPU 上完成所有工作。此外,每个 SetData 调用本身的成本立即很高,并且会中断渲染管道。将纹理数据的更改有效地交错到渲染管道中的方法是分配一个 RenderTarget,然后对其发出绘制调用。

绘制 2D 事物的正常方法是 SpriteBatch。不过,高效地完成您正在做的任何事情的方法将 100% 取决于具体细节,例如 .. 您是否真的需要/想要 1x1 像素分辨率来完成您正在做的任何事情?改变需要立即发生吗?你需要CPU访问它吗?需要多少次绘制调用才能实现一帧的更改?它是否需要作为 RenderTarget 保留下来,还是应该只是绘制到后台缓冲区?

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