【发布时间】:2013-08-30 08:27:22
【问题描述】:
我创建了QPropertyAnimation 并将其连接到我的SonogramWidget,它可以在动画事件上垂直滚动一张长图。 “长图”由 100 个预先计算好的 QPixmap 对象组成,1024x128 一个接一个地垂直放置。它们显示在 SonogramWidget::paintEvent() 和 QPainter 中。绘图过程不会一次绘制所有QPixmap,但仅对它们可见,考虑到小部件高度和当前垂直偏移。 CPU 几乎是空闲的,因为QPixmap 是显示图片的最快方式。滚动时没有大的计算,因为这100个QPixmaps都是预先计算好的并存储在内存中的。
我看到了奇怪的效果:脉动运动:整个图像每秒 2 次略微加速,并且比通常的运动快 1..2 个像素。当我用单个 60 fps QTimer 替换 Qt Animation Framework 并在其 SLOT 中滚动图像时,效果相同。
视频:http://www.youtube.com/watch?v=KRk_LNd7EBg#t=8(从 00:08 开始观看;我的 firefox 为视频播放本身添加了更多的剪辑,google chrome 播放视频更好)。
我看到我的 Linux 和 Windows 版本的效果相同。
解决方案
我发现了问题:“切碎”不是错误,而是一个功能!它是整数计算的一个特性,所以有时我们必须为动画设置不同的数字,例如:16,16,16,16,16,16,17,16,16,16,16,16,@ 987654330@,....
【问题讨论】:
-
你的 CPU 负载在说什么?滚动越慢,可见的“白色”越多。由于要绘制的像素是白色还是黑色对 QPainter 没有影响,因此它必须与您的计算有关。如果您的机器接近其极限,我会期待像这样奇怪的输出伪影。还是这种“变慢”是一种视错觉?不确定。
-
所有的 QPixmap 都是预先计算好的并存储在内存中。滚动期间没有计算。只有黑色像素,整个图像的对比度较低,我们没有注意到所描述的效果。
-
我不知道,所以纯属猜测。但有时即使这也有帮助。 :-) 那么,您是否可以将所有内容放在一个像素图中?只是暂时的?只是为了排除这 100 个垂直 QPixmap 以某种方式奇怪地交互?
-
尽管 QPixmap 图像是预先计算的,但您正在复制 SonogramWidget 的paintEvent 中的可见图像,不是吗?如果是这样,您可以发布该代码吗?
-
@Greenflow 猜测 - 是我需要的!我试过了,我记得,我看到了同样的效果,所以我拒绝了这个策略。
标签: c++ qt animation real-time qpixmap