Bevy 0.12 – Datengetriebene Game-Engine in Rust
(bevyengine.org)- Der Renderer unterstützt optional Deferred Rendering; pro Material kann ein Forward- oder Deferred-Pfad gewählt werden, und mit
DefaultOpaqueRendererMethodlässt sich ein globaler Standardwert festlegen - Bestehende Bevy-Apps oder -Plugins sollten die Migration mithilfe des 0.11 to 0.12 Migration Guide prüfen
- Bevy Asset V2 unterstützt Asset-Vorverarbeitung, auf
.meta-Dateien basierende Konfiguration, mehrereAssetSource, rekursive Abhängigkeits-Ladeereignisse, asynchrones Asset-I/O und verbesserte Handles - Die Asset-Vorverarbeitung wird mit
AssetPlugin { mode: AssetMode::Processed }und dem Cargo-Featurebevy/asset_processoraktiviert, wird derzeit aber für die meisten Anwendungsfälle noch nicht empfohlen - Unter Android stürzt die App beim Suspendieren nicht mehr ab, stoppt stattdessen die Systemausführung bis zur Fortsetzung und bietet die Events
ApplicationLifetime::SuspendedundApplicationLifetime::Resumed - StandardMaterial erhält
specular_transmission,diffuse_transmission,thickness,ior,attenuation_colorundattenuation_distance, um transmissive Materialien wie Glas, Wasser, Kunststoff, Blätter und Papier darzustellen - Der glTF-Loader unterstützt die Erweiterungen
KHR_materials_transmission,KHR_materials_ior,KHR_materials_volumeundKHR_materials_emissive_strengthund kann eine zweite UV-Map überTEXCOORD1oderUV1importieren - Automatisches Batching/Instancing von Draw Commands ist nun möglich; Entitäten mit demselben Material und Mesh können derzeit gebatcht werden, und über die Komponente
NoAutomaticBatchinglassen sie sich ausschließen - Schatten führen PCF Shadow Filtering ein und unterstützen damit weichere Schatten bei
DirectionalLightundSpotLight; die Standardmethode istShadowMapFilter::Castano13 - Dem ECS wurden One-Shot-Systems hinzugefügt, die nach der Registrierung bei Bedarf über
SystemIdausgeführt werden können; nicht unterstützt werden exclusive systems, Systems für system piping, Selbstaufrufe und parallele Auswertung FixedTimewurde entfernt, undTimeliefert nun auch inFixedUpdatekontextgerechte Werte zurück; außerdem verhindertFixedUpdate, dass sich eine „death spiral“ durch übermäßige Akkumulation aufbaut und die App einfriert- In
AnimationPlayerwirdset_elapseddurchseek_toersetzt,stop_repeatingdurchset_repeat(RepeatAnimation::Never), undelapsedgibt die tatsächliche verstrichene Zeit zurück, die nicht von der Animationsgeschwindigkeit beeinflusst wird - Der Bevy-Shader-Import wurde auf eine Rust-ähnliche Syntax umgestellt und unterstützt
#import bevy_pbr::forward_io::VertexOutput, Mehrfachimporte mit geschweiften Klammern, Teilpfadimporte und vollständig qualifizierte Pfade - In der UI können mit
UiMaterialbenutzerdefinierte Material-Shader auf UI-Knoten angewendet werden, und die KomponenteOutlineunterstützt Knoten-Umrandungen, die keinen Layout-Platz beanspruchen - Für die Accessibility-Integration wurde die Ressource
ManageAccessibilityUpdateshinzugefügt; ist ihr Wertfalse, können automatische Updates des Accessibility-Baums der Engine gestoppt werden
1 Kommentare
Hacker-News-Kommentare
Im Vergleich zu traditionellen Engines wie Unity oder Godot ist Bevy eine völlig andere Art, Spiele zu entwickeln
Alles wird in Rust-Code umgesetzt, ohne UI oder Skripting, und ist damit eher mit libGDX oder Cocos2D-x vergleichbar. Durch ECS und Rust unterscheidet sich der Programmierstil aber noch einmal stark, sodass es sich fast wie eine eigene Insel anfühlt
Ich würde gern erfolgreiche Indie-Spiele sehen, die mit Bevy entstanden sind, aber die meisten Spieleentwickler bevorzugen wahrscheinlich weiterhin traditionelle Werkzeuge, die sie bereits kennen und die auch ihr Umfeld nutzt. Die Schnittmenge aus Leuten, die Spiele machen wollen und zugleich Rust bevorzugen, ist nicht besonders groß, und selbst innerhalb dieser Gruppe werden viele eher auf Werkzeuge mit mehr Vertrauen und mehr Lernmaterial setzen, statt viel Zeit und Mühe in eine experimentelle neue Engine zu investieren
Meiner Meinung nach braucht Bevy eine auf Bevy und Rust basierende IDE und Skriptsprache. Das beseitigt zwar nicht die Hürde, für ein neues Projekt viel Aufwand investieren zu müssen, könnte die Engine aber für neue Nutzer ohne Rust-Erfahrung, die vor einer Wand aus Code zurückschrecken, deutlich zugänglicher machen. Das steht im Kontrast zu Unity oder Godot, wo man in wenigen Stunden auf einer Canvas einen sehr einfachen Prototypen bauen kann
Soweit ich weiß, sind die Entwickler gegen eine Skriptsprache, aber Hot Reload und tiefere Debugging-Möglichkeiten werden gebraucht, und allein mit Rust lässt sich das meiner Meinung nach nur schwer effektiv umsetzen. Viele Spieleentwickler könnten sich von Rust und dem Borrow Checker überfordert fühlen. Im Moment fehlt allerdings die Zeit, die Ressourcen und auch der Wille, das selbst umzusetzen
Ich habe ein wenig mit Bevy herumgespielt und im Repository nachgesehen: Es gab 0 Lifetime-Annotationen
Eine Skriptsprache könnte etwas helfen, aber die heutigen Bevy-Nutzer sind meist sehr technisch geprägt und oft keine hauptberuflichen Designer, daher scheint die dringende Nachfrage derzeit nicht besonders groß zu sein
Ich freue mich auf den Einfluss der Rust-Community auf die Spieleentwicklung und würde irgendwann gern selbst dazu beitragen, aber im Moment werde ich aus den genannten Gründen bei meiner C++/C#-Pipeline bleiben. Rust lerne ich nebenbei richtig, und wenn die Werkzeuge ausgereifter sind, kann ich es für spätere Projekte in Betracht ziehen
Hot Reload ist oft nur ein Provisorium, das man einsetzt, wenn die Kompilierzeiten untragbar werden. Wenn der Durchschnitt bei 4 Sekunden und eine vollständige Neukompilierung bei etwa 20 Sekunden liegt, lohnt es sich weniger, viele Ressourcen in Wege zu stecken, die den vollständigen Build vermeiden
Ich habe allerdings gehört, dass Rust insgesamt längere Kompilierzeiten hat, daher könnte der Bedarf an Skripting oder Hot Reload früher kommen als gedacht. Trotzdem werden aktuelle Indie-Projekte vermutlich noch nicht an diese Grenze stoßen
Bevy-Gründer Cart ist der Ansicht, dass Bevy Rust-first sein sollte, und ich stimme dem persönlich zu. Das heißt aber nicht, dass man keine Plugins für verschiedene Skriptsprachen bauen kann, und tatsächlich gibt es davon bereits einige
Ich bin der Gründer von Bevy und leite das Projekt. Fragt mich alles
Bevy und die Community sind großartig. Wir mussten an ein paar Tickets arbeiten, und es war sehr einfach, einen der Core-Contributors zu finden, ihn zu sponsern und die Anfrage bis zum Ende durchzuschieben. So war es zum Beispiel bei Morph Targets
Carter baut da wirklich etwas Wichtiges auf, und dahinter steckt großartige Dynamik. Bevy macht Web-Deployment sehr einfach und verdient mehr Aufmerksamkeit. Die Community ist gut, und es ist leicht, Hilfe zu bekommen
Wann wird die Dokumentation besser? Wenn ich die Release Notes sehe, hätte ich idealerweise gern zu jedem Feature mehrere Seiten Dokumentation. Ich verstehe, dass viel Arbeit anfällt, und vielleicht ist vollständige Dokumentation erst nach mehr Stabilisierung realistisch
Wie meinungsstark ist Bevy als Engine? Mich würde interessieren, ob ihr jemals zwischen Features und Entwicklerzugänglichkeit Kompromisse eingehen musstet
Welche Art von Projekt ist aktuell ideal für Bevy?
Es gibt einige Skripting-Plugins, und derzeit scheint der Fokus vor allem auf rhai zu liegen, aber es wirkt, als kämen sie wegen fehlender angemessener Bevy-Unterstützung nicht richtig voran
Unabhängig davon, ob Bevy sich auf reine Rust-Spiele fokussiert oder nicht, gibt es Bedarf an Skripting, und einige Leute sind bereits damit beschäftigt, Third-Party-Lösungen zu suchen. Ich erwarte nicht sofort offizielles Bevy-Skripting, aber ich denke, Bevy sollte die Grundlagen akzeptieren, auf denen Third-Party-Crates funktionieren können
Im Artikel steht, dass Deferred Rendering kein MSAA unterstützt, aber das stimmt nur für naive Implementierungen
Man kann zum Beispiel im Pre-Pass eine Stencil-Maske für komplexe Pixel erzeugen und dann mit hierarchischer Early-Stencil-Rejection für komplexe Pixel einen Sample-pro-Sample-Pass und für die übrigen Pixel einen Pixel-pro-Pixel-Pass ausführen. Die Auslastung der SIMD-Lanes ist dabei nicht perfekt
Außerdem kann man einen Pass für die komplexe Pixelmaske haben und einen
(x, y, sample)-Koordinatenpuffer sammeln, um danach in einem einzelnen hybriden Pixel-/Sample-basierten Compute-Shader-Pass eine perfekte Auslastung der SIMD-Lanes zu erreichenIch mache seit einiger Zeit Spiele mit Bevy. Man kann auch den Code ansehen und Fragen stellen.
https://ant.care/
https://github.com/MeoMix/symbiants
Die bisherigen Schwierigkeiten sind, dass das UI-System zu umständlich ist, um Widgets bequem zu erstellen, weshalb ich auf egui umgestiegen bin, aber wahrscheinlich innerhalb eines Jahres zu nativem Bevy zurückkehren werde. Auch egui hat große Einschränkungen.
Die Unterstützung für Eltern-/Kind-Beziehungen ist nicht besonders umfangreich, und die ECS-Struktur sträubt sich in gewissem Maß dagegen. Einer Sprite ein Label zuzuweisen und die Sprite zu verschieben/zu drehen, während das Label nur der Position folgt, aber nicht der Rotation, war schwieriger als erwartet.
Persistenz von Entitäten über mehrere Sessions hinweg wird nicht von Haus aus unterstützt.
Entityist für die Eindeutigkeit auf Client-Seite gedacht, und auch gespeicherte Eltern-/Kind-Beziehungen lassen sich nicht automatisch einfach wiederherstellen.Es gibt noch keine Unterstützung für WASM-Parallelität, aber die Bevy-Architektur ist stark darauf ausgelegt, durch Aufgabenparallelisierung Performance-Gewinne zu erzielen, weshalb die Systemreihenfolge flexibel gehalten wird.
Räumliche Abfragen fühlen sich so an, als würden sie mit den Zielen von ECS kollidieren. Wenn man nicht nach Typen suchen will, also danach, ob eine Entität
Positionhat, sondern nach dem Wert vonPosition, entstehen viele Hilfscaches, die mit der Abfrage-Engine synchronisiert werden müssen.Wenn man die Welt mit
commandsverändert, wird das aus Performance-Gründen verzögert und im Batch verarbeitet; wenn es viele solche verzögerten Operationen gibt, wird es schwierig, Systeme zu bauen, die die Welt aktiv verändern. Deshalb ruft man häufigapply_deferredauf und verwendet benutzerdefinierte Befehle, um Race Conditions zu lösen.WASM auf Android, besonders die Kombination aus Pixel 6 und Chrome, funktioniert derzeit nicht, aber das ist ein Problem in einer unteren Abhängigkeit und soll in Bevy 13 behoben werden.
Die Vorteile sind, dass die Kombination aus Rust-Engine und Rust-Spiel sehr angenehm zu bearbeiten ist und sich Rust+WASM kaum so anfühlt, als würde einen die Technologie ausbremsen. Sobald das Denken auf ECS umgestellt ist, fällt es schwer, wieder zurückzugehen, und es ist sehr flexibel. Vielleicht sogar zu flexibel.
Die Community ist aktiv, daher findet man leicht Leute, mit denen man über Probleme sprechen kann, und auch wenn es nicht viele Dokumente gibt, gibt es viele Beispiele. Der Optimismus für die Zukunft ist groß, die Entwicklung verläuft schnell, und mit jeder Release werden die wichtigsten Bedenken deutlich vorangebracht.
Die Release Notes sind hervorragend.
Für erfahrene Spiele-/Engine-Entwickler ist manches vielleicht zu einsteigerfreundlich, aber aus Sicht von jemandem, der nicht ständig in dieser Welt unterwegs ist, war die Balance zwischen Erklärung der Änderungen und thematischer Einordnung sehr gut.
Ich habe den Witz gesehen, dass es 5 in Rust geschriebene Spiele gibt, aber 50 Game-Engines.
Gibt es tatsächlich eine Liste von mit Bevy geschriebenen Spielen?
Tiny Glade (https://pouncelight.games/tiny-glade) ist sehr beliebt und bekommt viel Aufmerksamkeit in sozialen Medien. Es verwendet Bevy ECS / Bevy App und einen benutzerdefinierten Renderer. https://store.steampowered.com/app/2198150/Tiny_Glade/
tunnet (https://puzzled-squid.itch.io/tunnet), Noumenal (https://noumenal.app/) und Foresight Mining (https://www.foresightmining.com/) gibt es ebenfalls. Foresight Mining ist eine Mining-"CAD"-Software und beschäftigt mehrere Bevy-Entwickler.
Axie Infinity: Homeland (https://app.axieinfinity.com/games/homeland-alpha/) verwendet Bevy ECS und Unity. Es gibt auch Shifting Chamber (https://maciekglowka.itch.io/shifting-chamber) und Hytopia (https://hytopia.com/).
Titleless Comfy City Builder (https://twitter.com/i_am_feenster/status/1710714877231186323), Molecoole (https://store.steampowered.com/app/1792170/Molecoole/) und Titleless industrial revolution builder (https://twitter.com/ElmoSampedro/status/1684920884811698176) gibt es ebenfalls.
Jarl Game (https://twitter.com/jarl_game) ist ein Dwarf-Fortress-artiges Spiel mit großartiger dynamischer Beleuchtung.
Auf itch.io gibt es unter dem Tag „bevy“ Hunderte von Spielen: https://itch.io/games/tag-bevy
Auch im Kanal #showcase auf dem Bevy-Discord ist viel Aktivität.
Alle Frameworks beginnen damit, etwas bereits Vorhandenes einfacher, sauberer und schneller umzusetzen, aber ihnen fehlen die glänzenden Features.
Dann holen sie bei den Features auf, werden zu demselben komplexen Monster, und der Kreislauf wiederholt sich.
Das Fazit klingt wie „Jede einfache Software, die Features hinzufügt, ist zum Scheitern verdammt“, was etwas dramatisch wirkt.
Ich würde gern wissen, ob es konkrete Gedanken oder Bedenken zur Architektur von Bevy oder zur Art gibt, wie dort Features hinzugefügt werden. Man gibt sich große Mühe, genau diesem Schicksal zu entgehen.
Tiny Glade verwendet
bevy_ecs, nutzt aber die Rendering-Crates von Bevy überhaupt nicht. Ich selbst habe auch ein paar PRs in Arbeit für alternative Rendering-Pfade, etwa Raytracing oder GPU-gesteuertes Meshlet- plus Visibility-Buffer-Rendering, und an Bevy intern ändert sich dabei fast nichts.Aus Sicht der Nutzer ändert sich ebenfalls kaum etwas. Man fügt der App einfach
FeatureFooPluginhinzu und verwendet etwas wieFooComponent, dann funktioniert es.Einzelne Crates oder Plugins können aufquellen, aber Bevy als Ganzes dürfte in Ordnung bleiben. Nutzer können solche Plugins einfach ignorieren und stattdessen etwas anderes verwenden, das besser zu ihnen passt.
Außerdem ist das hier eine Game Engine. Per Definition ist sie ein aufgeblähtes, komplexes Monster und wird alle möglichen Features aufsaugen, weil sie für irgendein Spiel nützlich sein könnten. Entscheidend ist, wie sich Feature-Bloat auf die Benutzbarkeit auswirkt. Wenn es 1000 Features gibt, man aber mit den meisten gar nicht interagieren muss, ist das völlig okay.
Dass das bei neuen Projekten leichter ist, die sich nicht um Abwärtskompatibilität kümmern müssen, stimmt sicher. Bei dem, was ich von Bevy gesehen habe, gibt es eine starke Kultur, eine gute User Experience einzufordern und die API-Oberfläche klein zu halten. Vielleicht liegt das auch an Rusts Paketierung, aber ich finde positiv, wie aktiv man dafür mit der Vergangenheit bricht.
Das Gute an
cargoist, dass man, selbst wenn man sich entscheidet, von Bevy abzuhängen, kein bewegliches Ziel verfolgen muss, falls eine künftige Version Breaking Changes enthält. Man bleibt einfach bei seiner Version. Trotzdem gibt es Anleitungen, um den Umstieg auf die neueste Version zu erleichtern. Zumindest war das meine Erfahrung aus dem bisschen, das ich mit Bevy herumprobiert habe.Beim Upgrade von 0.10 auf 0.11 waren ziemlich viele Änderungen an der App nötig, diesmal hat es jedoch direkt kompiliert.
Bevy ist besonders für große Projekte eine meiner bevorzugten Game Engines. Asset-V2-Preprocessing und
.meta-Dateien wirken sehr nützlich.Ich freue mich auch auf die Lightmap-Unterstützung in künftigen Releases.
Ich habe mir die Web-Beispiele angesehen und dann den UI-Bereich, und es scheint, als würde alles vollständig innerhalb des Canvas verarbeitet.
Könnte man die UI stattdessen als DOM erstellen und an WASM anbinden?
Auf der Rust-, also WASM-Seite gibt es Dinge wie
web_sys, und auf der JavaScript-Seite kann man auch WASM-Funktionen aufrufen, also gibt es viele Möglichkeiten.