我正在使用带有自定义 OpenGL 渲染器的 QtQuick(从 QtQuick 的角度自定义,因为它只是OpenSceneGraph)。为此,我创建了一个继承自QQuickFramebufferObject的自定义QQuickItem ,然后创建了一个继承自QQuickFramebufferObject ::createRenderer()中的QQuickFramebufferObject::Renderer的自定义渲染器。这是有据可查的,这些步骤没有问题。
现在发生的情况是,为了以后访问,在QQuickFramebufferObject::createRenderer()中创建的渲染器实际上是缓存的(它实际上是在QQuickFramebufferObject构造函数中实例化并简单地在QQuickFramebufferObject::createRenderer()中返回。这工作正常,我可以看不到直接的其他编码方式,因为创建的渲染器稍后用于对诸如geometryChanged或mousePressEvent 之类的事件做出反应,例如
////////////////////////////////////////////////////////////////////////////////
void OsgItem::geometryChanged(const QRectF& newGeometry, const QRectF& oldGeometry)
{
if (m_renderer)
m_renderer->m_window->getEventQueue()->windowResize(newGeometry.x(), newGeometry.y(), newGeometry.width(), newGeometry.height());
QQuickFramebufferObject::geometryChanged(newGeometry, oldGeometry);
}
////////////////////////////////////////////////////////////////////////////////
void OsgItem::mousePressEvent(QMouseEvent *event)
{
m_renderer->m_window->getEventQueue()->mouseButtonPress(event->x(), event->y(), button(*event));
update();
}
,其中 OsgItem 是我的自定义QQuickFramebufferObject而m_renderer是我的自定义QQuickFramebufferObject::Renderer。
问题是createRenderer()是 const (这并不是真正的缓存东西的邀请),并且这篇论文明确指出不应该缓存渲染器 - (尽管官方文档中没有说明)。
这里有什么问题?有什么我错过的吗?你能看到我可以编码的另一种干净的方式吗?