QML Canvas清除图像缓存

时间:2017-03-12 20:41:28

标签: qt qml qtquick2

我有一个ListView代表中有一个大型模型和一个Canvas。滚动时,会按预期创建和删除新代理,但不会释放RAM。在某些时候,应用程序因此而被iOS杀死。 QPixmapCache::clear()QJSEngine::collectGarbage()QQmlEngine::trimComponentCache()都没有任何帮助。有没有办法释放记忆?

这是一个最小的例子(可以使用qmlscene运行)。向上和向下滚动,看看RAM消耗量上升

import QtQuick 2.6

ListView {
  width: 320
  height: 480
  model: 1000
  delegate: Canvas {
    id: canvas
    width: parent.width
    height: width

    onPaint: {
      var ctx = getContext("2d")
      ctx.strokeStyle = "red"
      ctx.lineWidth = 2
      ctx.beginPath()
      for (var i = 1; i < 20; ++i) {
        ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height);
      }
      ctx.stroke();
    }
  }
}

QTBUG-59467

1 个答案:

答案 0 :(得分:0)

内存消耗是关于QtQuick的一个反复出现的主题,您可以在documentation中找到一些潜在客户和策略。它随着时间的推移而有所改进,因此第一个建议当然是使用最新版本。

然后,对于所有优化,我建议您查看QtQuick profiler和/或GammaRay,以了解导致高内存使用的原因。

特别是关于ListView,您可能想要试验ListView的{​​{3}}属性,但为了解决您的问题,您可能需要减轻代理或应用程序,具体取决于问题的来源从

编辑:显然在您的情况下,这是一个真正的内存泄漏,正如您的机票cacheBuffer中的注释所突出显示的那样!