![]() |
单身的跑步鞋 · httprunner 3.x学习20 - ...· 6 月前 · |
![]() |
单身的打火机 · QueryDsl在连接时获取所有记录,而不考 ...· 9 月前 · |
![]() |
聪明伶俐的红薯 · Python中如何将String类型转换为变 ...· 1 年前 · |
![]() |
欢快的四季豆 · 转录因子Osterix对成骨细胞<em>C ...· 1 年前 · |
我正在绘制一个使用双缓冲GDI在窗口上的动画,在启用DWM组合的系统上,并在屏幕上看到明显可见的 tearing 。有什么办法可以防止这种情况发生吗?
详细信息
动画接受相同的图像,并将其向左移动到屏幕上;像素数由当前时间与动画开始时间和结束时间之间的差异决定,以获得一个分数完成,该分数被应用于整个窗口宽度,使用
timeGetTime
和一个
1ms resolution
。动画在不处理应用程序消息的情况下绘制一个循环;它调用(VCL库)方法
Repaint
,该方法在内部无效,然后为所讨论的窗口调用
UpdateWindow
,直接使用
WM_PAINT
调用消息过程。油漆处理程序的VCL实现使用
BeginBufferedPaint
。绘画本身是双重缓冲的。
这样做的目的是有一个尽可能高的帧速率,以获得一个顺利的动画在屏幕上。(绘图使用双缓冲以消除闪烁,并确保整个图像或帧在任何时候都在屏幕上。它通过调用消息过程直接使其无效和更新,而不执行其他消息处理。绘画是用现代技术(如BeginBufferedPaint)来实现的。在这个过程中,绘画是在两个BitBlt调用中完成的(一个用于动画的左侧,即屏幕外移动的内容,另一个用于动画的右侧,即屏幕上的移动)。
当观看动画时,有明显可见的 tearing . 出现在Windows上,7和8.1出现在不同显卡的多个系统上。
我处理这一问题的方法是降低绘制速度,或者在重新绘制之前尝试等待VSync。这可能是错误的方法,所以这个问题的答案可能是“完全做其他的事情: X”。如果是这样,那就太好了:)
(我真正想要的是一种方法,要求DWM只为这个特定的窗口编写/使用完全绘制的框架。)
我尝试过以下方法,但没有一种方法可以消除所有可见的撕裂。因此,问题是,在使用DWM组合物时,是否有可能避免撕裂,如果是,如何避免撕裂?
尝试了以下方法:
GetDeviceCaps(Application.MainForm.Handle, VREFRESH)
获取监视器刷新速率;休眠1/刷新速率毫秒。稍微比绘画进步得快,但可能是一厢情愿的。感觉稍不流畅的动画率。(调整:普通
Sleep
和使用
timeGetTime
的高分辨率自旋等待。)
DwmSetPresentParameters
尝试将更新限制在代码绘制的相同速率上。(变化:大量缓冲区(cBuffer = 8) (无可见效果);指定监视器刷新速率/ 1的源速率并使用上述代码休眠(与尝试休眠方法相同);指定1、10等帧的刷新(无可见效果);更改源帧覆盖(无可见效果)。
DwmGetCompositionTimingInfo
:
-
- While `cFramesPending` > 0, spin;
-
- Get `cFrame` (frame composed) and spin while this number doesn't change;
-
- Get `cFrameDisplayed` and spin while this doesn't change;
-
- Calculating a time to sleep to by adding `qpcVBlank + qpcRefreshPeriod`, and then while `QueryPerformanceCounter` returns a time less than this, spin
很少有明显的效果,有什么影响是很难合格的,可能只是一个较低的帧速率的结果。无一防止撕裂(没有使DWM用窗口DC的内容的“完整”副本组成窗口)。
谢谢你的建议:)
由于您使用的是
BitBlt
,请确保您的DIBs为4字节/像素。使用3个字节/像素,当DWM运行时,GDI非常慢,这可能是撕裂的来源。我遇到的另一个
BitBlt
问题是,如果您的DIB比
BitBlt
调用要花费的时间要长得出人意料。如果您将一个调用拆分为较小的调用,而不是只提取一部分数据,则可能会有所帮助。这两项都对我的情况有所帮助,只是因为
BitBlt
本身运行太慢,从而导致了视频伪影。
Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
扫码关注腾讯云开发者
领取腾讯云代金券