我使用 a QSGGeometry
, QSGVertexColorMaterial
& a在这里的派生类QSGGeometryNode
上实时绘制一些东西。QQuickItem
MyQuickItem
以下是我updatePaintNode
的重绘逻辑关键所在的方法。
QSGNode * MyQuickItem::updatePaintNode(QSGNode * oldNode, UpdatePaintNodeData * updatePaintNodeData) {
if (!oldNode) {
oldNode = new QSGNode;
}
oldNode->removeAllChildNodes();
QSGGeometry * geometry = GetMyGeometry();
QSGVertexColorMaterial * material = new QSGVertexColorMaterial;
QSGGeometryNode * child_node = new QSGGeometryNode;
child_node->setGeometry(geometry);
child_node->setMaterial(material);
child_node->setFlag(QSGNode::OwnsMaterial);
oldNode->appendChildNode(child_node);
return oldNode;
}
问题:
上述逻辑效果很好。功能上完全没有问题。也没有性能问题。但我担心我会导致内存泄漏。看看上面updatePaintNode
我分配原始指针的方法中的以下两行。
QSGVertexColorMaterial * material = new QSGVertexColorMaterial;
QSGGeometryNode * child_node = new QSGGeometryNode;
我分配它们并且我不删除它们。这是因为它们应该被删除的点是在updatePaintNode
完成之后。那不在我的控制之下。
问题:
如何确保 2 个指针material
&child_node
正确地从内存中清除?
是否child_node->setFlag(QSGNode::OwnsMaterial)
像我在上面所做的那样设置了指向QtSceneGraph的指针的所有权并减轻了我删除指针的负担?
次要问题:
我正在使用oldNode->removeAllChildNodes()
清除上一帧中绘制的数据。这是在绘制新数据之前清除屏幕上先前数据的好方法吗?
PS:
我重申:这个实现没有性能问题。我只是想确保我没有造成任何内存泄漏。我尝试使用material
&child_node
作为智能指针,如下所示:
auto material = std::make_shared<QSGVertexColorMaterial>();
auto child_node = new std::make_shared<QSGGeometryNode>();
但是,当material
&child_node
稍后从内存中自动清除时,这会导致崩溃。