2017-06-22 142 views
1

我试图把它存储作为创建成员指针中访问相关的渲染对象,因此它可以在以后访问:如何从一个QQuickFramebufferObject

QQuickFramebufferObject::Renderer* MyItem::createRenderer() const { 
    m_renderer = new MyItemRenderer(this); 
    return m_renderer; 
} 

...但是这行不通 - Qt要求createRenderer是一个const方法,所以我不能在其中分配m_renderer。我可以使用mutable,但这是一种黑客行为,具有风险,因为它可能会破坏Qt内部的假设。

任何正确的方法?

+0

顺便说一句,你为什么需要这样做? – peppe

+0

@peppe:因为我在QML之上实现了一个类似于QtQuick的系统(称为Snappy);在我的系统中,我希望子项的渲染器能够访问SnappyScene的渲染器(SnappyScene包含我系统中的所有项),因为这样他们就可以访问其modelViewMatrixStack,它的currentShader等。并且为了实现该访问,我遍历这样的指针:SomeSnappyItemRenderer - > SomeSnappyItem - > SnappyScene - > SnappyScene :: Renderer。 SnappyScene来自QQFBO。 –

+0

从概念上讲,QQFBO的设计是将所有状态存储在QQFBO子类中,渲染器访问它并*复制*渲染所需的东西(因为多线程而复制)。 – peppe

回答

0

我想到了一个办法:

MyItemRenderer::synchronize设置的项目的渲染器this。我不太喜欢这个,因为它是synchronize的滥用,但它肯定比mutable好得多。

0

这是怎么回事?

QQuickFramebufferObject::Renderer* MyItem::createRenderer() const { 
    return new MyItemRenderer(); 
} 

更多信息here。在本页末尾,它陈述如下:

但是,有一个特殊情况时,FBO必须重新创建,无论何时:将窗口移动到具有不同设备像素比率的屏幕时。例如,在OS X系统上移动视网膜和非视网膜屏幕之间的窗口,固有地需要一个新的,两倍或一半大小的帧缓冲器,即使窗口尺寸在独立于设备的单元中是相同的。就像普通的调整大小一样,Qt准备通过在必要时请求一个具有不同大小的新帧缓冲区对象来处理这个问题。这里有一个可能的缺陷是应用程序缓存了工厂功能的结果:避免这种createFramebufferObject()和createRenderer()绝不能缓存它们的返回值。只需创建一个新实例并将其返回。把事情简单化。

+0

虽然我不是在谈论*缓存*。 *缓存*意味着在多次createRenderer调用中返回相同的Renderer对象。我正在讨论简单地存储/访问我返回* *的渲染器。 –