更快地迭代锯齿状数组?

时间:2010-03-29 23:32:32

标签: c# xna

我想遍历一个覆盖屏幕上每个像素的数组。即:

        for (int y = 598; y > 0; y--)
        {
            for (int x = 798; x > 0; x--)
            {
                if (grains[x][y])
                {
                    spriteBatch.Draw(Grain, new Vector2(x,y), Color.White);
                }
            }
        }

...我的纹理是一个1x1像素的图像,当数组值为true时,它会被绘制到屏幕上。它运行得体 - 但是我覆盖的屏幕越多,肯定会滞后。有没有更好的方法来实现我想要实现的目标?

2 个答案:

答案 0 :(得分:7)

不使用X x Y个别精灵,而是创建单个图像,并适当设置像素。然后只需将整个图像渲染为单个精灵上的纹理。

锯齿状阵列很可能问题 - 而不是近50万精灵。

答案 1 :(得分:0)

问题是你每帧在绘图方法中花费了大量的CPU时间。无论是否在固定时间,您的Game实例的Draw方法将始终被调用。鉴于此,您总是希望确保尽可能少花时间,这意味着您希望将大部分工作放在GPU上。

嵌套的for循环以及对spriteBatch.Draw的所有调用将使用更慢的CPU,尤其是当你的循环变得越来越大时,这意味着延迟绘制。

如果你想按照每个像素进行逐像素计算,那么最好的方法是将工作放在GPU上并使用像素着色器。您可以通过创建一个所需大小的纹理并将数组传递到保存“开启或关闭”信息的着色器以及实现相同目标的其他方法来完成您自己的问题。

How To: Apply a Pixel Shader to Sprites