2014-02-11 29 views
6

Ich habe versucht, eine Lösung für eine QtQuick 2.0-Szene zusammen mit einer Direct3D-Szene für eine ganze Weile zu finden, war aber nicht sehr erfolgreich. Mein Ziel ist es, eine Direct3D-Engine mit einer vernünftigen Geschwindigkeit (60 FPS?) Zusammen mit der QML UI zu verwenden. Beide Dinge laufen gut bei 150-200 FPS alleine. Aber wenn sie gezwungen werden, in einem Fenster zusammenzuarbeiten, wird alles nur noch banalisiert. Ich habe mehrere Ansätze untersucht, aber keiner von ihnen scheint genug, um ausreichend zu sein:QtQuick 2.0 Szene oben auf Direct3D Szene

Eine Lösung: Rendering Direct3D Szene in eine Textur, Visualisierung mit QImage & QQuickPaintedItem

  • diese Lösung recht gut funktioniert und es scheint nach anderen Leuten im Web der bevorzugte zu sein. Es ist jedoch sehr langsam. Ich konnte nicht mehr als 18-20 FPS in Full HD haben. Der Flaschenhals lag eindeutig in der Textur-Transfer-Kette von GPU (D3D) zu CPU (QImage) und zurück zu GPU (QML-Renderer) für jeden Frame. Vor allem die CPU-> GPU-Verarbeitung auf der QML-Seite war viel zu langsam!

Lösung B: Rendering QtQuick Szene in ein FBO, dann Textur Direct3D mit

  • dies ist im Grunde die bisherige Lösung umgekehrt. Die Geschwindigkeit ist ein bisschen besser, wenn die Benutzeroberfläche keine Aktualisierung benötigt. Sobald es anfängt zu animieren, fällt alles wieder auf 18-20 FPS. QOpenGLFramebufferObject :: toImage() braucht offensichtlich seine Zeit. Das Implementieren von Textur-/FBO-Doppelpufferung auf beiden Seiten, um Staus zu reduzieren, hilft nicht wirklich.

Lösung C: QQuickView mit aktivierter Transparenz auf der QWidget mit Direct3D Szene

  • war mit diesem Ansatz auch nicht glücklich. Es scheint, als ob die Transparenz nur funktioniert, wenn sich QQuickView in einem eigenen Fenster befindet. Sobald ich es im selben Fenster auf mein D3D QWidget legte, hörte es sofort auf zu arbeiten und wurde vollständig undurchsichtig. Jemand versuchte auch dort etwas Ähnliches: http://qt-project.org/forums/viewthread/5484, aber mit dieser Lösung hatte ich überhaupt kein Glück. Vielleicht würde es ausreichen, zwei vollständig voneinander getrennte Fenster (Haupt-D3D-Fenster + rahmenloses transparentes QML-Fenster) zu jeder Zeit übereinander zu halten, aber das klingt einfach albern.

Solution X: ANGLE Bibliothek ändern und versuchen & Anteil D3D Gerätekontext mit meinem Direct3D Renderer diese

  • habe nicht versucht, noch zu extrahieren, so lange wie möglich keine Bibliothek Änderungen zu vermeiden. Wäre das überhaupt eine vernünftige Option?

Meine offensichtlichen Fragen hier sind: Mache ich etwas falsch? Was ist die bevorzugte Lösung? A, B, C, X oder vielleicht etwas ganz anderes? Kann mir jemand in die richtige Richtung zeigen?

TL; DR:Was ist der schnellste Weg, QML-Szene über Direct3D-Szene zu rendern?

+1

Es scheint, dass Solution X die richtige, langfristige Lösung ist. Sie müssen überprüfen, wie gut Lösung C funktioniert, und wählen Sie die beste aus A, B, C. Ich bin sicher, du könntest Digia oder einen Auftragnehmer dazu bringen, es für dich zu einem vernünftigen Preis zu implementieren, wenn du keine Zeit hast, es selbst zu tun. –

Antwort

1

Klingt so, als ob Sie idealerweise einen Bastard-Mix aus Solution X wünschen und sich ein DirectX QPA-Plugin schreiben.

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

Ich wette, Sie viele Freunde machen würde, wenn man einen solchen Aufwand sourced öffnen !!