Bevy 0.20
Dankzij 227 contributors, 817 pull requests, community-reviewers en onze gulle donateurs zijn we blij aan te kondigen dat Bevy 0.20 is uitgebracht op crates.io!
Voor wie het nog niet weet: Bevy is een verfrissend eenvoudige, data-gestuurde game-engine gebouwd in Rust. Je kunt onze Quick Start Guide raadplegen om het vandaag nog te proberen. Het is voor altijd gratis en open source! De volledige broncode is beschikbaar op GitHub. Bezoek Bevy Assets voor een collectie door de community ontwikkelde plugins, games en leerbronnen.
Om een bestaande Bevy-app of plugin bij te werken naar Bevy 0.20, kun je kijken in onze Migration Guide van 0.19 naar 0.20.
Sinds onze laatste release van een paar maanden geleden hebben we een schat aan nieuwe functies, bugfixes en kwaliteit-van-leven-aanpassingen toegevoegd. Hier zijn enkele van de hoogtepunten:
- Solari en DLSS: Solari, de realtime pathtraced renderer van Bevy, is nu sneller, nauwkeuriger, ondersteunt meer Bevy-renderingfuncties en draait op macOS via Metal!
- BSN Syntax Verbeteringen: BSN, het nieuwe scene-systeem van Bevy, heeft enkele syntaxiswijzigingen ondergaan die het veel gemakkelijker maken om te lezen en samen te stellen.
- Ready Event: BSN scene-entities triggeren nu een observeerbaar
Ready-event wanneer al hun kinderen zijn gespawnd. - Meer UI Widgets: Bevy Feathers, de uitgesproken editor-gecentreerde UI-toolkit van Bevy, beschikt nu over Color Input, Scrollable List View, Dropdown Selection en Lazy Menu widgets. De Number Input widget is nu schuifbaar/sleepbaar, en we hebben Headless Tab Widgets toegevoegd.
- WESL Shaders: Bevy heeft officieel de WESL-shader-taal overgenomen (een gestandaardiseerde extensie van WGSL). WESL is al een verbetering ten opzichte van het oude, aangepaste WGSL-dialect van Bevy.
- Sprite Materials en Extended 2D Materials: Het is nu mogelijk om aangepaste shader-materialen te maken voor Sprites, en 2D mesh-materialen kunnen nu worden uitgebreid, net zoals in 3D.
- Pan Orbit Camera: Bevy heeft nu een "pan orbit camera", waardoor het mogelijk is om door scenes te navigeren op een CAD-achtige manier.
- Zwakke Systeemvolgorde met
chain_weak: Een lossere manier om systemen te ordenen, wat de parallellisatie kan verbeteren. - Contextuele Thema's: Thema-variabelen kunnen nu veranderen afhankelijk van de parent-entity.
- Val::Em en Val::Rem: Bevy UI ondersteunt nu em en rem als maateenheden.
- Per-Column Change Ticks: Optimalisatie om sneller wijzigingen in kolommen met entiteiten te detecteren.
- FixedNode: Een nieuwe marker-component voor Bevy UI voor positionering ten opzichte van het viewport.
- Elliptische Border Radius: Bevy UI kan nu nodes tekenen met elliptische randgeometrie.
- Schedule Randomisatie: Mogelijkheid om de volgorde van systemen te randomiseren om non-deterministische bugs op te sporen.
- Catching Panics: Panics worden nu omgezet in fouten die naar een fallback error handler worden gestuurd.
- Snellere Bulk Despawning: De nieuwe
despawn_allcommand vermindert de overhead bij het verwijderen van grote hoeveelheden entiteiten. - Betere Textuurcompressie: Verbeterde compressie-backend via de
ctt-bibliotheek en automatische mipmap-generatie. - Bevy Error Context Berichten: Ergonomische manier om extra context aan fouten toe te voegen via de
context-methode. - InlineBox en InlineImage: Mogelijkheid om ruimte te reserveren in tekstlayouts voor aangepaste inhoud en afbeeldingen.
---
Solari en DLSS
Auteurs: @JMS55, @mate-h, @stuartparmenter PRs: #24667, #24767, #25082, #25123, #25244, #25423, #25513, #25518, #25703, #25704, #25787, #25814
Solari, de realtime pathtraced renderer van Bevy, heeft grote verbeteringen ondergaan op vrijwel elk vlak. Voor technische details kun je de blog van JMS55 lezen; hieronder volgt het overzicht.
Verbeterde Beeldkwaliteit
Dankzij verbeteringen in de ReSTIR-implementatie is het renderen nu grotendeels onbevooroordeeld (unbiased), wat leidt tot veel nauwkeuriger verlichting. Daarnaast hebben bewegende objecten geen schaduwen meer die achterblijven, en reflecties zien er aanzienlijk minder flikkerend uit tijdens beweging, vooral bij niet-metalen materialen.
Verbeterde Prestaties
Omdat DLSS-RR in recente updates zeer goed is geworden, kost ReSTIR in veel scenes relatief veel prestaties zonder de beeldkwaliteit significant te verbeteren. Daarom is ReSTIR nu optioneel en staat het standaard uit.
- Let op: Gebruikers van Solari in Bevy 0.19 moeten controleren of het wegvallen van ReSTIR invloed heeft op hun scene. Zo ja, schakel
SolariLighting::restirdan opnieuw in. - Gevolg: Zonder ReSTIR kan de schaduwkwaliteit afnemen en kunnen schaduwen in beweging ontbreken in scenes met veel lichten.
Daarnaast is de scene-managementcode van Solari nu "retained" en sterk geoptimaliseerd, wat leidt tot aanzienlijk lagere CPU-kosten. In SolariLighting zijn nieuwe knoppen toegevoegd (world cache size, per-pixel light sample count, temporal accumulation, en path tracing bounce count) om prestaties en kwaliteit per project af te stemmen.
Verbeterde Compatibiliteit
Solari ondersteunt nu verlichting van Atmosphere en EnvironmentMapLights op camera's, naast de bestaande ondersteuning voor DirectionalLight en emissieve meshes. Ondersteuning voor PointLight, SpotLight en RectLight volgt in de nabije toekomst.
Solari draait nu ook op macOS, hoewel er momenteel geen ingebouwde denoiser voor macOS is. MetalFX Ray Reconstruction is een mogelijke toekomstige oplossing.
DLSS Updates
De dlss_wgpu crate is bijgewerkt naar de nieuwste versie van DLSS, inclusief ondersteuning voor DLSS-RR 4.5, wat de denoising-kwaliteit in Solari aanzienlijk verbetert. Gebruikers moeten de nieuwste DLSS SDK downloaden en instellen om compiler-fouten te voorkomen.
---
BSN Syntax Verbeteringen
Auteurs: @cart PRs: #25318, #25626
BSN had enkele eigenaardigheden die in de praktijk voor wrijving zorgden. De syntaxis is nu verbeterd voor betere ergonomie en helderheid.
Expliciete Scene Syntaxis
Alle scene-referenties vereisen nu @ prefixes.
Voorheen:
bsn! {
scene_variable
scene_function()
@SceneComponent
{scene_expression}
}
Nu:
bsn! {
@scene_variable
@scene_function()
@SceneComponent
@{scene_expression}
}
Geen template_value wrappers meer
De omslachtige template_value wrappers kunnen nu worden verwijderd uit componentwaarden.
Voorheen:
bsn! {
template_value(component_variable)
template_value(component_function())
}
Nu:
bsn! {
component_variable
component_function()
}
Enums "werken gewoon"
Enums vereisen geen VariantDefaults of FromTemplate meer, mits ze Default en Clone implementeren.
Voorheen:
#[derive(Component, Default, Clone, VariantDefaults)]
enum Foo {
A { x: u32, y: u32 },
#[default]
B,
}
bsn! {
Foo::B
}
Nu:
#[derive(Component, Default, Clone)]
enum Foo {
A { x: u32, y: u32 },
#[default]
B,
}
bsn! {
Foo::B
}
Als een enum geen VariantDefaults ondersteunde, kan de template_value wrapper nu worden verwijderd:
- Voorheen:
bsn! { template_value(Foo::A) } - Nu:
bsn! { Foo::A }
Belangrijk: Omdat VariantDefaults is verwijderd, moeten nu alle velden van een enum-variant expliciet worden gespecificeerd.
- Voorheen (y was default):
bsn! { Foo::A { x: 1 } } - Nu (y moet handmatig):
bsn! { Foo::A { x: 1, y: 0 } }
Ondersteuning voor Geketende Methoden (Chained Methods)
Het "builder pattern" vereist geen template_value wrapper meer.
Voorheen:
bsn! {
template_value(Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y))
}
Nu:
bsn! {
Transform::from_xyz(-2.5, 4.5, 9.0).looking_at(Vec3::ZERO, Vec3::Y)
}
Dit geldt ook voor gevallen zoals bsn! { node.clone() }. In het algemeen kunnen bijna alle template_value instanties uit BSN-declaraties worden verwijderd.
Verbeterde Lijst-syntaxis
BSN gebruikte voorheen komma's en optionele haakjes () om entiteiten te scheiden, wat leidde tot veel visuele ruis en overmatige inspringing.
Oude syntaxis (met ruis):
bsn! {
Node
Children [
(
#OkButton
@button("Ok")
),
(
#CancelButton
@button("Cancel")
),
]
}
Nieuwe syntaxis: BSN gebruikt nu -- om entiteiten in een lijst te scheiden.
bsn! {
Node
Children [
#OkButton
@button("Ok")
--
#CancelButton
@button("Cancel")
]
}
Daarnaast wordt het gebruik van [] en () voor bsnlist! en bsn! nu afgeraden vanwege slechte rustfmt autoformatting. Gebruik in plaats daarvan bsnlist! {}.
bsn_list! {
#Ok @button("Ok")
--
#Cancel @button("Cancel")
}
---
Ready Event
Auteurs: @cart PRs: #25296
Met de introductie van BSN ontbrak een cruciale functie: de mogelijkheid om logica uit te voeren wanneer een scene volledig "klaar" is en gespawnd (bijv. alle afhankelijkheden zijn geladen, de volledige hiërarchie is aanwezig).
De oplossing is het triggeren van een nieuw Ready event voor elke entity in een gespawnde scene, nadat de volledige spawn-logica (inclusief afstammelingen) is uitgevoerd. Dit maakt het volgende mogelijk:
#[derive(SceneComponent, Default, Clone)]
struct Widget;
impl Widget {
fn scene() -> impl Scene {
bsn! {
Node { width: px(100), height: px(100) }
on(|ready: On<Ready>| {
info!("De volledige scene, inclusief 'widget.bsn' inhoud, is hier beschikbaar")
})
Children [
Text("hello")
--
:"widget.bsn"
]
}
}
}
world.spawn(bsn! { @Widget })
---
Meer Feathers Widgets
Auteurs: @viridia, @gagnus, @tmstorey PRs: #25446, #25079, #24092, #24847, #24784, #24636, #24701
Feathers, de UI-toolkit van Bevy, heeft nieuwe widgets:
- Color Input: Een compacte kleurkiezer die een popup opent met een kleurenwiel, RGB- en HSL-selectors en een raster met onlangs gebruikte kleuren.
- List View / Scrollbar: Een scrollbare, selecteerbare lijstweergave.
- Dropdown Selection: Een selectieveld dat een dropdown-lijst met opties toont.
- Lazy Menu: Spawnt een menu-popup wanneer het menu wordt geopend en despawnt deze wanneer het wordt gesloten (in tegenstelling tot de normale Menu widget die het menu enkel verbergt).
- Number Input Scrubbing / Dragging: De
FeathersNumberInputondersteunt nu zowel tekstinvoer als het slepen (scrubbing) om waarden aan te passen. Er zijn instellingen voor harde limieten (min/max via alle methoden), zachte limieten (min/max via slepen), precisie en stapgroottes.
---
Headless Tab Widgets
Auteurs: @jbuehler23 PRs: #25515
bevyuiwidgets bevat nu "headless" tab-functionaliteit (breng je eigen visuals mee): een TabList container en Tab headers.
De selectie wordt extern beheerd. SelectedTab op de lijst houdt de geselecteerde tab bij; interactie zendt een ValueChange<Option<Entity>> request uit. Tabs ondersteunen toetsenbord-shortcuts en integreren met Bevy's focus, interactie en toegankelijkheidssystemen.
bsn! {
TabList
SelectedTab(Some(first_tab))
on(tablist_self_update)
Children [
Tab Children [ Text("General") ]
--
Tab Children [ Text("Rendering") ]
]
}
---
WESL Shaders
Auteurs: @tychedelia, @BenjaminBrienen PRs: #25088
Bevy shaders zijn nu geschreven in WESL. De ondersteuning voor de oude "Custom Bevy Extended WGSL" is verwijderd. WESL is een standaard die WGSL uitbreidt met modules, imports, conditionele compilatie en meer.
Dit is beter voor het ecosysteem omdat we nu resources kunnen delen voor taalverbeteringen en IDE-tooling. Dit omvat ondersteuning voor het Language Server Protocol via wgsl-analyzer (syntax highlighting, go-to-definition, etc.).
Aangepaste shaders in het oude dialect moeten worden vertaald naar WESL en omgedoopt van .wgsl naar .wesl. Gewone WGSL-bestanden zonder preprocessor-directieven blijven werken.
Voorbeeld van wijziging:
- Voorheen (Custom Bevy Extended WGSL):
``rust ##import bevypbr::forwardio::VertexOutput #import "shaders/util.wgsl"::hsvtorgb #ifdef VERTEXCOLORS var<private> tint: vec4<f32>; #endif @group(2) @binding(#{MATERIALBIND_GROUP}) var<uniform> color: vec4<f32>; ``
- Nu (WESL):
``rust #import bevypbr::render::forwardio::VertexOutput; import super::util::hsvtorgb; @if(VERTEXCOLORS) var<private> tint: vec4<f32>; @group(2) @binding(constants::MATERIALBIND_GROUP) var<uniform> color: vec4<f32>; ``
---
Mesh Shaders
Auteurs: @ChristopherBiscardi PRs: #25627
Mesh shaders zijn nu geïntegreerd in de pipeline cache van Bevy. Ze kunnen worden gebruikt voor:
- Meshlets (gegenereerd via tools zoals
meshoptimizer). - Procedureel gras met dynamische level-of-detail.
- Voxels (zoals nvidium).
- Particles.
Mesh shaders vervangen in feite de klassieke vertex shader door een compute shader, waardoor geometrie direct op de GPU kan worden gegenereerd. Een MeshPipeline bevat optioneel een task shader (amplification shader), een mesh shader en een fragment shader.
Voorbeeld implementatie:
let mut pass = render_context.begin_tracked_render_pass(RenderPassDescriptor {
label: Some("custom_mesh_shader_pass"),
color_attachments: &[Some(target.get_color_attachment())],
depth_stencil_attachment: Some(depth.get_attachment(StoreOp::Store)),
..default()
});
pass.set_render_pipeline(mesh_pipeline);
pass.set_bind_group(0, &bind_group, &[view_uniform_offset.offset]);
// draw_mesh_tasks dispatcht de task shader of de mesh shader
pass.draw_mesh_tasks(1, 1, 1);
Let op: Mesh shaders zijn een geavanceerde techniek met platformspecifieke prestaties en worden niet ondersteund op webplatforms.
---
Sprite Materials
Auteurs: @cookie1170 PRs: #25415
Het is nu mogelijk om aangepaste shaders voor sprites te maken door de MaterialExtension2d trait te implementeren, de SpriteMaterial component toe te voegen en de SpriteMaterialPlugin aan de app toe te voegen.
De shader kan gebruikmaken van functies uit bevyspriterender::sprite_mesh::functions, zoals:
samplefinalcolor: Samplet de uiteindelijke kleur inclusief tint en alpha discard.samplespritetexture: Samplet de textuur zonder tint en alpha discard.getfinalcolor: Past tint en alpha discard toe.
---
2D Extended Materials
Auteurs: @cookie1170 PRs: #25183
Bevy biedt nu een 2D-equivalent van de 3D ExtendedMaterial. Hiermee kun je een bestaand materiaal uitbreiden.
Voorbeeld:
#[derive(AsBindGroup, Reflect, Clone)]
struct MyMaterial {
#[uniform(20)]
value: Vec4,
}
impl MaterialExtension2d for MyMaterial {
fn fragment_shader() -> Option<ShaderRef> {
Some("my_material.wesl".into())
}
}
// Gebruik in ExtendedMaterial2d
let handle = materials.add(ExtendedMaterial2d {
base: ColorMaterial::from_color(Color::WHITE),
extension: MyMaterial {
value: Vec4::ZERO,
},
});
commands.spawn((
Mesh2d,
MeshMaterial2d(handle),
));
---
Sprite Render Backend Unificatie
Auteurs: @IceSentry PRs: #25432
De sprite render backend is vervangen door een nieuwe backend die veel infrastructuur van 3D hergebruikt. Dit resulteert in betere prestaties en een eenvoudiger onderhoud.
---
Pan Orbit Camera
Auteurs: @aevyrie, @taishi-sama PRs: #25434
De bevyeditorcam is nu officieel onderdeel van de bevycameracontroller crate als PanOrbitCamera.
Gebruik:
- Voeg
MeshPickingPluginenDefaultPanOrbitCameraPluginstoe aan de app. - Voeg de
PanOrbitCameracomponent toe aan een 3D camera.
app.add_plugins((
MeshPickingPlugin,
DefaultPanOrbitCameraPlugins,
))
commands.spawn((
Camera3d::default(),
PanOrbitCamera::default(),
))
---
Zwakke Systeemvolgorde met chain_weak
Auteurs: @JMS55 PRs: #25128
Het ordenen van grote groepen systemen met .chain() kan te strikt zijn, waardoor worker threads onnodig wachten. De nieuwe functies chainweak(), beforeweak(), en after_weak() bieden een lossere optie. De volgorde wordt alleen strikt gehandhaafd tussen systemen wiens data-toegang daadwerkelijk conflicteert.
Voorbeeld:
schedule.configure_sets(
(
ExtractCommands,
PrepareMeshes,
CreateViews,
Specialize,
PrepareViews,
Queue,
PhaseSort,
Prepare,
Render,
Cleanup,
PostCleanup,
)
.chain_weak(),
);
Systemen die niet conflicteren kunnen nu parallel draaien. Systemen die Commands produceren of exclusieve systemen worden echter altijd als conflicterend beschouwd om de correcte volgorde te garanderen.
---
Contextuele Thema's
Auteurs: @viridia PRs: #24969
Feathers ondersteunt nu "contextuele theming". Thema-variabelen kunnen veranderen op basis van de parent-entity (bijv. een dialoogvenster heeft andere kleuren dan de hoofdachtergrond).
Dit werkt via de ThemeContext component, met schema's zoals Base, Higher, Highest, en Floating. In combinatie met SemanticToken wordt een kleur bepaald op basis van zowel de token als de huidige context.
---
Val::Em en Val::Rem
Auteurs: @gagnus PRs: #25231
Bevy UI ondersteunt nu em (huidige lettergrootte, via EmSize) en rem (globale root lettergrootte, via RemSize).
Voorbeeld:
bsn! {
Node { width: em(10) }
Text("Hello")
TextFont { font_size: FontSize::Rem(1.5) }
}
De standaard lettergrootte is nu rem(1) in plaats van px(20).
---
Per-Column Change Ticks
Auteurs: @pcwalton, @SkiFire13 PRs: #25157, #25429
Components kunnen nu opt-in voor "column summary change ticks":
#[derive(Component)]
#[component(summary_tick)]
struct MyComponent { /* velden */ }
Dit slaat een "column change tick" op naast de "per-entity change tick". Hierdoor kan de engine een hele kolom entiteiten overslaan bij het zoeken naar wijzigingen, wat in sommige gevallen (zoals GPU mesh extraction) tot een snelheidswinst van 132x kan leiden.
---
FixedNode
Auteurs: @ickshonpe PRs: #24323
FixedNode is een nieuwe marker-component voor Bevy UI. Een node met FixedNode wordt gepositioneerd ten opzichte van het viewport van de camera in plaats van ten opzichte van het parent-element. Het gedraagt zich als een "root node".
---
Elliptische Border Radius
Auteurs: @ickshonpe PRs: #24779
Bevy UI kan nu nodes tekenen met elliptische randen. BorderRadius gebruikt nu CornerRadius om verschillende radii per as in te stellen.
let a = BorderRadius::all(CornerRadius::circular(vh(10.)));
let b = BorderRadius::all(vh(10.)); // a == b
let c = BorderRadius::top_right(CornerRadius::new(px(10.), px(20.)));
---
Schedule Randomisatie
Auteurs: @andriyDev PRs: #25094
Schedules bepalen de volgorde van systemen. Wanneer er geen expliciete volgorde is maar systemen wel conflicteren, is de volgorde voorheen non-deterministisch maar vaak "toevallig" consistent. Dit maakt bugs lastig te vinden.
Met schedule randomisatie kan de volgorde van systemen worden gehusseld terwijl expliciete constraints worden gerespecteerd.
Voorbeeld:
App::new()
.add_plugins(DefaultPlugins)
.edit_schedule(Update, |schedule| {
let rng_seed: u64 = rand::random();
info!("Randomizing Update schedule with seed={rng_seed}");
schedule.set_build_settings(ScheduleBuildSettings {
shuffle_seed: Some(rng_seed),
..Default::default()
});
})
.run();
---
Catching Panics
Auteurs: @SpecificProtagonist PRs: #24240
Voorheen bracht een panic de hele app ten val. In Bevy 0.20 worden panics nu omgezet in fouten en doorgegeven aan de fallback error handler. Hiermee kun je ervoor kiezen om een fout te loggen en door te gaan in plaats van dat het programma crasht.
---
Snellere Bulk Despawning
Auteurs: @loreball PRs: #25743, #25851
Het batch-verwijderen van entiteiten via de nieuwe despawn_all<F: QueryFilter> command is nu sneller door verminderde overhead.
Prestatiewinst (AMD Ryzen 9 9950X3D):
| Entiteiten | despawn | despawn_all | Versnelling |
|---|---|---|---|
| 100 | 3.68 µs | 2.84 µs | 1.30× |
| 1,000 | 25.2 µs | 15.3 µs | 1.65× |
| 10,000 | 254.9 µs | 149.7 µs | 1.70× |
| 100,000 | 3.17 ms | 2.07 ms | 1.53× |
Gebruikers van DespawnOnEnter of DespawnOnExit profiteren hier automatisch van.
---
Betere Textuurcompressie
Auteurs: @JMS55, @cwfitzgerald PRs: #24223
Bevy 0.20 verbetert de memory footprint via een nieuwe compressie-backend (ctt library).
- BCn & ASTC: De
CompressedImageSavercomprimeert texturen naar BCn (desktop) of ASTC (mobiel), wat hogere kwaliteit biedt dan de vorige Basis Universal aanpak. - Automatische Mipmaps: De nieuwe backend genereert automatisch een volledige mip chain tijdens compressie, wat aliasing vermindert en GPU-cache utilisatie verbetert.
- Mobiele GPU's: Stel
BEVYCOMPRESSEDIMAGESAVERASTCin voor de gewenste block size (bijv. 4x4). - Cross-platform: De Basis Universal compressie is verplaatst naar de
compressedimagesaver_universalfeature voor WebGPU en cross-platform distributie.
---
Bevy Error Context Berichten
Auteurs: @cookie1170 PRs: #24528
BevyError biedt nu een context-methode om extra informatie aan fouten toe te voegen, vergelijkbaar met de anyhow crate.
Voorbeeld:
fn fallible() -> Result<(), BevyError> {
let parsed: usize = "I am not a number"
.parse()
.context("Failed to parse number")?;
Ok(())
}
Wanneer meerdere contexten worden gestapeld, worden deze allemaal getoond in het logboek, wat debugging vergemakkelijkt zonder dat er direct een verbose backtrace nodig is.
---
InlineBox en InlineImage
Auteurs: @ickshonpe PRs: #25710
Om complexere UI-elementen te maken waarbij tekst rondom elementen vloeit, introduceert Bevy de InlineBox component. Hiermee kan ruimte worden gereserveerd in tekstlayouts voor aangepaste inhoud. Gebruik de InlineImage component om afbeeldingen tussen tekst te plaatsen.
---
Wat is het volgende?
Bevy is nooit "af". Hier is een blik op toekomstige functies:
- .bsn asset formaat: Nu de syntaxis stabiel is, wordt BSN een menselijk leesbaar en hot-reloadable bestandsformaat.
- Assets as Entities: We werken aan het representeren van assets als entiteiten, zodat ze toegang hebben tot de volledige kracht van de ECS (event observers, relaties).
- Remote Inspector: De mogelijkheid om entiteiten te bekijken en aan te passen via externe tools op andere apparaten.
- Krachtigere Required Components: Integratie van required components met de
Templatetrait voor meer flexibiliteit. - Mutually Exclusive Components: Een manier om statisch te garanderen dat bepaalde componenten (bijv. Player en Camera) nooit tegelijkertijd op één entity voorkomen.
- HDR (High Dynamic Range) Display Support: Ondersteuning voor een breder kleurenbereik.
---
Ondersteun Bevy
Bevy zal altijd gratis en open source blijven, maar het kost geld om het te maken. We vertrouwen op de vrijgevigheid van de community. Overweeg een donatie aan de Bevy Foundation om ons werk te ondersteunen.
---
Contributors
Een enorme dank aan de 226 contributors die deze release mogelijk hebben gemaakt:
(Lijst van contributors weggelaten voor leesbaarheid, maar aanwezig in de brontekst)
Groetjes,