Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#DirectX性能_C#_Directx_Textures - Fatal编程技术网

C#DirectX性能

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

对于落沙游戏我需要锁定一个曲面然后根据一组规则修改像素,然后解锁它。纹理大小为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<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);
    }