gpt4 book ai didi

c++ - TimerEvent 在 Windows 和 Mac 上的速度不同

转载 作者:行者123 更新时间:2023-11-30 01:37:28 26 4
gpt4 key购买 nike

我的 QT 应用程序依赖于 TimerEvent (startTimer/killTimer) 来动画 GUI 组件。然而,最近,我在我的 Mac 笔记本电脑上编译并运行了我的应用程序(与我开发时所用的 Windows 台式电脑相反),我发现现在一切似乎都以平时一半的速度运行/更新。

应用程序并不滞后,只是更新频率不如原来那么频繁。我应该怎么做才能保证所有平台上的应用程序计时一致?

或者,我应该为临时计时器事件使用不同的功能吗?我不希望这样做,因为 TimerEvent 对于将更新周期集成到 Widgets 来说非常方便,但如果它们提供一致的计时我会很感兴趣。

(上下文的基本示例代码):

// Once MyObject is created, counts to 20. 
// The time taken is noticeably different on each platform though.

class MyObject: public QObject {

public:
MyObject() {
timerId = startTimer(60);
}

protected:
void timerEvent(QTimerEvent* event) {
qDebug() << (counter++);
if(counter == 20) {
killTimer(timerId);
}
Object::timerEvent(event);
}

private:
int timerId = -1, counter = 0;
}

最佳答案

您可能会遇到准确性方面的问题。 QTimer's accuracy varies on different platforms :

Note that QTimer's accuracy depends on the underlying operating system and hardware. The timerType argument allows you to customize the accuracy of the timer. See Qt::TimerType for information on the different timer types. Most platforms support an accuracy of 20 milliseconds; some provide more. If Qt is unable to deliver the requested number of timer events, it will silently discard some.

您可以尝试将 Qt::PreciseTimer 传递给 startTimer(默认为 Qt::CoarseTimer),但另外我建议检查当前时间戳相对于某个开始时间或相对于前一个报价的时间戳。这将允许您调整处理定时器事件之间不同时间量的方式。这与 how time steps are sometimes handled in games 没有什么不同.

例如:

class MyObject: public QObject {

public:
MyObject() {
timerId = startTimer(60, Qt::PreciseTimer);
startTime = std::chrono::steady_clock::now();
}

protected:
void timerEvent(QTimerEvent* event) {
qDebug() << (counter++);
if(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - startTime) / 60 >= 20) {
killTimer(timerId);
}
Object::timerEvent(event);
}

private:
int timerId = -1, counter = 0;
std::chrono::steady_clock::time_point startTime;
}

另一个使用 QElapsedTimer 的例子:

class MyObject: public QObject {

public:
MyObject() {
timerId = startTimer(60, Qt::PreciseTimer);
elapsedTimer.start();
}

protected:
void timerEvent(QTimerEvent* event) {
qDebug() << (counter++);
if(elapsedTimer.elapsed() / 60 >= 20) {
killTimer(timerId);
}
Object::timerEvent(event);
}

private:
int timerId = -1, counter = 0;
QElapsedTimer elapsedTimer;
}

关于c++ - TimerEvent 在 Windows 和 Mac 上的速度不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49639928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com