【问题标题】:C# DirectX PerformanceC# DirectX 性能
【发布时间】:2026-01-04 15:40:01
【问题描述】:

对于落沙游戏我需要锁定一个表面然后根据一组规则修改像素,然后解锁它。纹理的大小为 800x500,格式为 A8R8G8B8

纹理声明

texture = new Texture(device, 800, 500, 1, Usage.Dynamic, Format.A8R8G8B8, Pool.Default);

更新方法(理想情况下应该称为大约 40/s)

    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);
    }

我有一个高端显卡,这个简单的循环将我的 fps 速率降低到 10-13。

DirectX 中是否有更快的方法来直接更改表面的像素?

【问题讨论】:

    标签: c# directx textures


    【解决方案1】:

    你在做什么是从显卡的内存中读取这个纹理到计算机内存中,然后修改它,然后再写回来。这显然意味着巨大的性能损失,因为您需要等待两个内存之间的复制。

    通常,这种操作是使用Shaders all on graphics实现的。

    【讨论】:

    • 我首先查看了着色器,但我的问题是我需要知道例如单个像素何时落入杯子(然后该杯子的计数器减少一个......),可以您解释了如何使用着色器或将我链接到教程?
    • 我真的不知道。我的图形编程知识有限。但通常这种事情需要完全不同的方法来解决问题,并且需要大量的经验和反复试验。
    【解决方案2】:

    通常游戏模型存储在常规内存中并由 CPU 处理,而显卡则纯粹用于渲染结果。如果您没有特别的理由不这样做,那么编写和调试会更容易。

    在您的情况下,您似乎在视频内存中拥有所有游戏数据。正如 Euphoric 在这种情况下指出的那样,您应该让所有逻辑在着色器中运行。有很多示例如何使用多个纹理目标执行数据操作(在您的情况下,2 个可能就足够了)。

    我建议找到使用着色器编写的“生活游戏”示例(搜索 - http://www.bing.com/search?q=directx+shader+sample+%22game+of+life%22,我可能会从这个开始 - http://www.xnainfo.com/content.php?content=21)。生活游戏可能是最简单的事情,足以让您尝试实现。 DirectX SDK 和 Nvidia SDK 也是很好的示例来源 - http://developer.download.nvidia.com/SDK/9.5/Samples/3dgraphics_samples.html

    有关更多示例,请搜索“prostprocess shader”,因为几乎所有示例都是通过使用着色器处理最终渲染图像来实现的。

    【讨论】: