首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectX游戏LPD3DX9Sprite渲染慢

DirectX游戏LPD3DX9Sprite渲染慢
EN

Stack Overflow用户
提问于 2015-10-27 16:17:32
回答 2查看 422关注 0票数 0

嘿,我正试图在C++中构建一个2D引擎,它可以同时使用DirectX和SDL处理数千个精灵。我听说LPD3DX9Sprite很有效率,来自XNA,我很熟悉它的风格。我在做一些性能测试,一次批处理多个精灵(相同的纹理和设置)。然而,性能和idk的原因似乎存在一些问题。

代码语言:javascript
复制
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#中的一个完整的游戏引擎相比,它在许多精灵渲染中运行得非常完美。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-27 16:46:57

公平地说,这是罪魁祸首:

代码语言:javascript
复制
for (int i = 0; i < 1000; i++)
    Test.Draw();

除了Test.draw();的内容之外,您还声称:

代码语言:javascript
复制
Graphics::SpriteBatch->Draw(Texture, &SourceRect, &OriginPos, &D3DXVECTOR3(Position.x,Position.y,0), Color);

尽管这是一个相对简单的命令,但这是一个相当昂贵的命令,必须反复推送到显卡上。我不知道您正在使用的库的基本机制,但是当命令像这样编写时,它强烈地唤起了OpenGL1.x中的编码风格,在这种情况下,顶点和纹理在需要时被流到图形卡中,而不是预先加载它们,而只是调用命令来绘制预加载的顶点。您需要研究库是否有能力使用顶点缓冲区对象和其他类似的构造提前将这些数据加载到显卡上。

如果没有,那么您需要自己学习和实现这些概念。

另外:

我听说LPD3DX9Sprite很有效率..。

一般来说,根据定义,使用DirectX9的任何情况都不会很快。除非您使用DX10和DX11的特性集,否则不会,但在这种情况下,没有理由首先使用DX9特性。

票数 0
EN

Stack Overflow用户

发布于 2015-10-27 18:11:00

注意,方法ID3DXSprite::Draw没有将sprite绘制/呈现给screen.It,只是将sprite添加到接口ID3DXSprite中可用的方法的批处理sprites.For信息列表中--参见这个链接。您必须使用HRESULT Flush()来绘制所有批处理的精灵。

所以你的代码应该像这样修改,

代码语言:javascript
复制
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()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33373150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档