gpt4 book ai didi

c++ - DirectX 11 调试层捕获错误字符串

转载 作者:太空狗 更新时间:2023-10-29 21:10:35 28 4
gpt4 key购买 nike

我有 DirectX 调试层工作,它向 visual studio 中的输出窗口输出错误和警告。例如这样(不是我面临的实际问题):

D3D11 WARNING: ID3D11DeviceContext::OMSetRenderTargets: Resource being set to OM RenderTarget slot 0 is still bound on input! [ STATE_SETTING WARNING #9: DEVICE_OMSETRENDERTARGETS_HAZARD]

我有一个自定义日志记录系统,可以保存到文件并在其他窗口中打印。我想捕获调试消息字符串,并以我自己的方式显示它们。这受支持吗?如果可以,我该怎么做?

最佳答案

由于我自己也遇到了这个问题,并且发现之前的答案有点乏味,所以我想给出更详细的解决方案,现在我已经开始工作了:

我将引用的所有 API 调用都可以找到 here

可以通过从内部消息队列中读取消息来从 DirectX11 中获取消息,可以通过调用 ID3D11InfoQueue::GetMessage 来访问消息队列, 它获取要获取的消息的索引并用 D3D11_MESSAGE 填充提供的缓冲区结构,其中包含所有需要的信息(严重性、类别、ID 和文本)。

但是,当我试图遍历它时,我发现这个缓冲区是空的(通过调用 ID3D11InfoQueue::GetNumStoredMessages )。这似乎是由于进行了一些过滤。为了让运行时真正填充这个缓冲区,我首先必须调用 ID3D11InfoQueue::PushEmptyStorageFilter ,它推送一个不过滤掉任何消息的过滤器:

//HANDLE_HRESULT is just a macro of mine to check for S_OK return value
HANDLE_HRESULT(debug_info_queue->PushEmptyStorageFilter());

此过滤是 Chuck Walbourn 的回答中链接的博客文章中实际讨论的部分(尽管该链接仅将我定向到主页,实际的博客文章是 here )。不过,它不包含有关如何重定向消息的任何信息。

生成消息后,您可以像这样迭代它们:

UINT64 message_count = debug_info_queue->GetNumStoredMessages();

for(UINT64 i = 0; i < message_count; i++){
SIZE_T message_size = 0;
debug_info_queue->GetMessage(i, nullptr, &message_size); //get the size of the message

D3D11_MESSAGE* message = (D3D11_MESSAGE*) malloc(message_size); //allocate enough space
HANDLE_HRESULT(debug_info_queue->GetMessage(i, message, &message_size)); //get the actual message

//do whatever you want to do with it
printf("Directx11: %.*s", message->DescriptionByteLength, message->pDescription);

free(message);
}

debug_info_queue->ClearStoredMessages();

debug_info_queue 是 ID3D11InfoQueue接口(interface),可以这样获取:

ID3D11InfoQueue* debug_info_queue;
device->QueryInterface(__uuidof(ID3D11InfoQueue), (void **)&debug_info_queue);

关于c++ - DirectX 11 调试层捕获错误字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53579283/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com