Performance 如何使用XNAAPI绘制单个像素?

Performance 如何使用XNAAPI绘制单个像素?,performance,graphics,xna,pixels,Performance,Graphics,Xna,Pixels,如果我想用不同颜色的像素填充我的游戏屏幕,我会怎么做 例如,如果我想编写一个“”类型的游戏,其中每个像素都是一个单元,我将如何使用XNA实现这一点 我尝试使用屏幕大小的Color值数组对Texture2D对象调用SetData(),但它遇到以下问题: 当资源在GraphicsDevice上处于活动设置状态时,不能调用该资源上的SetData 在调用SetData之前,将其从设备中取消设置 我该怎么做呢?或者更好的是。。。是否有一种替代的、更好的、有效的方法来用任意像素填充屏幕?您可以使用我提到的

如果我想用不同颜色的像素填充我的游戏屏幕,我会怎么做

例如,如果我想编写一个“”类型的游戏,其中每个像素都是一个单元,我将如何使用XNA实现这一点

我尝试使用屏幕大小的
Color
值数组对
Texture2D
对象调用
SetData()
,但它遇到以下问题:

当资源在GraphicsDevice上处于活动设置状态时,不能调用该资源上的SetData

在调用SetData之前,将其从设备中取消设置


我该怎么做呢?或者更好的是。。。是否有一种替代的、更好的、有效的方法来用任意像素填充屏幕?

您可以使用我提到的技术使用SpriteBatch绘制矩形。然后,您可以使用它绘制覆盖屏幕的1x1矩形。我不知道这会有多好,但它应该会起作用


这似乎说明了您正试图解决的确切问题。

关于您遇到的错误,这意味着您正在尝试修改纹理数据,而它仍然绑定到设备上的一个采样器单元。是否在SpriteBatch.Begin/End块内调用SetData?如果是,这就是问题所在(在绘制任何图形之前更新纹理)。否则,您是否直接在设备的纹理采样器之一上使用GraphicsDevice.Textures[x]=yourTexture设置纹理?如果是,请在开始更改数据之前将纹理[x]设置为null


就你所做工作的效率而言,这并不理想,但对你的目的来说可能并不重要。尽量保持图像分辨率合理,并意识到使用这种方法可能不会达到200 FPS,但在开始担心性能之前,我会尝试一下,看看它是否足够快。

在纹理2D上设置数据后,您无法再更改它。解决这个问题的方法是创建1x1纹理2D并将其颜色设置为白色。然后,您将使用您希望像素的颜色来绘制它。由于您的纹理是白色的,因此所需的颜色将与您选择的颜色完全一致

Texture2D pixel = new Texture2D(App.GraphicsDevice, 1, 1);
colors = new Color[1];
colors[0] = Color.White;
pixel.SetData(colors);
这是一个使用上面的像素绘制像素的示例函数

public void DrawPixel(SpriteBatch spriteBatch, Vector2 pos, Color tint)
{
    spriteBatch.Draw(pixel, pos, tint);
}

对每个像素绘制重复使用此纹理2D。

最理想的方法是让着色器为您执行此操作。在只使用着色器之前,我已经实现了一个生命模拟游戏,其他人也用XNA实现了同样的功能

其思想是使用两种纹理,一种用于旧状态,另一种用于新状态。设置它,以便渲染到新纹理并读取旧纹理。您可以直接在着色器中执行细胞autonoma:)


您可以使用它获得出色的性能,我使用1024x1024网格时的速度约为300fps。

为什么不使用原始DirectX或OpenGL?老实说?因为我实际上只是在玩弄C#的图形功能,我一辈子都搞不清楚在哪里可以在微软的网站上下载托管DirectX API。我想我下载了大约4个不同版本的SDK。。。找不到C#引用。如果我能找到它,我会用它来代替,但是XNA维基百科页面说它取代了托管DX API,所以我在那之后放弃了。什么是更理想的方法?