mafulechka
mafulechka4. Oktober 2019 05:00

Ausführen von Qt Quick auf Vulkan, Metal und Direct3D - Teil 2

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.

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken