C#DirectX性能
对于落沙游戏我需要锁定一个曲面,然后根据一组规则修改像素,然后解锁它。纹理大小为800x500,格式为A8R8G8B8 纹理声明 Update方法(理想情况下应在40/s左右调用)C#DirectX性能,c#,directx,textures,C#,Directx,Textures,对于落沙游戏我需要锁定一个曲面,然后根据一组规则修改像素,然后解锁它。纹理大小为800x500,格式为A8R8G8B8 纹理声明 Update方法(理想情况下应在40/s左右调用) public new void Update() { 计数++; byte[]data=(byte[])texture.LockRectangle(typeof(byte),0,LockFlags.None,800*500*4); 对于(int i=0;i
public new void Update()
{
计数++;
byte[]data=(byte[])texture.LockRectangle(typeof(byte),0,LockFlags.None,800*500*4);
对于(int i=0;i<1600000;i++)
{
数据[i]=255;
}
纹理。解锁矩形(0);
}
我有一个高端图形卡,这个简单的循环将我的fps速率降低到10-13
DirectX中有没有更快的方法可以直接更改曲面的像素?您要做的是将此纹理从图形卡内存读取到计算机内存中,然后对其进行修改,然后再将其写回。这显然意味着巨大的性能损失,因为您需要等待两个内存之间的复制
通常,这种操作都是使用图形卡上的着色器来实现的。通常游戏模型存储在常规内存中,由CPU处理,而图形卡仅用于渲染结果。如果您没有特别的理由不这样做,那么编写和调试就会更容易 在你的情况下,你似乎有所有的游戏数据在视频内存。正如Ephoric在本例中指出的,您应该让所有逻辑在着色器中运行。关于如何使用多个纹理目标执行数据操纵,有很多示例(在您的情况下,2个可能就足够了) 我建议查找使用着色器编写的“生活游戏”示例(搜索-,我可能从这个示例开始-)。生活的游戏可能是最简单的事情,接近你想要达到的目标。DirectX SDK和Nvidia SDK也是很好的示例源,比如-
有关更多示例,请搜索“prostprocess shader”,因为几乎所有示例都是通过使用着色器操纵最终渲染图像来实现的。我首先查看了着色器,但我的问题是,我需要知道例如单个像素何时落入杯子中(然后该杯子的计数器减少1…),你能解释一下如何使用着色器或将我链接到教程吗?我真的不知道。我对图形编程的知识有限。但通常这类事情需要完全不同的方法来解决问题,需要大量的经验和反复试验。
texture = new Texture(device, 800, 500, 1, Usage.Dynamic, Format.A8R8G8B8, Pool.Default);
public new void Update()
{
count++;
byte[] data = (byte[])texture.LockRectangle(typeof(byte), 0, LockFlags.None, 800 * 500 * 4);
for (int i = 0; i < 1600000; i++)
{
data[i] = 255;
}
texture.UnlockRectangle(0);
}