I. Einleitung
Seitdem ich als Kind in die Magie der Warcraft III-MODs eingetaucht war, hatte ich schon immer eine besondere Vorliebe für Skriptsprachen für Spiele. Rückblickend wurde damals die von Blizzard entwickelte JASS-Sprache verwendet, um die Spielebenen von Warcraft 3 zu entwickeln. Obwohl JASS aus heutiger Sicht äußerst grob ist und seine Hauptmerkmale statische Typisierung + keine GC-Funktion sind, war es in einer Zeit, in der Industriestandards waren noch nicht festgelegt, stellt einen mutigen Versuch einer Spieleentwicklungssprache dar.
Warum Skriptsprachen verwenden, um Spiele zu entwickeln?
Die Einführung der Skriptsprache für Spiele dient hauptsächlich dazu, den Entwicklungs- und Testkomfort zu verbessern. Wenn Sie direkt eine Low-Level-Sprache wie C++ verwenden, müssen Sie möglicherweise jedes Mal, wenn Sie eine Codezeile ändern, viel Zeit damit verbringen, auf die Kompilierung und Verpackung der komplexen Toolkette zu warten. Durch die Verwendung einer Skriptsprache kann das Programm, das das Gameplay implementiert, im laufenden Betrieb geladen und ausgeführt werden, was die Entwicklungseffizienz des Spiels erheblich verbessert.
Im Laufe der Zeit haben sich dynamisch typisierte Skriptsprachen wie Lua und JavaScript in der Spieleentwicklung durchgesetzt. Mit der Entwicklung von Programmiersprachen haben wir jedoch die Möglichkeit, einen neuen Standard für Spiele-Skriptsprachen neu zu definieren – sowohl retro als auch innovativ. Dies ist die Kombination von Rust + WASM.
2. Rust + WASM + Dora SSR: Die Entwicklung von Spielskripten neu definiert
Durch die Kombination von Rust und WASM können wir Spiele beispielsweise direkt auf Android- oder iOS-Geräten im laufenden Betrieb aktualisieren und testen, ohne Leistungseinbußen hinnehmen zu müssen, ohne auf herkömmliche Toolketten für die Anwendungsentwicklung angewiesen zu sein. Darüber hinaus kann mit Hilfe der Web-IDE-Schnittstelle der Open-Source-Game-Engine Dora SSR in Rust geschriebener Spielcode einmal kompiliert und auf verschiedenen Spielgeräten getestet und ausgeführt werden.
Warum Rust wählen?
Rust bietet beispiellose Speichersicherheitsgarantien, ohne dass ein Garbage Collector (GC)-Eingriff erforderlich ist, was es ideal für die Spieleentwicklung macht, insbesondere in leistungssensiblen Szenarien. In Kombination mit WASM kann Rust nicht nur eine leistungsstarke Ausführungseffizienz bieten, sondern auch plattformübergreifende Konsistenz und Sicherheit gewährleisten.
Schnellstartanleitung
Bevor wir mit der Entwicklung beginnen, müssen wir die Dora SSR-Spiel-Engine installieren. Die Engine unterstützt mehrere Plattformen, darunter Windows, Linux, macOS, iOS und Android. Spezifische Installationsschritte und Anforderungen finden Sie in der offiziellen Kurzanleitung: Dora SSR Quick Start .
Schritt 1: Erstellen Sie ein neues Projekt
Nachdem das Binärprogramm der Dora SSR-Engine gestartet wurde, öffnen Sie die Dora SSR-Web-IDE im Browser, klicken Sie mit der rechten Maustaste auf den Spielressourcenbaum auf der linken Seite, wählen Sie „Neu“ und erstellen Sie einen neuen Ordner mit dem Namen „Hallo“.
Schritt 2: Spielcode schreiben
Anschließend erstellen Sie in der Befehlszeile ein neues Rust-Projekt:
rustup target add wasm32-wasi
cargo new hello-dora --name init
cd hello-dora
cargo add dora_ssr
src/main.rs
Code schreiben in :
use dora_ssr::*;
fn main () {
let mut sprite = match Sprite::with_file("Image/logo.png") {
Some(sprite) => sprite,
None => return,
};
let mut sprite_clone = sprite.clone();
sprite.schedule(once(move |mut co| async move {
for i in (1..=3).rev() {
p!("{}", i);
sleep!(co, 1.0);
}
p!("Hello World");
sprite_clone.perform_def(ActionDef::sequence(&vec![
ActionDef::scale(0.1, 1.0, 0.5, EaseType::Linear),
ActionDef::scale(0.5, 0.5, 1.0, EaseType::OutBack),
]));
}));
}
Erstellen und generieren Sie WASM-Dateien:
cargo build --release --target wasm32-wasi
Schritt 3: Laden Sie das Spiel hoch und führen Sie es aus
Klicken Sie in der Dora SSR Web IDE mit der rechten Maustaste auf den neu erstellten Ordner „Hallo“, wählen Sie „Hochladen“ und laden Sie die kompilierte WASM-Datei hoch init.wasm
.
Oder verwenden Sie das Hilfsskript upload.py , um die WASM-Datei in den Rust-Projektordner hochzuladen. Der IP-Parameter ist die Web-IDE-Adresse, die nach dem Start von Dora SSR angezeigt wird Hochzuladen:
python3 upload.py "192.168.3.1" "Hello"
Schritt 4: Veröffentlichen Sie das Spiel
Klicken Sie im Spielressourcenbaum auf der linken Seite des Editors mit der rechten Maustaste auf den neu erstellten Projektordner und wählen Sie „Herunterladen“.
Warten Sie, bis der Browser eine Download-Eingabeaufforderung für die gepackte Projektdatei anzeigt.
3. Wie man es erreicht
Der Prozess der Implementierung der Rust-Sprachentwicklungsunterstützung und der WASM-Laufzeiteinbettung in Dora SSR ist eine neue technische Untersuchung und ein neuer Versuch, der hauptsächlich drei Schlüsselschritte umfasst:
1. Design der Interface Definition Language (IDL)
Um die WASM-Laufzeit einzubetten und die Rust-Sprache in einer in C++ geschriebenen Spiel-Engine zu unterstützen, müssen Sie zunächst eine Schnittstellendefinitionssprache (IDL) entwerfen, um die Kommunikation und den Datenaustausch zwischen verschiedenen Programmiersprachen zu erleichtern. Das Design von IDL basiert auf der C++-Schnittstelle und es werden Tags hinzugefügt, die an die Rust-Sprachfunktionen angepasst sind, wie z object
. B. readonly
, optional
usw., um eine sprachübergreifende Schnittstellenzuordnung durchzuführen. Das Folgende ist ein Schnittstellenbeispiel eines von Dora SSR entworfenen WASM IDL:
object class EntityGroup @ Group
{
readonly common int count;
optional readonly common Entity* first;
optional Entity* find(function<bool(Entity* e)> func) const;
static EntityGroup* create(VecStr components);
};
Unter Berücksichtigung der Unterschiede zwischen den objektorientierten Funktionen von C++ und der Designphilosophie von Rust haben wir das objektorientierte Verhalten in C++ teilweise in Rust simuliert, was das Schreiben einiger zusätzlicher Mechanismen in Rust erforderte, um Klassen und Methoden in C++ zu entsprechen. Obwohl dieser Ansatz einige Entwicklungsarbeit mit sich bringt, bleibt die Schnittstelle sauber und das System wartbar.
2. Programm zum Generieren von Klebecode
Der zweite Schritt besteht darin, ein Programm zu schreiben, um Klebercode für den gegenseitigen Aufruf zwischen C++, WASM und Rust über IDL zu generieren. Um dies zu erreichen, haben wir uns für die Verwendung der vom Dora SSR-Projekt entwickelten Yuescript-Sprache entschieden. Yuescript ist eine dynamische Programmiersprache, die auf Lua basiert. Sie kombiniert die Lpeg-Syntax-Parsing-Bibliothek im Lua-Sprach-Ökosystem, um IDL-Parsing und Glue-Code-Generierung durchzuführen. Der Vorteil der Verwendung von Yuescript besteht darin, dass es die Flexibilität und Leichtigkeit von Lua übernimmt und gleichzeitig eine umfangreichere Syntax und Funktionen bietet, die für die Bewältigung komplexer Codegenerierungsaufgaben geeignet sind. Das Folgende ist ein Codeauszug aus einem IDL-Parser, der mit PEG-Grammatik geschrieben wurde.
Param = P {
"Param"
Param: V"Func" * White * Name / mark"callback" + Type * White * Name / mark"variable"
Func: Ct P"function<" * White * Type * White * Ct P"(" * White * (V"Param" * (White * P"," * White * V"Param")^0 * White)^-1 * P")" * White * P">"
}
Method = Docs * Ct(White * MethodLabel) * White * Type * White * (C(P"operator==") + Name) * White * (P"@" * White * Name + Cc false) * White * Ct(P"(" * White * (Param * (White * P"," * White * Param)^0 * White)^-1 * P")") * White * C(P"const")^-1 * White * P";" / mark"method"
3. Betten Sie die WASM-Laufzeit und Code-Integration ein
Der letzte Schritt besteht darin, die WASM-Laufzeitumgebung und den generierten C++-Glue-Code in die Spiel-Engine einzubetten, um die Code-Integration abzuschließen. Für die WASM-Laufzeit haben wir uns für WASM3 entschieden, einen leistungsstarken, leichten WebAssembly-Interpreter, der mehrere CPU-Architekturen unterstützt, die Komplexität der Kompilierungskette vereinfacht und die plattformübergreifende Kompatibilität verbessert. Auf diese Weise kann Dora SSR die Ausführung von in Rust entwickelten Spielen auf Hardwaregeräten verschiedener Architekturen unterstützen und so die Zugänglichkeit und Flexibilität von Spielprojekten erheblich verbessern.
Während des Integrationsprozesses haben wir ein Crate-Paket für Rust-Entwickler veröffentlicht, das alle notwendigen Schnittstellen und Tools enthält, damit Entwickler in Zukunft problemlos andere in der Rust-Sprache geschriebene Spielmodule auf Basis der Dora SSR-Spiel-Engine entwickeln und erneut veröffentlichen können.
4. Fazit
Die Wahl von Dora SSR + Rust als Spieleentwicklungstool ist nicht nur ein Streben nach modernster Technologie, sondern auch eine neue Erkundung des Spieleentwicklungsprozesses. Wir laden alle, die Spieleentwicklung lieben, herzlich ein, unserer Community beizutreten und diese aufregende technologische Reise gemeinsam zu erkunden. Besuchen Sie gerne unser GitHub-Repository und unsere Projekthomepage, um mehr zu erfahren und an unserer Entwicklung teilzunehmen. Lassen Sie uns gemeinsam eine neue Ära der Spieleentwicklung schaffen!
Unsere Q-Gruppe ist hier, herzlich willkommen zum Spielen: 512620381
Fellow Chicken „Open-Source“ -Deepin-IDE und endlich Bootstrapping erreicht! Guter Kerl, Tencent hat Switch wirklich in eine „denkende Lernmaschine“ verwandelt. Tencent Clouds Fehlerüberprüfung und Situationserklärung vom 8. April RustDesk-Remote-Desktop-Startup-Rekonstruktion Web-Client WeChats Open-Source-Terminaldatenbank basierend auf SQLite WCDB leitete ein großes Upgrade ein TIOBE April-Liste: PHP fiel auf ein Allzeittief, Fabrice Bellard, der Vater von FFmpeg, veröffentlichte das Audiokomprimierungstool TSAC , Google veröffentlichte ein großes Codemodell, CodeGemma , wird es dich umbringen? Es ist so gut, dass es Open Source ist – ein Open-Source-Bild- und Poster-Editor-Tool