Direct3D场景之上的QtQuick 2.0场景

时间:2014-02-11 11:31:07

标签: qt qml direct3d qt-quick qtquick2

我一直试图找到一个解决方案,将QtQuick 2.0场景与Direct3D场景一起使用很长一段时间,但不是很成功。我的目标是让Direct3D引擎以合理的速度(60 FPS?)与QML UI一起运行。这两件事都可以自己运行150-200 FPS。但是当被迫在一个窗口内合作时,一切都只是香蕉。我调查过几种方法,但似乎没有一种方法足够:

解决方案A:将Direct3D场景渲染到纹理中,使用QImage& QQuickPaintedItem

  • 此解决方案运行良好,并且它似乎是网络上其他人的首选。然而,它很慢。全高清无法超过18-20 FPS。从每个帧的GPU(D3D)到CPU(QImage)再到GPU(QML渲染器)的纹理传输链中明显存在瓶颈。特别是QML方面的CPU-> GPU处理太慢了!

解决方案B:将QtQuick场景渲染到FBO中,然后使用Direct3D纹理

  • 这基本上是以前的解决方案。当UI不需要更新时,速度会更好一些。一旦开始制作动画,一切都会再次下降到18-20 FPS。 QOpenGLFramebufferObject :: toImage()显然需要时间。在两侧实施纹理/ FBO双缓冲以减少失速并没有多大帮助。

解决方案C:在具有Direct3D场景的QWidget上启用透明度的QQuickView

  • 这种方法也不幸运。只有当QQuickView在自己的窗口中时,透明度似乎才有效。一旦我把它放在同一个窗口的D3D QWidget之上,它立即停止工作并变得完全不透明。有人试图在那里做类似的事情:http://qt-project.org/forums/viewthread/5484,但我根本没有运气。也许保持两个完全分开的窗口(主D3D窗口+无框透明QML窗口)一直在彼此之上就可以了,但这听起来很傻。

解决方案X:修改ANGLE库并尝试提取&与我的Direct3D渲染器共享D3D设备上下文

  • 尚未尝试过,尽可能避免任何库修改。这甚至是一个明智的选择吗?

我明显的问题是:我做错了吗?什么是首选解决方案? A,B,C,X或者可能是完全不同的东西?有人能指出我正确的方向吗?

TL; DR: 在Direct3D场景之上渲染QML场景的最快方法是什么?

1 个答案:

答案 0 :(得分:1)

听起来你理想情况下想要一个混合解决方案X并自己写一个DirectX QPA插件。

http://qt-project.org/wiki/Qt-Platform-Abstraction

如果你打开这样的努力,我会打赌你会结识很多朋友!!