我有一个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();
}
}
}
答案 0 :(得分:0)
内存消耗是关于QtQuick的一个反复出现的主题,您可以在documentation中找到一些潜在客户和策略。它随着时间的推移而有所改进,因此第一个建议当然是使用最新版本。
然后,对于所有优化,我建议您查看QtQuick profiler和/或GammaRay,以了解导致高内存使用的原因。
特别是关于ListView,您可能想要试验ListView
的{{3}}属性,但为了解决您的问题,您可能需要减轻代理或应用程序,具体取决于问题的来源从
编辑:显然在您的情况下,这是一个真正的内存泄漏,正如您的机票cacheBuffer
中的注释所突出显示的那样!