QML:如何删除全局 QSGTexture 对象?
QML: How to delete a global QSGTexture object?
我派生了 QQuickItem class (MyItem),它只是绘制一个纹理 (QSGTexture)。因为所有 MyItem 都绘制相同的纹理,所以我在它们之间共享一个 QSGTexture 实例。此实例是在第一次访问时创建的:
QSGTexture *MyItem::getGlobalTexture()
{
static auto tex = window->createTextureFromImage(QImage{s_textureName});
return tex;
}
一切都很好,但我想以某种方式在应用程序销毁时删除此纹理。
我的第一个想法是为其设置一些父对象,我选择了 QQuickWindow,但这是不可能的,因为它们位于不同的线程上:
window - mainThread, tex - SGRenderThread
另一种方法是在 MyApp 析构函数中将其删除,但此调用也将来自 mainThread 并且 SGRenderThread 可能已被删除.
另一个想法是使用具有 QueuedConnection
类型的 QCoreApplication::aboutToQuit
信号,因此删除将在 SGRenderThread
上发生(如果它仍然存在并且不会再绘制任何帧) .
删除全局 QSGTexture 对象的最佳和正确方法是什么?
我得出以下解决方案实际上是问题的第三个想法,它似乎适用于线程化和非线程化场景图
QSGTexture *MyItem::getGlobalTexture(QQuickWindow *window)
{
static QSGTexture *texture = [window]{
auto tex = window->createTextureFromImage(QImage{s_textureName});
//will delete the texture on the GSthread
QObject::connect(qApp, &QCoreApplication::aboutToQuit, tex, [tex]{ tex->deleteLater(); });
return tex;
}();
return texture;
}
我派生了 QQuickItem class (MyItem),它只是绘制一个纹理 (QSGTexture)。因为所有 MyItem 都绘制相同的纹理,所以我在它们之间共享一个 QSGTexture 实例。此实例是在第一次访问时创建的:
QSGTexture *MyItem::getGlobalTexture()
{
static auto tex = window->createTextureFromImage(QImage{s_textureName});
return tex;
}
一切都很好,但我想以某种方式在应用程序销毁时删除此纹理。
我的第一个想法是为其设置一些父对象,我选择了 QQuickWindow,但这是不可能的,因为它们位于不同的线程上:
window - mainThread, tex - SGRenderThread
另一种方法是在 MyApp 析构函数中将其删除,但此调用也将来自 mainThread 并且 SGRenderThread 可能已被删除.
另一个想法是使用具有 QueuedConnection
类型的 QCoreApplication::aboutToQuit
信号,因此删除将在 SGRenderThread
上发生(如果它仍然存在并且不会再绘制任何帧) .
删除全局 QSGTexture 对象的最佳和正确方法是什么?
我得出以下解决方案实际上是问题的第三个想法,它似乎适用于线程化和非线程化场景图
QSGTexture *MyItem::getGlobalTexture(QQuickWindow *window)
{
static QSGTexture *texture = [window]{
auto tex = window->createTextureFromImage(QImage{s_textureName});
//will delete the texture on the GSthread
QObject::connect(qApp, &QCoreApplication::aboutToQuit, tex, [tex]{ tex->deleteLater(); });
return tex;
}();
return texture;
}