【发布时间】: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