Direct3D场景之上的QtQuick 2.0场景

PiN*_*PiN 6 qt direct3d qml 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场景的最快方法是什么?

Goz*_*Goz 1

听起来您理想地想要解决方案 X 和自己编写一个 DirectX QPA 插件的混搭。

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

我敢打赌,如果你开源这样的努力,你会交很多朋友!