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

时间:2014-04-08 11:02:38

标签: c++ directx directx-9

我正在使用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。
没有背景图像,这是相当不错的,但是当我添加背景图像时,它确实会变慢 我希望能够在不减慢游戏速度的情况下添加背景图像 我尝试使用内存缓冲区来存储数据,然后将其存储到EndFrame中的rect.pBits,但它没有多大帮助。我需要优化版本的put像素。
请帮助 感谢

1 个答案:

答案 0 :(得分:1)

首先,我怀疑你是以错误的方式处理整件事。手动将像素写入帧缓冲区是编写游戏的一种非常重要的方式。 DirectX具有自动将整个图像blit到屏幕的功能,即使使用硬件加速也是如此。它可能不仅更快,而且更容易使用它们。

尽管如此,这里有几个缓慢的来源:

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

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

  3. 逐像素算术:您为每个像素反复进行地址计算。但是,我认为没有简单的方法可以解决这个问题,而不会破坏抽象并使所有内容更难阅读并且更容易出错(即没有PutPixel函数,只需指针算术)。

  4. 函数调用开销:调用函数比实际放置像素更有效。尝试将PutPixel实现放入头文件并将其标记为inline。如果你的编译器很好,它甚至可以为你修复3号。

  5. 总体建议

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