【问题标题】:Is QPainter supposed to be cached between render calls?QPainter 是否应该在渲染调用之间缓存?
【发布时间】:2017-01-04 01:49:25
【问题描述】:

查看 QT 代码,QPainter 似乎正试图通过QWidget::sharedPainter() 重用现有的 QPainter 实例(参见 QPainterPrivate::attachPainterPrivate)。出于某种原因,尽管此 sharedPainter() 仅在单个渲染过程中设置,然后再次重置为 null。

QPainter 和相关联的 QPaintEngine 的预期生命周期是多少?它应该在每个应用程序生命周期中创建一次还是在每个渲染调用中创建一次?

QPaintEngine::begin() 怎么样?应该在每次渲染过程中调用它还是每次引擎创建时调用一次?

查看来自 QGLPaintEngineEx2 的代码似乎特别是 QPaintEngine::begin() 可能包含一些昂贵的初始化:

#if !defined(QT_OPENGL_ES_2)
    QGLExtensionMatcher extensions; // <- calls glGetString for the extension strings
    d->hasCompatibilityExtension = extensions.match("GL_ARB_compatibility");

    bool success = qt_resolve_version_2_0_functions(d->ctx)
                   && qt_resolve_buffer_extensions(d->ctx)
                   && (!QGLFramebufferObject::hasOpenGLFramebufferObjects()
                       || qt_resolve_framebufferobject_extensions(d->ctx));
    Q_ASSERT(success);
    Q_UNUSED(success);
#endif

    d->shaderManager = new QGLEngineShaderManager(d->ctx); // Dirties the shader manager

    glDisable(GL_STENCIL_TEST);
    glDisable(GL_DEPTH_TEST);
    glDisable(GL_SCISSOR_TEST);

#if !defined(QT_OPENGL_ES_2)
    glDisable(GL_MULTISAMPLE);
#endif

    d->glyphCacheType = QFontEngineGlyphCache::Raster_A8;

#if !defined(QT_OPENGL_ES_2)
#if defined(Q_WS_WIN)
    if (qt_cleartype_enabled
        && (fontSmoothingApproximately(1.0) || fontSmoothingApproximately(2.1)))
#endif
#if defined(Q_WS_MAC)
    if (qt_applefontsmoothing_enabled)
#endif
        d->glyphCacheType = QFontEngineGlyphCache::Raster_RGBMask;
#endif

#if defined(QT_OPENGL_ES_2)
    // OpenGL ES can't switch MSAA off, so if the gl paint device is
    // multisampled, it's always multisampled.
    d->multisamplingAlwaysEnabled = d->device->format().sampleBuffers();
#else
    d->multisamplingAlwaysEnabled = false;
#endif

    return true;
}

【问题讨论】:

    标签: qt


    【解决方案1】:

    应在使用点创建QPainter。您永远不应该缓存它们,或者让它们在绘画事件之后持续存在! Qt 所做的是一个实现细节。

    【讨论】:

    • 谢谢库巴。我向 QT 4.8.7 提交了一个错误报告,因为目前 QT 4.8 的行为不是这样bugreports.qt.io/browse/QTBUG-57880
    • "应该在使用点创建一个 QPainter。" - 对于QGraphicsStuff... thou,这不是真的,在那里你会在每个项目的绘画函数中获得一个指向预先存在的画家的指针作为参数。
    • @ddriver 显然,如果已经为您创建了一个画家,那么就使用它。否则,请在那里创建自己的。
    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多