如何在窗口中滚动平滑的位图?

时间:2016-06-07 10:33:37

标签: c++ delphi windows-7 directx delphi-xe5

我试图在窗口中平滑地滚动位图。位图数据是动态生成的。实际绘图(包括BeginDrawEndDraw,但不包括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 ++示例的答案也是可以接受的。

0 个答案:

没有答案