ocornut / imgui

Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
MIT License
60.95k stars 10.29k forks source link

Imgui flickering using Double Buffering in Debug with VSync off in DX12 #2842

Open b2soft opened 5 years ago

b2soft commented 5 years ago

Version/Branch of Dear ImGui:

Version: HEAD, 1.73 Branch: master, tag v.1.73

Back-end/Renderer/Compiler/OS

Back-ends: imgui_implwin32.cpp + custom DirectX 12 backend Compiler: msvc2019(if the question is related to building or platform specific features)_ Operating System: Windows 10

My Issue/Question:

When using Double Buffering with V-Sync disabled and compiled in Debug mode, Imgui starts flickering on RTX2070 and GT960 video cards (not tested on the other cards). In any other configuration - Triple Buffering or V-Sync On or Release mode - everything is OK.

Note, that if application is started from NVIDIA NSight (trying to debug it), the NSight's overlay also starts flickering. If application is started from RenderDoc flickering does not occur. When trying to capture "flickering" application using screen rec/screenshot capturing software, flickering does not occur, but imgui is drawn instead. If using triple buffering, problem does not occur.

Code is not using SetMaximumFrameLatency() nor DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT flag for swapchain

Screenshots/Video

Standalone: https://cdn.discordapp.com/attachments/520689895245611009/631109665467400193/IMG_1025.MOV

Under NSight: https://cdn.discordapp.com/attachments/520689895245611009/631122672042115072/video0.mov

Standalone, minimal, complete and verifiable example: Actually, while custom backend is used, you can checkout https://github.com/jpvanoosten/LearningDirectX12

To enable Double Buffering in DX12Lib\inc\Window.h change static const UINT BufferCount = 3; to 2 To disable V-Sync - use imgui menu in the sample app. Launch Tutorial 4.

ocornut commented 5 years ago

Hello @b2soft

It is unclear what you are asking for. You are reporting a rendering issue while saying that all the rendering code is yours/custom. Therefore if this is not a problem in imgui_impl_dx12.cpp this is not a problem to solve here. Could you clarify your problem?

kairi-2525 commented 4 years ago

@ocornut V-Syncを無効にして、 "ClearRenderTargetView"を行うcommand_list_Aと "ImGui_ImplDX12_RenderDrawData"を行うcommand_list_B 二つのcommand_listを作り "ExecuteCommandLists(A);" "ExecuteCommandLists(B);" の順に実行した場合 高フレームレートの環境下でこれが発生しました。 フレームレートが下がると発生しません。

追記: デバッグモードでのみこれが発生します。 "ExecuteCommandLists(A);"これの"WaitForSingleObject"は"ExecuteCommandLists(B);"よりも前に行っています。

Translation by goolge

Disable V-Sync, Command_list_A to do "ClearRenderTargetView" and Command_list_B that performs "ImGui_ImplDX12_RenderDrawData" Create two command_lists "ExecuteCommandLists (A);" "ExecuteCommandLists (B);" When executed in the order This happened in a high frame rate environment. It does not occur when the frame rate decreases.

Postscript: This only happens in debug mode. "ExecuteCommandLists (A);" This "WaitForSingleObject" is done before "ExecuteCommandLists (B);".