版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tomicyo/article/details/45890831
DirectX 12图形应用分析
准备工具
- Windows 10 10122技术预览版
- NVIDIA 正式的DirectX 12驱动(官网上可下载)
- Visual Studio 2015 Community RC
- Graphics Tools
以上工具可以参考
【DirectX 12】开发初体验(10074技术预览版)
和在Win10 10074上开启DirectX 12的调试功能
进行安装。
调试界面
上图是图形调试界面,可以分析每一个Frame的DrawCall以及Rendering Resources。
如上图所示,选择 Start Diagnostics 就能开始调试D3D图形应用了,在应用运行的过程中按打印屏幕键就能捕获当前的帧并保存下来以供后续分析。
在代码中添加图形绘制事件信息
在DX应用中可以使用Pix库添加绘制事件(PixEvent)
#include <pix.h>
下面这段代码说明了如何使用PixEvent对DrawCalls进行分组标记。
//在这里添加绘制事件标记
PIXBeginEvent(m_commandList.Get(), 0, L"Draw the cube");
{
m_commandList->SetGraphicsRootSignature(m_rootSignature.Get());
ID3D12DescriptorHeap* ppHeaps[] = { m_cbvHeap.Get() };
m_commandList->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);
m_commandList->RSSetViewports(1, &m_deviceResources->GetScreenViewport());
m_commandList->RSSetScissorRects(1, &m_scissorRect);
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_deviceResources->GetRenderTarget(), D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
m_commandList->ClearRenderTargetView(m_deviceResources->GetRenderTargetView(), DirectX::Colors::CornflowerBlue, 0, nullptr);
m_commandList->OMSetRenderTargets(1, &m_deviceResources->GetRenderTargetView(), false, nullptr);
m_commandList->ExecuteBundle(m_cubeBundle.Get());
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_deviceResources->GetRenderTarget(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
}
PIXEndEvent(m_commandList.Get());
//结束绘制事件的记录
PixEvent的作用
通常一个游戏应用运行一帧的过程中会产生大量的DrawCalls,巧妙地使用PixEvent对大量的DrawCalls分组,能够帮助你快速定位到绘制过程中的错误,同时也有利于发现并分析应用运行过程中的性能瓶颈。