C++ 用于生成的二维贴图的DirectX11缓冲区
我正在制作简单的2D游戏(类似吃豆人)。C++ 用于生成的二维贴图的DirectX11缓冲区,c++,directx,directx-11,C++,Directx,Directx 11,我正在制作简单的2D游戏(类似吃豆人)。 游戏地图由瓷砖组成(2D阵列30x40),每个瓷砖由16px x 16px图形表示。 我的问题是,我重新绘制了每帧的所有瓷砖(30x40=1200瓷砖),这使得FPS非常低。 我解决这个问题的想法是将地图(1200个瓷砖)绘制到一个大缓冲区,然后每个帧只绘制这个缓冲区,但我不知道如何实现这一点,这是我使用DirectX的第一个项目。 如何做到这一点,或者你有更好的想法 代码(简化): pGame->draw() 如果需要更多详细信息,请告诉我。是否从每个
游戏地图由瓷砖组成(2D阵列30x40),每个瓷砖由16px x 16px图形表示。
我的问题是,我重新绘制了每帧的所有瓷砖(30x40=1200瓷砖),这使得FPS非常低。 我解决这个问题的想法是将地图(1200个瓷砖)绘制到一个大缓冲区,然后每个帧只绘制这个缓冲区,但我不知道如何实现这一点,这是我使用DirectX的第一个项目。 如何做到这一点,或者你有更好的想法 代码(简化): pGame->draw()
如果需要更多详细信息,请告诉我。是否从每个帧中的文件加载纹理?那么这就是导致应用程序变慢的原因。当然不是,我加载了每种磁贴(10*.dds文件)一次。那么为什么在
draw()
方法中有createddstructurefromfile()
调用?DirectX::createddstructurefromfile(设备、文件、预源和pTexture)
在Draw
方法中,看起来确实有问题:)你应该能够非常快地绘制几千个精灵。事实上,你正在加载和创建一个新的纹理,每一帧都会很慢,特别是当你在加载后立即转身绘制相同的纹理时,这意味着它必须阻塞,直到GPU处理完纹理加载。顺便说一下,不要使用原始指针来为Direct3D COM对象使用,请考虑使用。哦,抱歉。这就是我在简化stackoverflow问题代码时犯的错误。如前所述,我只加载10*.dds文件一次。修正了问题。你是从每个帧的文件中加载纹理吗?那么这就是导致应用程序变慢的原因。当然不是,我加载了每种磁贴(10*.dds文件)一次。那么为什么在draw()
方法中有createddstructurefromfile()
调用?DirectX::createddstructurefromfile(设备、文件、预源和pTexture)
在Draw
方法中,看起来确实有问题:)你应该能够非常快地绘制几千个精灵。事实上,你正在加载和创建一个新的纹理,每一帧都会很慢,特别是当你在加载后立即转身绘制相同的纹理时,这意味着它必须阻塞,直到GPU处理完纹理加载。顺便说一下,不要使用原始指针来为Direct3D COM对象使用,请考虑使用。哦,抱歉。这就是我在简化stackoverflow问题代码时犯的错误。如前所述,我只加载10*.dds文件一次。固定问题。
ID3D11Device* pDevice;
ID3D11DeviceContext* pImmediateContext;
ID3D11RenderTargetView* pRenderTargetView;
IDXGISwapChain* pSwapChain;
ID3D11Resource* pResource;
ID3D11ShaderResourceView* pTexture;
std::unique_ptr<DirectX::SpriteBatch> spriteBatch;
Game* pGame;
void GameApp::renderGame(float dt) {
pImmediateContext->ClearRenderTargetView(pRenderTargetView, DirectX::Colors::Black);
spriteBatch->Begin();
pGame->draw();
spriteBatch->End();
pSwapChain->Present(0, 0);
}
void Game::draw() {
for (int i = 0; i < sizeY; ++i) {
for (int j = 0; j < sizeX; ++j) {
// Draw tile
spriteBatch->Draw(pTexture, vPosition, &sourceRect, tint, rotation, vOrigin, vScale,
DirectX::SpriteEffects::SpriteEffects_None, 0.0f);
tile->Draw(spriteBatch);
}
}
}
DirectX::CreateDDSTextureFromFile(device, file, &pResource, &pTexture)