Qt рдПрд╡рд░реАрд╡реЗрдпрд░: WebAssembly рдФрд░ WebGL рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ

Qt рдПрд╡рд░реАрд╡реЗрдпрд░ - рдпрд╣ Qt рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдХрд╛ рдирд╛рдо рд╣реИред WebAssembly рдФрд░ WebGL рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЛ 5.12.0 рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рд░ рдЬрдЧрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдЧрддрд╛ рд╣реИред рддреЛ рдХреБрдЫ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ред рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдкрд░ рдПрдХ рдЪреИрдЯ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдорд░реНрдерди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ WebAssembly рдкрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рд╣реЛрдВрдЧреЗ, C ++ рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдгред


WebAssembly рдХреЗ рд╕рд╛рде Qt рд╡рд┐рдзрд╛рдирд╕рднрд╛


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЯреВрд▓рдХрд┐рди рдИрд╕реНрдорд╕реНрдХреНрд░рд┐рдкреНрдЯреЗрди рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдХреНрдпреВрдЯреА рдПрдХрддреНрд░ рдХрд░реЗрдВрдЧреЗред рд╡рд╛рддрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦреЗрдВ рддрд╛рдХрд┐ qmake emcc рдкрд╛рддрд╛ рд╣реИред configure рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рдореНрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдИ рдЧрдИ рдереА:


 ./configure \ -prefix /home/dmitry/Qt/5.12.0/wasm \ -xplatform wasm-emscripten \ -confirm-license -opensource \ -nomake tests \ -c++std c++1z \ -nomake examples \ -release \ -no-dbus \ -skip qtxmlpatterns \ -skip qttools 

рдЖрдЧреЗ рдХрд╣реАрдВ рдФрд░:


 $ make $ make install 

рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╢реБрднрд╛рд░рдВрдн


 $ ~/Qt/5.12.0/wasm/bin/qmake $ make $ emrun chat.html 

рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдХреЛрдб


Url рдХреЛ рд╕рд┐рд▓рд╛рдИ рдЬрд┐рд╕ рдкрд░ рдмреИрдХреЗрдВрдб рд▓рдЯрдХрд╛ рд╣реБрдЖ рд╣реИ, рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдордирдорд╛рдирд╛ рдмрдВрджрд░рдЧрд╛рд╣ рдкрд░ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХрд╛рдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП location.hostname рдФрд░ location.port рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдмреИрдХрдПрдВрдб рдХрд╣рд╛рдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдереЛрдбрд╝рд╛ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред


рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЗрдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, Q_OS_WASM , рд▓реЗрдХрд┐рди рдореИрдВ Q_OS_WASM рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреЛрдб рдирд┐рдХрд╛рд▓рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдкрд┐рдореНрдкрд▓ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╣реА рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЛрдб рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдлреИрд▓рд╛ рджреВрдВрдЧрд╛


рдЪрд▓реЛ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдХреЙрдиреНрдлрд┐рдбреЗрдВрд╕ рдорд┐рд▓рддрд╛ рд╣реИ


 //config.h #pragma once #include <QtCore/QUrl> class Config { public: static QUrl wsUrl(); }; 

рдФрд░ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


 //config.cpp #include <QtCore/QCoreApplication> #include <QtCore/QCommandLineParser> #include "config.h" QUrl Config::wsUrl() { QCommandLineParser parser; QCommandLineOption wsOption(QStringList() << "u" << "url" , "WebSocket url" , "url" , "ws://localhost:1234"); parser.addOption(wsOption); parser.process(*QCoreApplication::instance()); return QUrl(parser.value(wsOption)); } 

 //config_wasm.cpp #include <QtCore/QByteArray> #include <emscripten/emscripten.h> #include <emscripten/html5.h> #include "config.h" QUrl Config::wsUrl() { QByteArray buff(1024, 0); EM_ASM_({ var url = "ws://"+ window.location.hostname + ":" + window.location.port + "/ws"; stringToUTF8(url, $0, $1); }, buff.data(), buff.size()); return QUrl(QString::fromUtf8(buff)); } 

рдпрд╣ рдкреНрд░реЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ


 wasm { SOURCES += config_wasm.cpp } else { SOURCES += config.cpp } 

EM_ASM_ рдЬрд╛рджреВ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ C ++ рд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рдпрд╣ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ


 emscripten::val location = emscripten::val::global("location"); auto host = QString::fromStdString(location["host"].as<string>()); auto protocol = QString::fromStdString(location["protocol"].as<string>()); 

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рд╕рдорд░реНрдерди


рдбреЗрд╕реНрдХрдЯреЙрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░: рдпрд╣ рдХреНрд░реЛрдо, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕, рд╕рдлрд╛рд░реА, рдПрдЬ рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдпрд╣рд╛рдБ рдореБрдЭреЗ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдерд╛)ред рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, WebAssembly рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИред


рдХреНрд░реЛрдо рдСрди рдПрдВрдбреЛрд░рд┐рдб рдореЗрдВ, WebAssembly рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорд┐рдирдЯ рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рддреБрд░рдВрдд рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдХрдореА рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреН рдкрд╛рда рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рд╕рд┐рд╕реНрдЯрдо рдХреАрдмреЛрд░реНрдб рдкрд░ рдХреЛрдИ рдХреЙрд▓ рдирд╣реАрдВ рд╣реИред


рдЖрдИрдУрдПрд╕ 12 рдкрд░ рд╕рдлрд╛рд░реА рдпрд╣рд╛рдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрдХрд▓рди рд╡реЗрдмрдЕрд╡реЗрд╢рди рдХреЗ рдЪрд░рдг рдореЗрдВ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдбреАрдмрдЬрд╣рд┐рдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдк asm.js рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЕрдзреНрдпрдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


Qt рддреНрд╡рд░рд┐рдд рд╡реЗрдмрдЬреАрдПрд▓


рд╡реЗрдмрд▓реЙрдЧ рдкрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдЧ рдиреЗ рдЦреБрдж рдХреЛ рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдкрд░ VNC рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ред рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ Qt WebSockets рдФрд░ Qt OpenGL ES 2 рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдмрд┐рдирд╛ GPU рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдбреНрд░рд╛рдЗрд╡рд┐рдВрдЧ рджрд░реНрджрдирд╛рдХ рд╣реЛрдЧреАред рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдСрдирд▓рд╛рдЗрди рдЗрдВрд╕реНрдЯреЙрд▓рд░ рдореЗрдВ Qt WebGL рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд▓рдЧрд┐рди -platform webgl рдФрд░ -platform webgl рдпрд╛ -platform webgl:port=80 -platform webgl рд╕рд╛рде рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдПрдБ -platform webgl:port=80 рд╡рд┐рдХрд▓реНрдк рдпрджрд┐ рдЖрдкрдХреЛ рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред


рд▓реЗрдХрд┐рди рдЗрд╕ рддрдХрдиреАрдХ рдХреА рдЕрдкрдиреА рд╕реАрдорд╛рдПрдБ рд╣реИрдВ:


  • рджреЗрд░реА рдпрд╛ рдХреБрдЦреНрдпрд╛рдд рдЗрдирдкреБрдЯ рдЕрдВрддрд░рд╛рд▓;
  • рдХреНрдпреВрдЯреА рд╡рд┐рдЬреЗрдЯ рдкрд░ рдЖрд╡реЗрджрди рд╕рдорд░реНрдерди рдХреА рдХрдореА;
  • рдзреНрд╡рдирд┐ рд╕рдВрдЪрд░рдг рдХреА рдХрдореА;
  • рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рддрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдпрд╛рдиреА рджреВрд╕рд░реЗ рдЯреИрдм рдореЗрдВ рдЕрдм рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдкреНрд░реАрд▓реЛрдбрд░ рд╕реНрдкрд┐рди рдХрд░реЗрдЧрд╛ред

рдЬрдм рд╕реНрдХреНрд░реАрди рдХреЗ рдмреАрдЪ рдмрджрд▓рд╛рд╡ рдкрд░ StackView рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рддреЗ рд╣реБрдП рдореИрдВрдиреЗ рдПрдлрдкреАрдПрд╕ рд╕реИрдЧрд┐рдВрдЧ рдХреЛ рднреА рджреЗрдЦрд╛ред WebGL рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд╛ рд▓рд╛рдн:


  • рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд░реНрд╡рд░;
  • рдиреНрдпреВрдирддрдо рдкреНрд░рдпрд╛рд╕ред рдореБрдЭреЗ рдХреНрдпреВрдЯреА рдХреЛ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред

WebAssembly рдФрд░ WebGL рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ


W ++ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЬрдм C ++ рдореЗрдВ рд░реЗрдбреАрдореЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдлрд╛рд╕реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЛрд░реЗрдВрдЯ рд░реЙрдХрд┐рдВрдЧ рдЪреЗрдпрд░ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред


рдХреБрдЫ рд╕реНрдорд╛рд░реНрдЯ рдШрд░ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдХрд┐ MQTT рдХреЛ Qt рддрдХ рдкрд╣реБрдВрдЪрд╛рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рд▓реЗрдХрд┐рди msorvig / qt-webassembly- рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг mqtt_simpleclient рд╣реИ ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп UI рдХреЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЯреЗрдмрд▓реЗрдЯ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ , рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рддреИрдпрд╛рд░ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ ред

Source: https://habr.com/ru/post/hi430954/


All Articles