2013-08-29 86 views
3

我需要更新QPixmap 1024x128(数学函数绘制图片)每秒30 ... 60次,我不想使用动画框架 - 我认为这是为此目的矫枉过正。数学函数的工作速度比1/60秒快得多,并且需要不断的工作时间,所以这不是问题。没有动画框架的Qt动画

我应该使用Q ...每秒30 ... 60滴答(TPS)和调用计时器SLOT更新()?但QTimer没有与实际的屏幕更新同步,QTimer也不准确。我的QTimer速率可能太低(不是平稳运动)或太高(吃太多的CPU) - 如何找到好的?我的实验表明,我需要不同的QTimer间隔为我的Linux和Windows测试机器获得顺利更新:Linux:30 TPS,窗口:50 ... 60 TPS(如果我设置1000/30毫秒,我会看到坚固的运动)。

或者,也许我误解动画框架,实际上这是非常简单和适当的这项任务?

+0

Qt对于类似的东西并不是很好。为了获得平滑的结果,请尝试Qt 5.1,QML,并最好使用着色器程序(GPU)计算图像。我认为这是您用Qt获得平滑60fps的最佳选择。或者只是在适当的时间间隔内满足QTimer的要求:不完全平滑但可能适用于桌面应用程序... – hyde

回答

1

远射,但排除了动画框架,你不会留下很多选择。一个想法,只有在你的数学函数可以事先计算所有帧时才起作用,就是在飞行中对动画gif或mng进行加粗,然后用QMovie进行播放。但是从开销来看,我不确定这比动画框架更好。

1

您不需要动画框架来做任何动画,但它是一个可能对您有用的选项。

这听起来像你认为QTimer应该同步到绘画事件,但实际上并不重要。

如果你想象的对象开始动画像这样在第一次时,从A移动到B.很多人,没有框架,只会有一个更新功能,做这样的事情: -

QPoint pos(pObject->getPos()); // get the current position 
pObject->setPos(pos + QPoint(2, 0); // set the position to previous + 2; 

在这种情况下,对象的更新取决于计算机运行的速度;无论渲染帧速率如何,对象的移动速度越快,对象的移动速度越快。要修复此问题,以使对象以相同的速率移动,而不管机器的计算能力如何,更新功能需要考虑到自上次更新和要素在: -

QPoint updateSpeed(30,0); // speed at which the object will move 
int deltaTime = m_timer.elapsed(); // how long since we last updated 

QPoint newPos = pObject->getPos() + QPoint(updateSpeed.X() * deltaTime, updateSpeed.Y()); 
pObject->setPos(newPos); 

所以,现在该对象的动画是时间依赖,无论在哪个渲染器将绘制对象的速度,它总是在运行相同的速率。在较慢的机器上,两次更新之间的时间间隔更长,因此与更快的机器相比,对象移动的距离更多是在更新之间。两台以不同速度运行的机器将在相同的时间内保持物体的移动距离相同。

回到你的问题,你说你是从一个数学函数计算图像,只要图像根据时间更新,就像上面例子中的动画对象是动画一样,然后您只需要一个计时器以每秒30或60帧的速度调用QPixmap上的update()函数,并且无需将其链接到图像数据计算的更新。

最后,如果这没有回答你的问题,据我了解,请张贴一个如何生成QPixmap数据的例子。

+0

**在较慢的机器上,更新之间的经过时间更长,因此对象的距离更新在更新之间更进一步,与更快的机器相比**并且这不会在极端情况下导致波涛汹涌的移动效果? – Greenflow

+1

@Greenflow,你是对的,如果机器跟不上,你会看到对象跳跃。这与你在玩网络视频游戏时所获得的滞后程度相同,但它是基于时间而不是固定数量来完成动画的。所有的运动物体都会根据时间行进一段距离,但不应该因为我们观察运动物体而发生变化。如果我看着你以恒定速度奔跑,闭上眼睛一秒钟,那么当我睁开眼睛时,你不会在我看到你的最后一个地方。 – TheDarkKnight

+0

@ Merlin069与我的问题不太相关。由于QTimer接口以毫秒为单位工作,并且封装了与机器速度相关的代码,因此我不必考虑您所解释的快速缓慢问题。我更新了我的问题,并创建了新的主题:http://stackoverflow.com/questions/18528300/choppy-scrolling-of-qpixmap-using-qt-animation-framework – pavelkolodin