嘿,我正试图在C++中构建一个2D引擎,它可以同时使用DirectX和SDL处理数千个精灵。我听说LPD3DX9Sprite很有效率,来自XNA,我很熟悉它的风格。我在做一些性能测试,一次批处理多个精灵(相同的纹理和设置)。然而,性能和idk的原因似乎存在一些问题。
void Draw()
{
Graphics::direct3D_device->Clear(1, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 0, 0);
Graphics::direct3D_device->BeginScene();
Graphics::SpriteBatch->Begin(D3DXSPRITE_ALPHABLEND);
string fs = std::to_string(fps);
for (int i = 0; i < 1000; i++)
Test.Draw();
DrawTextString(32, 64, fs.c_str());
Graphics::SpriteBatch->End();
Graphics::direct3D_device->EndScene();
Graphics::direct3D_device->Present(NULL, NULL, NULL, NULL);
}这是我的抽签代码,它调用一个函数,基本上调用LPD3DX9Sprite对象的LPD3DX9Sprite。游戏中没有其他事情发生,只有这个绘图代码。
根据fps柜台,我得到了4fps。Vsync已启用,但无论何时减速都会发生。我能做些什么吗?
我觉得奇怪的是,这个在C++中的简单测试游戏没有真正的逻辑,与C#中的一个完整的游戏引擎相比,它在许多精灵渲染中运行得非常完美。
发布于 2015-10-27 16:46:57
公平地说,这是罪魁祸首:
for (int i = 0; i < 1000; i++)
Test.Draw();除了Test.draw();的内容之外,您还声称:
Graphics::SpriteBatch->Draw(Texture, &SourceRect, &OriginPos, &D3DXVECTOR3(Position.x,Position.y,0), Color);尽管这是一个相对简单的命令,但这是一个相当昂贵的命令,必须反复推送到显卡上。我不知道您正在使用的库的基本机制,但是当命令像这样编写时,它强烈地唤起了OpenGL1.x中的编码风格,在这种情况下,顶点和纹理在需要时被流到图形卡中,而不是预先加载它们,而只是调用命令来绘制预加载的顶点。您需要研究库是否有能力使用顶点缓冲区对象和其他类似的构造提前将这些数据加载到显卡上。
如果没有,那么您需要自己学习和实现这些概念。
另外:
我听说LPD3DX9Sprite很有效率..。
一般来说,根据定义,使用DirectX9的任何情况都不会很快。除非您使用DX10和DX11的特性集,否则不会,但在这种情况下,没有理由首先使用DX9特性。
发布于 2015-10-27 18:11:00
注意,方法ID3DXSprite::Draw没有将sprite绘制/呈现给screen.It,只是将sprite添加到接口ID3DXSprite中可用的方法的批处理sprites.For信息列表中--参见这个链接。您必须使用HRESULT Flush()来绘制所有批处理的精灵。
所以你的代码应该像这样修改,
void Draw()
{
Graphics::direct3D_device->Clear(1, NULL, D3DCLEAR_TARGET,D3DCOLOR_ARGB(255, 0, 0, 0), 0, 0);
Graphics::direct3D_device->BeginScene();
Graphics::SpriteBatch->Begin(D3DXSPRITE_ALPHABLEND);
string fs = std::to_string(fps);
for (int i = 0; i < 1000; i++)
{
Test.Draw();
}
Graphics::SpriteBatch->Flush();//Basically call the Flush Method here
DrawTextString(32, 64, fs.c_str());
Graphics::SpriteBatch->End();
Graphics::direct3D_device->EndScene();
Graphics::direct3D_device->Present(NULL, NULL, NULL, NULL);
}基本上,您需要在Graphics::SpriteBatch->Flush(); for loop.The Flush()方法之后添加此代码,然后绘制所有批处理的Flush()。
https://stackoverflow.com/questions/33373150
复制相似问题