画布:缓存imageData

时间:2016-01-04 17:19:46

标签: qt qml

在之前的问题(propagateComposedEvents: mouse data not accurate?)中,我有一个例行程序(如下),用于检查鼠标点击点是否在Canvas组件的透明像素上。

var imageData = ctx.getImageData(mouseX, mouseY, 1, 1)

是否存在缓存“imageData”的表现性原因,因为在我的用例中,它不会改变?或者内存问题会反对缓存。或者我只是盯着那条线太长了......

MouseArea {
        anchors.fill: parent
        drag.target: parent

        propagateComposedEvents: true

        onClicked: {
            var ctx = parent.getContext("2d")
            var imageData = ctx.getImageData(mouseX, mouseY, 1, 1)

            if (imageData.data[3] == 0 ){
                console.log("graphic alpha clicked:", mouseX, mouseY);
                 mouse.accepted = false;

            } else {
                 mouse.accepted = true;
            }
        }
    }

1 个答案:

答案 0 :(得分:3)

图片可能不会改变,但是看看你如何只获得一个像素,并且考虑到点击的位置会发生变化,除非你缓存整个图像,否则缓存是没有意义的。

你应该真正介绍一下,因为这里有几个因素:

  • imageData检索涉及VRAM到RAM传输 - 即使对于单个像素也是如此
  • 这种情况发生的频率
  • 整个图像有多大,完全缓存它是否可行

即使它不是一个性能热点,最好是高效,做不必要的工作只是因为你可以逃脱它是一个坏习惯,它消耗能源,CPU时间和耗尽电池。做很多事情最终会让你陷入困境,因为那些堆积起来。