Mus*_*sis 6 .net c# directx animation winforms
我正在WinForms应用程序中运行动画,速度为18.66666 ...每秒帧数(它与140 BPM的音乐同步,这就是为什么帧速率很奇怪).动画的每个单元都是预先计算的,动画由高分辨率多媒体计时器驱动.动画本身很流畅,但是我看到了大量的"撕裂",或者是因为屏幕刷新过程中被捕获而产生的文物.
当我拿出我的程序渲染的一组cels并将它们写入AVI文件,然后在Windows Media Player中播放AVI文件时,我看不到任何撕裂.我假设WMP平滑播放文件,因为它使用DirectX(或其他东西),并且能够将渲染与屏幕的刷新活动同步.它不会改变帧速率,因为动画与音频保持同步.
这是为什么WMP能够渲染动画而不会撕裂,或者我错过了什么?有没有什么方法可以使用DirectX(或其他东西),以使我的程序能够知道当前扫描线的位置,如果是,有什么方法可以使用该信息消除撕裂而不实际使用DirectX用于显示cels?或者我是否必须完全使用DirectX进行渲染才能解决此问题?
更新:忘了细节.我的应用程序使用Graphics.DrawImage将每个单元格渲染到PictureBox上.这是否比使用BitBlt慢得多,这样我可以通过使用BitBlt消除至少一些撕裂?
更新2:我看到的效果肯定不是闪烁(这与撕裂不同).我的面板是双缓冲的,为AllPaintingInWmPaint,UserPaint,OptimizedDoubleBuffer等设置控件样式,覆盖onPaintBackGround,依此类推.所有这些都是消除闪烁所必需的,但撕裂的问题仍然存在.当动画具有非常快速移动的物体或物体从非常快速地从亮到暗变化时,它尤其明显.当物体缓慢移动并且不会快速改变颜色时,撕裂效果就不那么明显了(因为连续的cels总是非常相似).
当图像更新与显示器的刷新率不同步时,就会发生撕裂。监视器显示前图像的一部分和新图像的一部分。当图像中的物体快速移动时,效果相当明显。
它在 Windows 窗体中无法修复,您无法获取视频适配器的垂直同步信号。您可以在DirectX 应用程序中。