Machen wir da weiter, wo wir im ersten Artikel aufgehört haben. Es wurde ein Beispiel für eine Qt Quick-Anwendung betrachtet, die unter Linux auf Basis von OpenGL und Vulkan ausgeführt wird. Wir haben auch die Vulkan-Frame-Erfassung in RenderDoc gesehen, die nicht nur ein unschätzbares Werkzeug bei der Entwicklung von Qt ist, sondern auch für jeden nützlich sein kann, der tiefer graben und besser verstehen möchte, wie Qt Quick einen Frame rendert (oder Probleme beim Rendern von Anwendungen behebt). . Konzentrieren wir uns nun in diesem Artikel auf das, was Qt 5.14 für macOS und Windows bietet.
Metal unter macOS
Es überrascht nicht, dass das Ausführen der qt5-cinematic-experience-Demo mit QSG_RHI=1 (und QSG_INFO=1) unter macOS 10.13 oder 10.14 zu Folgendem führt:
qt.scenegraph.general: Using QRhi with backend Metal graphics API debug/validation layers: 0 QRhi profiling and debug markers: 0 qt.scenegraph.general: threaded render loop qt.scenegraph.general: Using sg animation driver qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms qt.rhi.general: Metal device: Intel(R) HD Graphics 615 qt.scenegraph.general: MSAA sample count for the swapchain is 1. Alpha channel requested = no. qt.scenegraph.general: rhi texture atlas dimensions: 4096x2048 qt.rhi.general: got CAMetalLayer, size 2560x1440
In Übereinstimmung mit dem Ziel von Qt 6, standardmäßig auf die zentrale, am meisten unterstützte Plattform-Grafik-API zu setzen (während Anwendungen weiterhin ihre eigenen Einstellungen festlegen können, wenn sie dies wünschen), indem ein QRhi-basierter Rendering-Pfad in Qt Quick unter macOS aktiviert wird, ist Metal das Ursprünglich.
So wie der Vulkan-basierte Rendering-Pfad auf dem Vulkan-Sample und der Oberflächenunterstützung aufbaut, die in das QtGui-Modul, QPA und einige Plattform-Plugins eingeführt wurden, verlässt sich das Metal QRhi-Backend auf die Metal-Unterstützung für das Cocoa-Plattform-Plugin, das um Qt 5.12 herum erschien. QWindow mit QSurface::MetalSurface erhält ein NSView, das von CMetalLayer unter der Haube unterstützt wird. Das ist genau das, was das Metal QRhi-Backend benötigt (das alles funktioniert, weil QQuickWindow den entsprechenden QSurface::SurfaceType-Satz erhält, wenn ein QRhi-basierter Codepfad aktiv ist).
Eine wichtige Funktion hier ist die Möglichkeit, mit der Multithread-Renderschleife von Qt Quick zu arbeiten. Dies ist sehr willkommen, da Qt aufgrund von Multithreading-Problemen mit einigen NSOpenGLContext und verwandten APIs in macOS 10.14 Multithread-Looping mit OpenGL unter macOS deaktiviert und stattdessen standardmäßig auf die Basisschleife zurückgreift. Dies führt zu einer etwas reduzierten Animationsglätte in Qt Quick. Was Metal betrifft, so haben Entwickler (nach aktuellem Kenntnisstand) keine Probleme beim Setzen von Threads, sodass man wieder die standardmäßige Multithread-Renderschleife verwenden kann (die Standardauswahl für die Renderschleife kann durch Setzen der Umgebungsvariable QSG_RENDER_LOOP geändert werden , diese Variable wird auch in Kombination mit QSG_RHI unterstützt)
RenderDoc wurde bereits als Tool zum Debuggen des Frame-Renderings von Qt-Anwendungen erwähnt, wenn es unter OpenGL, Vulkan oder Direct3D ausgeführt wird. Für Metal können Sie XCode und die integrierte GPU-Frame-Erfassung verwenden.
Eine nützliche Methode zum schnellen Öffnen eines Qt-Projekts in XCode, das zum Debuggen bereit ist, besteht darin, make xcodeproj && open .xcodeproj (oder qmake -spec macx-xcode*, falls qmake noch nicht gestartet wurde) von einem Terminal aus auszuführen. Durch Drücken von Cmd-R wird der Debugger sofort gestartet. Entwickler verwenden dies auch häufig während der Qt-Entwicklung. Falls die Metal-GPU-Erfassung nicht verfügbar ist, selbst wenn Qt Quick für das Rendern über Metal konfiguriert ist, wählen Sie Produkt -> Schema -> Schema bearbeiten ... und ändern Sie die GPU-Frame-Erfassung in Metal.
Wenn Sie einen Debug-Build Ihrer Anwendung ausführen, wird XCode die Metal-Prüfung aktiviert haben, was bedeutet, dass XCode (hoffentlich) eine nützliche Warnung ausgibt und die Programmausführung abbricht, wenn die Metal-API auf irgendeine Weise nicht korrekt verwendet wird. Im Gegensatz zu anderen Plattformen kann die Metal-API-Validierung nicht aktiviert werden, es sei denn, es wird über XCode debuggt (im Gegensatz zu Vulkan und D3D hat die Einstellung von QSG_RHI_DEBUG_LAYER also keine Auswirkung).
Metal auf iOS
Was ist mit iOS oder tvOS?
Nun, zum Zeitpunkt des Verfassens dieses Artikels gibt es kein Metal-bezogenes Plugin im Plattform-Plugin, was auch bedeutet, dass das Metal QRhi-Backend noch nicht auf diesen Plattformen getestet wurde. Aus diesem Grund wird auf der Seite „Neue Funktionen“ von Qt 5.14 nur macOS im Abschnitt „Qt Quick“ erwähnt. Die Unterstützung wird voraussichtlich in naher Zukunft hinzugefügt, möglicherweise in Version 5.15.
Vulkan auf macOS
Wie wäre es mit Vulkan über MoltenVK?
Wie in Teil 1 erwähnt, ist es auch möglich, über Vulkan zu rendern und dann MoltenVK zu verwenden, um SPIR-V-API-Aufrufe und -Shader zur Laufzeit in Metal und Metal Shading Language zu übersetzen. Dies erfordert die Erstellung von Qt mit Vulkan-Unterstützung, was von vorgefertigten Lösungen auf Apple-Plattformen nicht gesagt werden kann. Der Schlüssel ist, -I zu übergeben und sicherzustellen, dass Bibliotheken zur Laufzeit gefunden werden können, vielleicht durch Setzen von QT_VULKAN_LIB.
Es ist wichtig zu beachten, dass dieser Ansatz nur nach bestem Bemühen unterstützt wird. Das primär unterstützte Rendering auf Apple-Plattformen erfolgt über Metal.
Das Ausführen der Demoanwendung mit QSG_RHI_BACKEND=vulkan (unter Verwendung eines entsprechend konfigurierten Qt 5.14-Builds) ergibt Folgendes:
qt.scenegraph.general: Using QRhi with backend Vulkan graphics API debug/validation layers: 0 QRhi profiling and debug markers: 0 qt.scenegraph.general: threaded render loop qt.scenegraph.general: Using sg animation driver qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms qt.rhi.general: Physical device 0: 'Intel(R) UHD Graphics 630' 0.2.1835 (api 1.0.92 vendor 0x8086 device 0x3E9B type 1) qt.rhi.general: using this physical device qt.rhi.general: queue family 0: flags=0x7 count=1 qt.rhi.general: 17 device extensions available qt.scenegraph.general: MSAA sample count for the swapchain is 1. Alpha channel requested = no. qt.scenegraph.general: rhi texture atlas dimensions: 2048x1024 qt.rhi.general: Creating new swapchain of 2 buffers, size 1280x720, presentation mode 2
Es ist erwähnenswert, dass es unter macOS 10.13 Probleme gab, die blockierten und abstürzten, wenn eine Multithread-Renderschleife verwendet wurde. Das Upgrade auf das neuere (1.0.121) Vulkan SDK (einschließlich MoltenVK) führte zu einer Reihe neuer Probleme und dazu, dass die Anwendung nicht gestartet werden konnte.
Windows
Windows ist die Plattform mit den meisten Funktionen. Von den 4 wichtigsten QRhi-Backends (Vulkan, Metal, D3D11, OpenGL) können mindestens 3 unter Windows verwendet werden: Direct3D 11, Vulkan und OpenGL.
Dies wirft die offensichtliche Frage auf: Warum nur 3? Sollte es nicht 4 mit Direct3D 12 sein?
Derzeit gibt es kein D3D12-Backend. Dies kann sich später ändern, da es in den Plänen steht, aber nicht zu diesem Zeitpunkt. Es ist erwähnenswert, dass das experimentelle D3D12-Backend für Qt Quick, das in Qt 5.8 hinzugefügt wurde, jetzt architektonisch veraltet ist (weil die Entwickler das Problem mehrerer Grafik-APIs auf völlig neue Weise handhaben) und in Qt 6 entfernt werden soll.
Unter Windows verwendet die Standardeinstellung QSG_RHI=1 Direct3D 11. Überschreiben Sie wie üblich mit QSG_RHI_BACKEND, wenn Vulkan oder OpenGL erforderlich ist.
qt.scenegraph.general: Using QRhi with backend D3D11 graphics API debug/validation layers: 0 QRhi profiling and debug markers: 0 qt.scenegraph.general: threaded render loop qt.scenegraph.general: Using sg animation driver qt.scenegraph.general: Animation Driver: using vsync: 16.67 ms qt.rhi.general: DXGI 1.2 = true, FLIP_DISCARD swapchain supported = true qt.rhi.general: Adapter 0: 'NVIDIA GeForce RTX 2060' (flags 0x0) qt.rhi.general: using this adapter qt.rhi.general: Adapter 1: 'Microsoft Basic Render Driver' (flags 0x2) qt.scenegraph.general: MSAA sample count for the swapchain is 1 qt.scenegraph.general: rhi texture atlas dimensions: 2048x1024
Beachten Sie, dass Sie Direct3D 11.1 und nicht 11.0 benötigen. Dies liegt hauptsächlich daran, dass VSSetConstantBuffers1 benötigt wird
(und verwandte PS- und CS-Varianten). Dies sollte kein Problem sein, wenn jemand kein einfaches Windows 7 ohne Plattform-Upgrade ausführen möchte. Apropos Windows 7: Es ist wichtig zu beachten, dass D3D11-basiertes Rendering derzeit unter Windows 7 mit Qt 5.14 nicht richtig funktioniert, daher wird auf der Seite mit den neuen Funktionen von 5.14 nur Windows 10 erwähnt. Dies wird später behoben (aber nur, wenn Windows 7 weiterhin unterstützt wird). Plattform) für Qt 6).
Um die Direct3D-Debug-Ebene zu aktivieren, setzen Sie die Umgebungsvariable QSG_RHI_DEBUG_LAYER auf 1. Dies funktioniert auch für Vulkan, wenn Inspektionsebenen verfügbar sind (z. B. aus dem installierten Vulkan-SDK). Qt leitet Meldungen bequem an die Debug-Ausgabe weiter (als ob sie über qDebug ausgegeben würden).
Vulkan und OpenGL sollten unter Windows wie erwartet funktionieren.
Wie bei Vulkan und Metal stützt sich das OpenGL QRhi-Backend auf einige (aber nicht alle) der vorhandenen OpenGL-Aktivatoren und Plattform-Tracking, wie QOpenGLContext, QOpenGLFunctions und im Windows-Plattform-Plugin (WGL, EGL). Daher gilt auch hier alles, was mit Qt Quick-Anwendungen zu tun hat, die direkt in OpenGL ausgeführt werden (Desktop (Desktop) vs. ANGLE vs. Software, Umgebungsvariablen wie QT_OPENGL).
Apropos ANGLE: Es wird erwartet, dass es als direkte Abhängigkeit in Qt 6 entfernt wird. Dies muss weiter untersucht werden, um sicherzustellen, dass die Unterstützung für spezielle Anwendungsfälle nicht verloren geht, aber im Moment ist geplant, es auf QRhi-Rendering zu basieren Pfad mit Unterstützung für Direct3D 11, OpenGL (über WGL selbst) und Vulkan wird für Qt 6-Anwendungen unter Windows ausreichen.
Im dritten Teil wird untersucht, was QRhi ist und wie Shader funktionieren.