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;
}