gpt4 book ai didi

windows - 在具有 DWM 组合的窗口上使用 GDI 进行绘制时,是否可以防止撕裂伪影?

转载 作者:可可西里 更新时间:2023-11-01 12:25:58 24 4
gpt4 key购买 nike

我正在窗口上使用双缓冲 GDI 绘制动画,在启用 DWM 组合的系统上,并且看到清晰可见 tearing在屏幕上。有没有办法防止这种情况?

细节

动画采用相同的图像,并在屏幕上从右向左移动;跨越的像素数由当前时间与动画开始时间和结束时间之间的差异决定,使用 timeGetTime 获得应用于整个窗口宽度的完整分数。与 1ms resolution .动画循环绘制,不处理应用消息;它调用(VCL 库)方法 Repaint 内部无效,然后调用 UpdateWindow 对于有问题的窗口,直接用 WM_PAINT 调用消息过程.绘制处理程序的 VCL 实现使用 BeginBufferedPaint .绘画本身是双缓冲的。

这样做的目的是拥有尽可能高的帧率,以便在整个屏幕上获得流畅的动画效果。 (绘图使用双缓冲来消除闪烁并确保整个图像或帧在任何时候都在屏幕上。它通过调用消息过程直接失效和更新,不做其他消息处理。绘画是使用现代技术实现的(例如,BeginBufferedPaint) 用于 Aero 合成。) 在此过程中,绘制是在几个 BitBlt 调用中完成的(一个用于动画左侧,即屏幕外移动的内容,另一个用于动画右侧,即屏幕上移动的内容。 )

看动画的时候清晰可见tearing . 这发生在具有不同显卡的多个系统上的 Windows Vista、7 和 8.1 上。

我处理这个问题的方法是降低绘制的速度,或者在再次绘制之前尝试等待 VSync。这可能是错误的方法,因此这个问题的答案可能是“完全做其他事情:X”。如果是这样,太好了:)

(我真正想要的是一种让 DWM 为这个特定窗口组合/仅使用完全绘制的框架的方法。)

我尝试了以下方法,但没有一种方法可以消除所有可见的撕裂。因此问题是,在使用 DWM 组合时是否可以避免撕裂,如果可以,如何避免?

尝试的方法:

  • 通过 GetDeviceCaps(Application.MainForm.Handle, VREFRESH) 获取显示器刷新率;休眠 1/刷新率毫秒。尽快比绘画略有改进,但可能是一厢情愿的想法。感知上稍微不那么平滑的动画速率。 (调整:正常 Sleep 和使用 timeGetTime 的高分辨率旋转等待。)
  • 使用 DwmSetPresentParameters 尝试将更新限制为与代码绘制相同的速率。 (变化:大量缓冲区(cBuffer = 8)(无可见效果);指定监视器刷新率/1的源速率并使用上述代码休眠(与尝试休眠方法相同);指定每帧的刷新1、10 等(无可见效果);更改源帧覆盖范围(无可见效果。)
  • 使用 DwmGetCompositionTimingInfo 以多种方式:
  • 虽然 cFramesPending > 0,自旋;
  • 获取 cFrame (帧组成)并旋转,而这个数字不会改变;
  • 获取 cFrameDisplayed并旋转,而这不会改变;
  • 通过添加 qpcVBlank + qpcRefreshPeriod 来计算 sleep 时间,然后同时 QueryPerformanceCounter返回小于此时间的时间,旋转
  • 所有这些方法也因绘画而变化,然后在再次绘画之前旋转/ sleep ;或者反过来: sleep 然后画画。

  • 似乎很少有任何可见的效果,并且很难确定有什么效果,可能只是较低的帧速率的结果。 None 防止撕裂,即没有使 DWM 使用窗口 DC 内容的“完整”副本组成窗口。

    建议赞赏:)

    最佳答案

    由于您使用的是 BitBlt ,确保您的 DIB 为 4 字节/像素。使用 3 个字节/像素,GDI 在 DWM 运行时非常慢,这可能是您撕裂的根源。另一个 BitBlt如果您的 DIB 比 BitBlt 稍大,我遇到的问题调用 make 花费了出乎意料的长时间。如果您将一个调用拆分为更小的调用而不是仅绘制一部分数据,则可能会有所帮助。这两个项目对我的案例都有帮助,只是因为 BitBlt本身运行速度太慢,从而导致视频伪像。

    关于windows - 在具有 DWM 组合的窗口上使用 GDI 进行绘制时,是否可以防止撕裂伪影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26162308/

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