qt - QML Canvas.requestAnimationFrame 爆炸

标签 qt canvas qml qtquick2

我正在尝试使用 QML Canvas.requestAnimationFrame 来绘制一些自定义动画。我预计所提供的回调每帧调用一次,大约每秒 60 次。我的代码是:

Canvas {
    id: canvas

    width: 600
    height: 600

    function draw() {
    }

    Component.onCompleted: {
        var i = 1;

        function drawFrame() {
            requestAnimationFrame(drawFrame)
            console.log("Frame callback: " + i++)
            draw()
        }

        drawFrame()
    }

    onPaint: {
        draw()
    }

}

我看到回调被调用的频率更高。计数器在几秒钟内达到 70000,之后应用程序变得完全无响应。

我做错了什么?

最佳答案

您的 drawFrame() 函数将自身作为渲染回调函数传递,您陷入了循环。您要么只想按需渲染,例如在用户输入后将资源保持在最低限度,要么您有一些更改每一帧的逻辑,或者您只需要连续渲染。

如果您想要基于时间的渲染,只需使用计时器:

import QtQuick 2.4

Canvas  {
    id: cvs
    width: 600; height: 600
    contextType: "2d"
    property real i : 0

    onPaint: {
        console.timeEnd("t")
        if (context) {
            context.clearRect (0, 0, width, height)
            context.fillRect(i, 50, 50, 50 + i)
        }
        console.time("t")
    }

    Timer {
        interval: 1
        repeat: true
        running: true

        onTriggered: {
            cvs.i = (cvs.i + 0.1) % cvs.width
            cvs.requestPaint()
        }
    }
}

编辑:

刚刚更新了代码:

onPaint 调用会与显示帧速率同步,即使计时器间隔设置为 1 毫秒(如运行上述示例时的日志所示)。 事实上,分配给 onTriggered 信号的整个 block 每毫秒执行一次,但 requestPaint() 确保同步渲染调用以获得最佳性能,就像 requestAnimationFrame() 适用于 HTML Canvas 。

显然,QML.Canvas 内的 requestAnimationFrame() 无法按预期工作,并且没有太多文档...

希望这有帮助!

关于qt - QML Canvas.requestAnimationFrame 爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30709220/

相关文章:

javascript - 元素未随当前玩家操作更新

javascript - 如何让汽车沿着路径行驶

python - 如何将 qml ScatterSeries 添加到现有的 qml 定义的 ChartView?

c++ - 生成组合虚拟按键以获取 â、ó、ć 等更复杂的字符

c++ - 如何使用 QT 扩展资源管理器上下文菜单?

c++ - 如何在 Linux 中运行 FlashWindow?

c++ - 带有 QAbstractItemModel 和上下文菜单的 Qml 2.0 TableView

java - 平滑位图旋转 android SurfaceView

c++ - 取消选择单选按钮

c++ - 如何修复 'Could not load the Qt platform plugin "xcb“在 ""中,即使它已被发现。”在fixup_bundle宏之后?