gpt4 book ai didi

c++ - 如何加速 C++ DirectX 放置像素

转载 作者:太空宇宙 更新时间:2023-11-04 11:36:25 27 4
gpt4 key购买 nike

我正在使用 DirectX 9 制作游戏。
我使用自己的 PutPixel 函数:

void Graphics::BeginFrame()
{
pDev->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(114,196,207),1.0f,10);
pBackBuffer->LockRect(&rect,NULL,NULL);
}
void Graphics::EndFrame()
{
pBackBuffer->UnlockRect();
pDev->Present(NULL,NULL,NULL,NULL);
}
void Graphics::PutPixel(int x,int y,D3DCOLOR rgb)
{
((D3DCOLOR *)rect.pBits)[x+(rect.Pitch>>2)*y]=rgb;
}

其中 pDev 是 LPD3DDEVICE9,pBackBuffer 是 IDirect3DSurface9 * 并且 rect 是 D3DLOCKED_RECT。
没有背景图还是不错的,但是加了背景图真的变慢了。
我希望能够在不减慢游戏速度的情况下添加背景图像。
我尝试使用内存缓冲区来存储数据,然后将其 memcpy 到 EndFrame 内的 rect.pBits,但它并没有多大帮助。我需要放置像素的优化版本。
请帮助
谢谢

最佳答案

首先,我怀疑您以错误的方式处理整件事。手动将像素写入帧缓冲区是 20 世纪 90 年代编写游戏的一种方式。 DirectX 具有自动将整个图像传送到屏幕的功能,即使使用硬件加速也是如此。使用它们可能不仅速度更快,而且更容易、更方便。

也就是说,这里有几个缓慢的来源:

  1. 缓存:与主内存相比,帧缓冲内存可能具有不同(即更差)的缓存行为。由于使用 memcpy 没有帮助,所以这在您的情况下并不是一个大问题。

  2. 总线传输:数据需要从CPU传到GPU;这比以“现代方式”(即使用加速 GPU 功能将图像放在一起)要慢,但是您的总线肯定足够快,可以每帧传输一个屏幕的像素。

  3. 逐像素算法:您要为每个像素一遍又一遍地进行地址计算。但是,我认为没有简单的方法可以在不破坏抽象并使所有内容更难阅读和更容易出错的情况下解决此问题(即没有 PutPixel 函数,到处都是指针算法)。

  4. 函数调用开销:调用函数比实际放置一个像素要多一些工作。尝试将 PutPixel 实现放入头文件并将其标记为 inline。如果您的编译器很好,它甚至可能会为您修复第 3 个问题。

总体推荐

认真考虑一下根本不这样做并使用更高级别的功能。如果您想坚持使用 PutPixel,请尝试解决上面的 (4)。如果这没有帮助,问题可能完全出在其他地方。

关于c++ - 如何加速 C++ DirectX 放置像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22935021/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com