3

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

我应该使用每秒 30...60 个滴答声 (TPS) 的 QTimer 并在计时器 SLOT 中调用 update() 吗?但是 QTimer 没有与实际的屏幕更新同步,并且 QTimer 不准确。我的 QTimer 速率可能太低(不流畅)或太高(吃太多 CPU) - 如何找到好的?我的实验表明,我的 linux 和 windows 测试机器需要不同的 QTimer 间隔才能顺利更新:linux:30 TPS,windows:50...60 TPS(如果我设置 1000/30 毫秒,我会看到崎岖的运动)。

或者也许我误解了动画框架,实际上它非常简单且适合这项任务?

4

2 回答 2

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 数据的示例。

于 2013-08-29T15:04:33.640 回答
1

远射,但排除动画框架后,您不会给我们留下太多选择。如果您的数学函数可以预先计算所有帧,那么只有一个想法才有效,即动态制作动画 gif 或 mng 并使用 QMovie 播放。但是从开销来看,我不确定它是否比动画框架更好。

于 2013-08-29T12:23:48.110 回答