C++ 多个QPropertyImation实例与单个实例?
我使用C++ 多个QPropertyImation实例与单个实例?,c++,qt,animation,cross-platform,C++,Qt,Animation,Cross Platform,我使用QPropertyAnimation只是作为记号的来源。我设置1秒动画,无限循环,调用start(),然后在“tick handler”中观察QeReleasedTimer::Appeased(),以了解从动画开始经过了多少时间。所以,我不依赖循环计数、动画开始和停止值,也不关心正在设置动画的属性值。只是蜱虫的来源 在此之前,我使用的是QTimer,它在Linux和Windows上给出了不同的结果:为了使Linux中的动画平滑,我必须使用QTimerinterval=1000/30,但对于
QPropertyAnimation
只是作为记号的来源。我设置1秒动画,无限循环,调用start()
,然后在“tick handler”中观察QeReleasedTimer::Appeased(),以了解从动画开始经过了多少时间。所以,我不依赖循环计数、动画开始和停止值,也不关心正在设置动画的属性值。只是蜱虫的来源
在此之前,我使用的是QTimer
,它在Linux和Windows上给出了不同的结果:为了使Linux中的动画平滑,我必须使用QTimer
interval=1000/30,但对于Windows 1000/60是最小值。所以我不得不使用#ifndef,但这是一个肮脏的代码。除此之外,QTimer使用信号槽机制,但QPropertyImation不使用,因此我的QApplication事件循环不忙于动画事件(对吗?)
现在我需要制作N
小部件的动画(每个小部件都有不同类型的动画),我将以同样的方式使用QPropertyAnimation-作为相同愚蠢的记号源
这些变体之间的CPU成本差异是什么:
运行N
实例,每个实例都连接到自己的小部件;Qt文档显示,QPropertyAnimation
fire滴答声在滴答声之间约为每秒60帧=~17毫秒。但是Qt不能同时从QPropertyAnimation
不同的N
实例触发勾号,因为您可能在不同的时间()启动了这些动画-假设QPropertyAnimation
QPropertyAnimation::start()之间有8毫秒
- 1个运行的
实例连接到某种代理对象,该代理对象将标记传输到QPropertyAnimation
小部件;所有这些小部件都有一个成员“animTick(void)”N
QVariantAnimation
,而不是QPropertyAnimation
动画越多,CPU成本越高。您只需要一个动画,它的valueChanged(QVariant)
信号连接到多个小部件
请注意,QBasicTimer
不是任何东西的来源,它是一个非常薄的包装器,它围绕着QObject::startTimer()
返回的计时器id。因此,它只在QObject
实例中工作,并且只在重新实现timerEvent(…)
时工作
QVariantAnimation
只是一个时间精确的节拍源,因此您无需重新发明轮子
如果您想要一个向多个对象发送信号的通用计时器,那么您确实需要一个
QTimer
。这就是它的目的。这样,您就不需要代理对象,因为您可以将一个信号连接到多个插槽。如果您愿意,还可以将信号连接到信号,这样您就可以转发或别名信号。QTimer
只是一个发出信号的QObject
,带有timerEvent(…)
。就这些。写自己的东西是愚蠢的。根据你的帖子,我担心你想做的事情是令人绝望的复杂,与许多Qt习惯用法背道而驰。这是一个开源项目吗?如果是这样的话,你能给我一个到存储库的链接吗?@KubaOber我已经建立了一个聊天室。据我所知,我需要QBasicTimer来制作ticks,而不是任何类型的Q***动画类。但如果我需要100个动画,我更喜欢1个QBasicTimer和1个代理对象来向100个QoObject传输滴答声,因为QBasicTimer越多,CPU负载就越大……不,如果你想要一个定时信号源,你就需要一个QTimer
,而不需要代理。我确信这一点QBasicTimer
是一个微优化,如果你想在QObject
中找到一个滴答声源。但是QBasicTimer更轻量级!不是很轻吗?但它甚至不使用信号槽,所以主事件循环每秒不会做60次无用的工作!如果使用QBasicTimer发出信号,这相当于使用QTimer。这就是QTimer所做的。只要看看QTimer的来源就可以了。如果您认为某个因素导致了性能损失,那么最好使用探查器转储来说明情况。否则你只是在幻想。audigger代码显示,我担心,许多微观优化实际上是零基础的。据我所知,QBasicTimer可以在不发出任何信号的情况下启动QObject。我的想法没有资料搜集的证据。我99%同意你的看法,我不会因为QTimer而受到任何明显的性能惩罚。剩下的1%是我对微优化的偏好:)