我一直试图想出一个解决方案,将QtQuick 2.0场景与Direct3D场景一起使用很长一段时间,但不是很成功 . 我的目标是让Direct3D引擎以合理的速度(60 FPS?)与QML UI一起运行 . 这两件事都可以自己运行150-200 FPS . 但是当被迫在一个窗口内合作时,一切都只是香蕉 . 我调查了几种方法,但似乎没有一种方法足够:
Solution A: Rendering Direct3D scene into a texture, visualizing with QImage & QQuickPaintedItem
- 这个解决方案效果很好,根据网络上的其他人看来它似乎是首选的解决方案 . 然而,它很慢 . 全高清无法超过18-20 FPS . 从每个帧的GPU(D3D)到CPU(QImage)再到GPU(QML渲染器)的纹理传输链中明显存在瓶颈 . 尤其是QML端的CPU-> GPU处理速度太慢了!
Solution B: Rendering QtQuick scene into a FBO, then using Direct3D texture
- 这基本上是以前的解决方案 . 当UI不需要更新时,速度会更好一些 . 一旦开始制作动画,一切都会再次下降到18-20 FPS . QOpenGLFramebufferObject :: toImage()显然需要时间 . 在两侧实施纹理/ FBO双缓冲以减少失速并没有多大帮助 .
Solution C: QQuickView with enabled transparency on top of QWidget with Direct3D scene
用这种方法
- 也不幸运 . 只有当QQuickView在自己的窗口中时,透明度似乎才有效 . 一旦我把它放在同一个窗口的D3D QWidget之上,它立即停止工作并变得完全不透明 . 有人试图在那里做类似的事情:http://qt-project.org/forums/viewthread/5484,但我根本没有运气 . 也许保持两个完全分开的窗口(主D3D窗口无框架透明QML窗口)一直在彼此之上就可以了,但这听起来很傻 .
Solution X: Modify ANGLE library and try to extract & share D3D device context with my Direct3D renderer
- 尚未尝试过,尽可能避免任何库修改 . 这甚至是一个明智的选择吗?
我这里显而易见的问题是:我做错了吗?什么是首选解决方案? A,B,C,X或者可能是完全不同的东西?有人能指出我正确的方向吗?
TL;DR: 在Direct3D场景之上渲染QML场景的最快方法是什么?
1 回答
听起来你理想情况下想要一个混合解决方案X和自己写一个DirectX QPA插件 .
http://qt-project.org/wiki/Qt-Platform-Abstraction
如果你打开这样的努力,我打赌你会结识很多朋友!