许多QPropertyAnimation实例与单个实例相比

Many QPropertyAnimation instances VS single one?

本文关键字:实例 单个 QPropertyAnimation 许多      更新时间:2023-10-16

我将QPropertyAnimation简单地用作记号的来源。我设置了1秒的动画,无限数量的循环,调用start(),然后在"tick handler"中观察QElapedTimer::elapsed(),以了解从动画开始经过了多少时间。所以,我不依赖循环数,动画的开始和停止值,我也不关心正在被动画化的属性值。只是蜱虫的来源!

在此之前,我使用的QTimer在Linux和Windows上会产生不同的结果:为了在Linux中使动画流畅,我必须使用QTimer间隔=1000/30,但对于Windows,1000/60是最小值。所以我不得不使用#ifndef,但这是一个肮脏的代码。除此之外,QTimer使用信号槽机制,但QPropertyAnimation没有,所以我的QApplication事件循环并不忙于动画事件(我说得对吗?)

现在,我需要为N小部件制作动画(每个小部件都有不同类型的动画),我将以同样的方式使用QPropertyAnimation——作为同样愚蠢的蜱虫源。

这些变体之间的CPU成本差异是什么:

  • 运行CCD_ 7实例的CCD_;Qt文档表示,QPropertyAnimation以约60fps的速度发射,两次发射之间的间隔约为17毫秒。但是Qt不能同时从N个不同的QPropertyAnimation实例中触发tick,因为您可能在不同的时间()启动了这些动画——假设QPropertyAnimation::start()之间有8毫秒
  • 1个连接到某种代理对象的单个运行的QPropertyAnimation实例,该代理对象将记号传输到N小部件;所有这些小部件都有一个成员"animTick(void)"

如果你只想要一个"ticks"的来源,那么你只需要一个QVariantAnimation,甚至不是QPropertyAnimation

动画越多,CPU成本就越高。您只需要一个动画,其valueChanged(QVariant)信号连接到多个小部件。

注意,QBasicTimer不是任何东西的来源,它是QObject::startTimer()返回的定时器id的一个非常薄的包装器。因此,它仅在QObject实例中工作,并且仅在重新实现timerEvent(...)时工作。

QVariantAnimation只是一个定时良好的滴答声来源,因此您不需要重新发明轮子。

如果您想要一个向多个对象发送信号的通用计时器,那么您确实需要一个QTimer。这就是它的用途。这样,您就不需要代理对象,因为您可以将一个信号连接到多个插槽。如果你愿意,你也可以将信号连接到信号,这样你就可以转发或别名信号。CCD_ 23只是具有发射信号的CCD_ 25的QObject。这就是它的全部内容。自己写是愚蠢的。