c++ - DirectX 11 ClearRenderTargetView 全屏问题
问题描述
我有一个 DirectX 11 应用程序,它呈现从 SDK 提供的帧。在创建. clear_screen
_swapchain_->SetFullscreenState(TRUE, dxgi_output)
swapchain_
这是我的render_frame
功能。它在一个单独的线程中调用,该线程运行play_loop
函数直到stop
函数被调用。
HRESULT xpreview::render_frame(xframe_ptr_t frame)
{
HRESULT hr = S_OK;
rendered_frame_count_++;
dev_ctx_->UpdateSubresource(texture_input_, 0, nullptr, frame->buffer(), width_ * 2, 0);
hr = vid_ctx_->VideoProcessorBlt(vid_proc_, vid_proc_output_view_, 0, 1, &stream_data_);
if (FAILED(hr))
{
return hr;
}
if (overlay_enabled_)
{
text_overlay_.draw();
}
hr = swapchain_->Present(DXGI_SWAP_EFFECT_DISCARD, DXGI_PRESENT_DO_NOT_WAIT);
if (overlay_enabled_)
{
update_overlays();
}
return hr;
}
void xpreview::play_loop()
{
while (rendering_)
{
xframe_ptr_t frame;
{
std::lock_guard<std::mutex> lg(mutex_);
if(!frame_queue_.empty())
{
frame = frame_queue_.front();
frame_queue_.pop_front();
}
}
if (frame_queue_.size() < queue_limit_)
{
wait_for_frames_.notify_one();
}
if (frame)
{
decode_drop_count_ += frame->drop_count();
overlay_time_ += frame->additional();
// Wait until it is time to render
int64_t wait_time = render_start_time_ + frame->timestamp() - clock_.now();
if (wait_time > 0)
{
LARGE_INTEGER li_wait_time;
li_wait_time.QuadPart = -1 * wait_time;
if (SetWaitableTimer(timer_, &li_wait_time, 0, nullptr, nullptr, FALSE))
{
WaitForSingleObject(timer_, INFINITE);
}
}
else if (drop_ && (wait_time < -100000))
{
dropped_frame_count_++;
continue;
}
render_frame(frame);
}
}
}
这是我的clear_screen
功能。我在我stop
的函数中调用它,stop
当没有更多新帧提供给我的类实例时调用该函数。
void clear_screen()
{
float bg[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
dev_ctx_->ClearRenderTargetView(render_target_, bg);
swapchain_->Present(DXGI_SWAP_EFFECT_DISCARD, DXGI_PRESENT_DO_NOT_WAIT);
}
void xpreview::stop()
{
if (!rendering_)
{
return;
}
accept_frames_ = false;
rendering_ = false;
if (play_thread_.joinable())
{
play_thread_.join();
}
{
std::lock_guard<std::mutex> lg(mutex_);
frame_queue_.clear();
}
clear_screen();
}
另外,我正在使用 DirectXTk 库在框架上覆盖一些文本。当我启用叠加时,clear_screen
会意外工作。这个库是否修复了我之前设置错误的一些东西?我正在使用下面的代码来绘制一个字符串;
void text_overlay::draw()
{
sprite_batch_->Begin();
DirectX::SimpleMath::Vector2 origin = sprite_font_->MeasureString(text_.c_str());
origin.x = 0;
origin.y = 0;
sprite_font_->DrawString(sprite_batch_.get(), text_.c_str(), font_pos_, DirectX::Colors::Yellow, 0.f, origin);
sprite_batch_->End();
}
解决方案
推荐阅读
- bash - 如何让 zsh 或 bash 中的多个进程同时附加到同一个文件?
- javascript - NodeJs / Axios:与高并发性相关的超时问题
- html - 居中的弹性项目溢出不可读
- html - 正确设置引导间距的问题
- python - 如何知道记录是否已被修改或包含在 pandas 数据框中的新记录
- mysql - MySQL查询问题以查找字符串中的值
- r - 检查两个列表是否等于排列
- asp.net-mvc-4 - 如何创建 Web Api 执行存储过程
- html - 使用异步 React Native 的 api 调用
- reactjs - Expo EAS没有解决sentry-expo。是否缓存了依赖项?