我试图在窗口中平滑地滚动位图。位图数据是动态生成的。实际绘图(包括BeginDraw
和EndDraw
,但不包括Present
)大约需要2毫秒。位图数据在绘图循环的每个回合中以恒定值移位(滚动)。大多数时间滚动都没问题,但是当我最大化应用程序窗口(和带有位图的窗口)时,滚动开始结束(调整SwapChain缓冲区并在窗口大小调整后重新创建RenderTarget)。
将BufferCount
值或SwapEffect
更改为DXGI_SWAP_EFFECT_SEQUENTIAL
无效。
我能做些什么才能摆脱这种口吃?我做错了什么?
您可以在https://github.com/code-kot/VisualizerTest6
找到测试应用的完整源代码以下是我的代码仅片段:
FDXGISwapChain: IDXGISwapChain;
// creating swapchain
SwapChainDesc.BufferDesc.Format := DXGI_FORMAT_B8G8R8A8_UNORM;
SwapChainDesc.SampleDesc.Count := 1;
SwapChainDesc.SampleDesc.Quality := 0;
SwapChainDesc.BufferUsage := DXGI_USAGE_RENDER_TARGET_OUTPUT;
SwapChainDesc.BufferCount := 4;
SwapChainDesc.OutputWindow := Self.Handle;
SwapChainDesc.Windowed := True;
SwapChainDesc.SwapEffect := DXGI_SWAP_EFFECT_DISCARD;
FDXGIFactory.CreateSwapChain(FD3D10Device, SwapChainDesc, FDXGISwapChain);
// creating render target
FDXGISwapChain.GetBuffer(0, IDXGISurface, DXGISurface);
RenderTargetProperties := D2D1RenderTargetProperties(
D2D1_RENDER_TARGET_TYPE_HARDWARE,
D2D1PixelFormat(DXGI_FORMAT_UNKNOWN, D2D1_ALPHA_MODE_PREMULTIPLIED),
DpiX, DpiY);
D2DFactory.CreateDxgiSurfaceRenderTarget(
DXGISurface,
RenderTargetProperties,
FRenderTarget);
// drawing
FRenderTarget.BeginDraw;
// ... drawing my bitmap
FRenderTarget.EndDraw;
FDXGISwapChain.Present(1, 0);
UPD
启动应用最大化无效。是的,我处理丢失的设备状况,但它永远不会发生。调整大小后重新创建所有资源无效。
使用C ++示例的答案也是可以接受的。