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

细节

动画采取相同的图像,并将其向右移动到屏幕上;像素数量由当前时间与动画开始时间之间的差异以及时间结束决定,以使用timeGetTime与1ms resolution一起应用于整个窗口宽度的分数完成.动画吸引没有处理应用程序消息的循环;它调用了内部无效的(VCL库)方法Repaint,然后调用相关窗口的UpdateWindow,直接使用WM_PAINT调用消息过程.绘画处理程序的VCL实现使用BeginBufferedPaint.绘画本身是双重缓冲的.

这样做的目的是尽可能高的帧率,以便在屏幕上获得平滑的动画. (绘图使用双缓冲来消除闪烁,并确保任何一个屏幕上的整个图像或帧,通过调用消息过程直接进行消息和更新,而不进行其他消息处理.使用现代技术例如,用于Aero构图的BeginBufferedPaint))在其中,绘画是在几个BitBlt调用中完成的(一个用于动画的左侧,即移动在屏幕之外,还有一个用于动画的右侧,即屏幕上移动的内容. )

观看动画时,清晰可见tearing.这种情况发生在具有不同显卡的多个系统上的Windows Vista,7和8.1上.

处理这个问题的方法是降低绘制速度,或者在再次绘制之前尝试等待VSync.这可能是错误的做法,所以这个问题的答案可能是“完成其他事情:X”.如果是的话,很棒:)

(我真正想要的是要求DWM在这个特定的窗口中编写/使用全画幅的方法.)

我尝试了以下方法,没有一个删除所有可见的撕裂.所以问题是,在使用DWM组合时是否有可能避免撕裂,如果是这样呢?

方法尝试:

>通过GetDeviceCaps(Application.MainForm.Handle,VREFRESH)获取显示器刷新率;睡眠1 /刷新率毫秒.稍稍改善画面尽可能快,但可能是一厢情愿.感觉上略微平滑的动画率. (调整:正常睡眠和使用timeGetTime的高分辨率旋转等待)
>使用DwmSetPresentParameters尝试将更新限制为与代码绘制相同的速率. (变化:大量的缓冲区(cBuffer = 8)(无可见效果);指定监视器刷新率/ 1的源速率和使用上述代码进行睡眠(与刚尝试睡眠方式相同);指定每帧刷新1,10等(无可见效果);改变源帧覆盖(无可见效果)
>以各种方式使用DwmGetCompositionTimingInfo

>
>虽然cFramesPending> 0,旋转

>
>获取cFrame(框架组合)并旋转,而此数字不变;

>
>获取cFrame显示和旋转,而这并没有改变;

>
>通过添加qpcVBlank qpcRefreshPeriod计算睡眠时间,然后QueryPerformanceCounter返回的时间少于此值,旋转

>所有这些方法也通过绘画而变化,然后再次喷涂/睡觉;或反过来:睡觉然后画画.

几乎似乎有任何明显的效果,并且有什么影响是很难限定,可能只是由于帧率较低.没有防止撕裂,即没有使DWM使用窗口的DC的内容的“整体”副本组成窗口.

忠告赞:)

由于您使用BitBlt,请确保您的DIB是4字节/像素.使用3个字节/像素,GDI在DWM运行时非常慢,这可能是您的撕裂的根源.另一个BitBlt问题我遇到了,如果你的DIB有点大,比BitBlt调用让我们意想不到的长时间.如果您将一个呼叫分成较小的呼叫,而不仅仅是绘制一部分数据,那么它可能会有所帮助.这两个项目都帮助我,只因为BitBlt本身运行得太慢,从而导致视频制品.

窗口 – 在DWM组合的窗口上使用GDI绘制时可以防止撕裂伪影吗?的更多相关文章

  1. Canvas实现贝赛尔曲线轨迹动画的示例代码

    这篇文章主要介绍了Canvas实现贝赛尔曲线轨迹动画的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5 直播疯狂点赞动画实现代码 附源码

    为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞动作通常无限次,引导用户疯狂点赞,今天小编给大家分享HTML5 直播疯狂点赞动画实现代码 附源码,感兴趣的朋友一起看看吧

  3. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  4. 基于canvas的骨骼动画的示例代码

    这篇文章主要介绍了基于canvas的骨骼动画的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. html5如何在Canvas中实现自定义路径动画示例

    本篇文章主要介绍了html5如何在Canvas中实现自定义路径动画示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. 基于HTML5+Webkit实现树叶飘落动画

    本文给大家分享一段实例代码给大家介绍基于HTML5+Webkit实现树叶飘落动画效果,需要的朋友参考下吧

  7. Html5页面内使用JSON动画的实现

    这篇文章主要介绍了Html5页面内使用JSON动画的实现的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. html5实现图片转圈的动画效果——让页面动起来

    这篇文章主要介绍了html5实现图片转圈的动画效果——让页面动起来的相关资料,需要的朋友可以参考下

  9. 基于 HTML5 WebGL 实现的医疗物流系统

    物联网( IoT ),简单的理解就是物体之间通过互联网进行链接。这篇文章给大家介绍基于 HTML5 WebGL 实现的医疗物流系统,感兴趣的朋友跟随小编一起看看吧

  10. 为什么这个简单的动画无法在iOS 7上运行?

    在我的项目中,我有一个简单的动画,我只是从左到右移动一个视图.这在iOS6中运行良好,但是当我在iOS7中运行它没有做任何事情.有人知道为什么吗?如果动画非常简单,我该如何修复iOS7?我的代码是:我做了更新,我使用Xcode5和iOS7所以任何帮助人,你知道如何解决这个问题吗?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部