如何去抖动 QML 中的信号?

How to debounce a signal in QML?

我有一些属性具有请求重绘 canvas 的更改处理程序。这工作得很好,但我想去抖动信号,因为用户只能看到有限数量的刷新,并且某些数据项可能会非常频繁地更改。这会导致比用户看到的刷新次数多得多,并降低了 UI 的响应速度。

我看过 javascript 中的信号去抖动(网上有关于如何做到这一点的示例)并将其绑定到 QML,但我还没有弄清楚如何获得 QML 和javascript以那种方式一起工作呢。

我希望看到如下内容:

function rateLimitedRefresh(){
    // magic to limit to 30 frames per second
    canvas.requestPaint()
}

onValueChanged: {
    rateLimitedRefresh();
}

仅在 canvas 上调用 requestPaint 方法,每秒最多调用 30 次。

我使用了对 Mertanian 答案的修改。此修改在每帧级别强制执行帧速率限制,而不是每秒级别。

property var limitStartTime: new Date()

function rateLimitedRefresh(){
    // magic to limit to 30 frames per second
    var now = new Date();

    if (now - limitStartTime >= 32) {
        limitStartTime = now
        canvas.requestPaint()
    }
}

这样的事情怎么样:

property var limitStartTime: new Date()
property int refreshesThisSecond: 0

function rateLimitedRefresh(){ 
    // magic to limit to 30 frames per second
    if ((new Date()) - limitStartTime >= 33) {
        limitStartTime = new Date(limitStartTime.getTime() + 33)
        canvas.requestPaint() 
    }
}

onValueChanged: { 
    rateLimitedRefresh(); 
}