没有动画框架的Qt动画

Qt animation without Animation Framework

本文关键字:动画 Qt 框架      更新时间:2023-10-16

我需要每秒更新30…60次QPixmap 1024x128(数学函数绘制图片),我不想使用动画框架-我认为这太过分了。数学函数的工作速度比1/60秒快得多,并且需要恒定的时间,所以它不是问题。

我应该使用每秒30…60次的QTimer(TPS)并在定时器SLOT中调用update()吗?但QTimer与实际屏幕更新不同步,QTimer不准确。我的QTimer率可能太低(运动不平稳)或太高(消耗太多CPU)——如何找到好的?我的实验表明,我的linux和windows测试机需要不同的QTimer间隔来获得平滑更新:linux:30 TPS,windows:50…60 TPS(如果我设置1000/30毫秒,我会看到崎岖的运动)。

或者我可能误解了动画框架,实际上它非常简单,适合这个任务?

很长时间,但排除了动画框架,我们没有太多选择。只有当你的数学函数能够预先计算出所有帧时,一个想法才有效,那就是在飞行中制作一个动画gif或mng,并用QMovie播放。但从头顶上看,我不确定这是否比动画框架更好。

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

听起来你认为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数据的示例。