【问题标题】:Many QPropertyAnimation instances VS single one?许多 QPropertyAnimation 实例 VS 单个?
【发布时间】:2013-08-31 18:18:56
【问题描述】:

我只是将QPropertyAnimation 用作蜱的来源。我设置了 1 秒动画,无限数量的循环,调用 start() 然后在“tick 处理程序”中观察 QElapsedTimer::elapsed() 以了解从动画开始经过了多少时间。所以,我不依赖循环计数、动画开始和停止值,也不关心正在动画的属性值。只是蜱虫的来源!

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

现在我需要为N 小部件制作动画(每个小部件使用不同类型的动画),并且我将以同样的方式使用 QPropertyAnimation - 作为同样愚蠢的滴答声源。

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

  • N 运行 QPropertyAnimation 实例,每个实例都连接到自己的小部件; Qt 文档说QPropertyAnimation 在滴答声之间以大约 60fps = ~17 ms 的速度发射滴答声。但是 Qt 不能同时从 N 不同的 QPropertyAnimation 实例触发滴答声,因为您可能在不同的 time() 开始了这些动画 - 假设 QPropertyAnimation::start() 之间有 8 毫秒。
  • 1 个正在运行的QPropertyAnimation 实例连接到某种代理对象,该代理对象将滴答声传输到N 小部件;所有这些小部件都有一个成员 'animTick(void)'。

【问题讨论】:

  • 根据您的帖子,恐怕您正在尝试做的事情非常复杂,并且与许多 Qt 习语背道而驰。这是一个开源项目吗?如果是这样,你能提供一个存储库的链接吗?
  • 我已经为此创建了一个聊天室。

标签: c++ qt animation cross-platform


【解决方案1】:

如果您想要的只是“ticks”的来源,那么您只需要QVariantAnimation,甚至不需要QPropertyAnimation

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

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

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

如果您想要一个向多个对象发送信号的通用计时器,您真的需要QTimer。这就是它的用途。这样您就不需要代理对象,因为您可以将一个信号连接到多个插槽。如果您愿意,您还可以将信号连接到信号 - 因此您可以转发或混叠信号。 QTimer 只是一个带有timerEvent(...)QObject,它发出一个信号。这就是它的全部。自己写太傻了。

【讨论】:

  • 据我了解,我需要 QBasicTimer 的刻度,甚至不需要任何类型的 Q***Animation 类。但是,如果我需要 100 个动画,我更喜欢 1 个 QBasicTimer 和 1 个代理对象来将刻度传输到 100 个 QObject,因为更多的 QBasicTimers,更多的 CPU 负载......
  • 不,如果你想要一个定时信号源,你想要一个QTimer,并且没有代理。我很确定。 QBasicTimer 是一个微优化,如果您想要在 QObject 中的报价来源。
  • 但是 QBasicTimer 更轻量级!不是很轻吗?但它甚至不使用 SIGNAL-SLOT,所以主事件循环不会每秒做 60 次无用的工作!
  • 如果使用 QBasicTimer 发出信号,这相当于使用 QTimer。这就是 QTimer 所做的一切。只需查看 QTimer 的源代码并亲自查看。如果您认为某些事情会导致性能下降,那么您最好让探查器转储来表明情况确实如此。否则你只是在幻想事物。审计器代码显示,恐怕 - 许多微优化实际上是零基础。
  • 据我了解,QBasicTimer 可以在不发出任何信号的情况下启动 QObject。我的想法没有分析器证据。我 99% 同意你的观点,我不会因为 QTimer 而受到任何显着的性能损失。剩下的 1% 是我对微优化的偏好 :)
猜你喜欢
  • 2019-07-20
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多