Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于生成的二维贴图的DirectX11缓冲区_C++_Directx_Directx 11 - Fatal编程技术网

C++ 用于生成的二维贴图的DirectX11缓冲区

C++ 用于生成的二维贴图的DirectX11缓冲区,c++,directx,directx-11,C++,Directx,Directx 11,我正在制作简单的2D游戏(类似吃豆人)。 游戏地图由瓷砖组成(2D阵列30x40),每个瓷砖由16px x 16px图形表示。 我的问题是,我重新绘制了每帧的所有瓷砖(30x40=1200瓷砖),这使得FPS非常低。 我解决这个问题的想法是将地图(1200个瓷砖)绘制到一个大缓冲区,然后每个帧只绘制这个缓冲区,但我不知道如何实现这一点,这是我使用DirectX的第一个项目。 如何做到这一点,或者你有更好的想法 代码(简化): pGame->draw() 如果需要更多详细信息,请告诉我。是否从每个

我正在制作简单的2D游戏(类似吃豆人)。
游戏地图由瓷砖组成(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)