Bevy 0.12 - Engine game hướng dữ liệu được viết bằng Rust
(bevyengine.org)- Trình kết xuất hỗ trợ Deferred Rendering tùy chọn, có thể chọn đường dẫn forward hoặc deferred theo từng material và đặt giá trị mặc định toàn cục bằng
DefaultOpaqueRendererMethod - Các ứng dụng hoặc plugin Bevy hiện có cần kiểm tra quy trình migration qua 0.11 to 0.12 Migration Guide
- Bevy Asset V2 hỗ trợ tiền xử lý asset, cấu hình dựa trên tệp
.meta, nhiềuAssetSource, sự kiện tải phụ thuộc đệ quy, asset I/O bất đồng bộ và các handle được cải tiến - Tiền xử lý asset được kích hoạt bằng
AssetPlugin { mode: AssetMode::Processed }và tính năng Cargobevy/asset_processor, nhưng hiện vẫn chưa được khuyến nghị cho phần lớn trường hợp sử dụng - Trên Android, ứng dụng không còn bị crash khi bị tạm dừng, sẽ dừng chạy hệ thống cho đến khi tiếp tục và cung cấp các sự kiện
ApplicationLifetime::SuspendedvàApplicationLifetime::Resumed StandardMaterialđược bổ sungspecular_transmission,diffuse_transmission,thickness,ior,attenuation_color,attenuation_distance, hỗ trợ biểu diễn các vật liệu truyền sáng như kính, nước, nhựa, lá cây và giấy- Trình tải glTF hỗ trợ các phần mở rộng
KHR_materials_transmission,KHR_materials_ior,KHR_materials_volume,KHR_materials_emissive_strength, và có thể nhập bản đồ UV thứ hai làTEXCOORD1hoặcUV1 - Tự động batching/instancing cho draw command đã khả dụng, hiện có thể gom nhóm các entity có cùng material và mesh, và có thể loại trừ bằng component
NoAutomaticBatching - Bóng đổ áp dụng PCF Shadow Filtering, hỗ trợ bóng mượt hơn cho
DirectionalLightvàSpotLight, với phương thức mặc định làShadowMapFilter::Castano13 - ECS bổ sung one-shot systems, cho phép đăng ký system rồi chạy khi cần bằng
SystemId, nhưng không hỗ trợ exclusive system, system dùng cho system piping, tự gọi chính nó hoặc đánh giá song song FixedTimeđã bị loại bỏ vàTimesẽ trả về giá trị phù hợp theo ngữ cảnh cả trongFixedUpdate, đồng thời ngăn hiện tượng “death spiral” khiến ứng dụng bị treo doFixedUpdatetích lũy quá mức- Trong
AnimationPlayer,set_elapsedđược thay bằngseek_to,stop_repeatingđược thay bằngset_repeat(RepeatAnimation::Never), vàelapsedtrả về thời gian thực đã trôi qua, không bị ảnh hưởng bởi tốc độ animation - Cú pháp import shader của Bevy đã chuyển sang kiểu Rust, hỗ trợ
#import bevy_pbr::forward_io::VertexOutput, import nhiều mục bằng dấu ngoặc nhọn, import đường dẫn bộ phận và sử dụng đường dẫn định danh đầy đủ - UI có thể dùng shader material tùy chỉnh trên node UI thông qua
UiMaterial, và hỗ trợ viền ngoài cho node không chiếm không gian layout bằng componentOutline - Tích hợp accessibility bổ sung resource
ManageAccessibilityUpdates, cho phép dừng tự động cập nhật cây accessibility của engine khi giá trị làfalse
1 bình luận
Ý kiến trên Hacker News
So với các engine truyền thống như Unity hay Godot, Bevy có cách làm game hoàn toàn khác
Không có UI hay scripting, mọi thứ đều xử lý bằng mã Rust nên gần với libGDX hay Cocos2D-x hơn. Tuy nhiên vì dùng ECS và Rust nên cách viết code cũng khác đi rất nhiều, tạo cảm giác như nó gần như ở trên một hòn đảo riêng
Tôi muốn thấy một game indie thành công làm bằng Bevy, nhưng nhiều khả năng phần lớn nhà phát triển game sẽ thích các công cụ truyền thống mà họ đã học và xung quanh cũng đang dùng hơn. Giao điểm giữa những người muốn làm game và cũng thích Rust không lớn, và ngay cả trong nhóm đó, có vẻ nhiều người sẽ chọn công cụ đã có độ tin cậy và tài liệu tích lũy hơn là bỏ ra rất nhiều thời gian và công sức để học một engine mới mang tính thử nghiệm
Cá nhân tôi nghĩ Bevy cần một IDE và ngôn ngữ scripting dựa trên Bevy và Rust. Điều đó sẽ không xóa bỏ rào cản phải đầu tư nhiều công sức cho dự án mới, nhưng có thể khiến nó thân thiện hơn nhiều với người dùng mới không có kinh nghiệm Rust và thấy ngại khi phải bắt đầu từ một bức tường code. Điều này trái ngược với cách của Unity hay Godot, nơi bạn có thể tạo một prototype rất cơ bản trên canvas chỉ trong vài giờ
Tôi biết các nhà phát triển phản đối ngôn ngữ scripting, nhưng hot reload và debugging sâu hơn là cần thiết, và tôi nghĩ chỉ với Rust thì khó làm hiệu quả. Nhiều nhà phát triển game cũng có thể bị choáng ngợp bởi Rust và borrow checker. Dù vậy hiện tại tôi không có thời gian, tài nguyên hay ý chí để tự triển khai
Tôi đã thử Bevy một chút và kiểm tra repository thì thấy không có annotation lifetime nào
Ngôn ngữ scripting có thể giúp được phần nào, nhưng những người đang dùng Bevy hiện nay thường rất thiên về kỹ thuật và nhiều khi không phải designer toàn thời gian, nên có vẻ nhu cầu cấp thiết không quá lớn
Tôi kỳ vọng ảnh hưởng của cộng đồng Rust đối với phát triển game và muốn đóng góp vào một ngày nào đó, nhưng hiện tại vì những lý do đã nêu, tôi vẫn định duy trì pipeline C++/C#. Tôi sẽ học Rust cho tử tế ở bên cạnh, và khi công cụ trưởng thành hơn thì có thể cân nhắc cho các dự án sau
Hot reload thường là giải pháp tạm thời khi thời gian biên dịch trở nên khó chịu. Nếu trung bình khoảng 4 giây, biên dịch lại toàn bộ khoảng 20 giây, thì nhu cầu bỏ nhiều tài nguyên vào các cách tránh biên dịch toàn bộ sẽ giảm đi
Tuy nhiên tôi nghe nói Rust nhìn chung có thời gian biên dịch dài hơn, nên nhu cầu scripting hoặc hot reload có thể đến sớm hơn dự đoán. Dù vậy các dự án indie đang thực hiện hiện nay có lẽ vẫn chưa chạm tới rào cản đó
Cart, người sáng lập Bevy, cho rằng Bevy nên ưu tiên Rust, và cá nhân tôi cũng đồng ý. Điều đó không có nghĩa là không thể tạo plugin cho nhiều ngôn ngữ scripting; thực tế đã có vài plugin như vậy
Tôi là người sáng lập Bevy và là trưởng dự án. Có thể hỏi tôi bất cứ điều gì
Bevy và cộng đồng của nó rất tuyệt. Chúng tôi cần xử lý một số ticket, và việc tìm một trong các contributor cốt lõi để tài trợ rồi thúc đẩy yêu cầu đến cùng là rất dễ. Ví dụ như morph target là một trường hợp như vậy
Carter đang tạo ra một thứ thực sự quan trọng, và đằng sau nó có động lực phát triển rất tốt. Bevy triển khai lên web rất dễ, và đáng để nhiều người xem xét hơn. Cộng đồng cũng tốt và dễ tìm sự giúp đỡ
Khi nào tài liệu sẽ được cải thiện? Nhìn vào release note, lý tưởng là mỗi tính năng nên có vài trang tài liệu. Tôi hiểu là có rất nhiều việc, và có thể tài liệu đầy đủ chỉ khả thi sau khi ổn định hơn
Bevy là một engine mang tính định hướng/opinionated đến mức nào? Tôi tò mò liệu đã từng có lúc phải đánh đổi giữa tính năng và khả năng tiếp cận với nhà phát triển chưa
Hiện tại loại dự án lý tưởng nhất cho Bevy là gì?
Có một số plugin scripting và hiện có vẻ chủ yếu tập trung vào rhai, nhưng cảm giác như đang bị chặn vì thiếu hỗ trợ Bevy phù hợp
Dù trọng tâm hiện tại của Bevy có phải là game chỉ dùng Rust hay không, nhu cầu scripting vẫn tồn tại, và đã có những người bận rộn tìm giải pháp bên thứ ba. Tôi không kỳ vọng scripting Bevy chính thức ngay lập tức, nhưng tôi nghĩ Bevy nên chấp nhận nền tảng để các crate bên thứ ba có thể hoạt động
Bài viết nói rằng deferred rendering không hỗ trợ MSAA, nhưng điều đó chỉ đúng với cách triển khai ngây thơ
Ví dụ, trong pre-pass có thể tạo stencil mask cho các pixel phức tạp, rồi dùng hierarchical early stencil rejection để chạy pass theo từng sample cho pixel phức tạp và pass theo từng pixel cho các pixel còn lại. Việc tận dụng SIMD lane sẽ không hoàn hảo
Ngoài ra, nếu có một pass xử lý mask của pixel phức tạp và thu thập buffer tọa độ
(x, y, sample), thì trong pass compute shader lai theo từng pixel/từng sample sau đó, cũng có thể tận dụng SIMD lane hoàn hảoTôi đã làm game bằng Bevy được một thời gian. Có thể xem mã nguồn và cũng có thể đặt câu hỏi
https://ant.care/
https://github.com/MeoMix/symbiants
Những khó khăn cho đến nay là hệ thống UI quá dài dòng để tạo widget một cách thoải mái nên tôi đã chuyển sang egui, nhưng có lẽ trong vòng 1 năm nữa tôi sẽ quay lại Bevy native. egui cũng có những hạn chế lớn
Hỗ trợ quan hệ cha/con không nhiều, và ECS có cấu trúc phần nào không khuyến khích điều đó. Việc gắn nhãn cho sprite, rồi khi di chuyển/xoay sprite thì nhãn chỉ đi theo vị trí mà không xoay theo, khó hơn dự kiến
Không có hỗ trợ mặc định cho việc duy trì entity qua các phiên. Entity dùng cho tính duy nhất phía client, và việc dễ dàng tái tạo lại các quan hệ cha/con đã lưu cũng không tự động
Hiện vẫn chưa hỗ trợ tính song song WASM, nhưng kiến trúc Bevy được thiết kế khá nhiều để giữ thứ tự hệ thống linh hoạt nhằm đạt lợi ích hiệu năng thông qua song song hóa tác vụ
Truy vấn không gian có cảm giác xung đột với mục tiêu của ECS. Khi muốn tìm theo giá trị Position thay vì theo kiểu, tức là entity có Position hay không, sẽ phát sinh nhiều cache phụ cần đồng bộ với engine truy vấn
Khi thay đổi world bằng
commands, thay đổi sẽ bị trì hoãn để được xử lý theo lô vì hiệu năng; nhưng nếu có nhiều hành vi trì hoãn thì khó tạo các system chủ động thay đổi world. Vì vậy tôi thường phải gọiapply_deferred, và dùng lệnh tùy chỉnh để giải quyết race conditionWASM trên Android, đặc biệt tổ hợp Pixel 6 và Chrome, hiện không hoạt động, nhưng đây là vấn đề ở dependency bên dưới nên dự kiến sẽ được sửa trong Bevy 13
Ưu điểm là tổ hợp engine Rust và game Rust rất dễ làm việc, và Rust+WASM cũng hầu như không có cảm giác bị công nghệ cản trở. Khi đầu óc bắt đầu nghĩ theo kiểu ECS thì rất khó quay lại, và nó cực kỳ linh hoạt. Có lẽ thậm chí là quá linh hoạt
Cộng đồng sôi nổi nên dễ tìm người để trao đổi vấn đề; tài liệu không nhiều nhưng ví dụ thì nhiều. Mức độ lạc quan về tương lai cũng lớn, tốc độ phát triển nhanh và mỗi bản phát hành đều cải thiện đáng kể các mối lo chính
Ghi chú phát hành rất tuyệt
Với các nhà phát triển game/engine có kinh nghiệm, một số phần có thể quá nhập môn, nhưng với người không thường xuyên ở trong thế giới đó thì sự cân bằng giữa giải thích thay đổi và diễn giải chủ đề là rất tốt
Tôi từng thấy câu đùa rằng game viết bằng Rust thì có 5 cái, còn game engine thì có 50 cái
Thực sự có danh sách các game được viết bằng Bevy không?
Tiny Glade (https://pouncelight.games/tiny-glade) rất phổ biến và cũng xuất hiện nhiều trên mạng xã hội. Dùng Bevy ECS / Bevy App và renderer tùy chỉnh. https://store.steampowered.com/app/2198150/Tiny_Glade/
Cũng có tunnet (https://puzzled-squid.itch.io/tunnet), Noumenal (https://noumenal.app/), Foresight Mining (https://www.foresightmining.com/). Foresight Mining là phần mềm “CAD” khai thác mỏ và đang thuê nhiều lập trình viên Bevy
Axie Infinity: Homeland (https://app.axieinfinity.com/games/homeland-alpha/) dùng Bevy ECS và Unity. Cũng có Shifting Chamber (https://maciekglowka.itch.io/shifting-chamber), Hytopia (https://hytopia.com/)
Cũng có Titleless Comfy City Builder (https://twitter.com/i_am_feenster/status/1710714877231186323), Molecoole (https://store.steampowered.com/app/1792170/Molecoole/), Titleless industrial revolution builder (https://twitter.com/ElmoSampedro/status/1684920884811698176)
Jarl Game (https://twitter.com/jarl_game) là một game kiểu Dwarf Fortress với ánh sáng động rất đẹp
Có hàng trăm game trong tag “bevy” trên itch.io: https://itch.io/games/tag-bevy
Kênh #showcase trên Discord của Bevy cũng rất sôi nổi
Mọi framework ban đầu đều muốn triển khai một thứ gì đó truyền thống hơn theo cách đơn giản, gọn gàng và nhanh, nhưng lại thiếu các tính năng hào nhoáng.
Rồi khi bắt kịp về tính năng, chúng lại trở thành những con quái vật phức tạp y như vậy, và vòng lặp đó tiếp diễn.
Kết luận nghe như “mọi phần mềm dễ dùng mà thêm tính năng đều được định sẵn là sẽ hỏng”, hơi kịch tính.
Tôi tò mò liệu có suy nghĩ hay lo ngại cụ thể nào về kiến trúc của Bevy hoặc cách nó thêm tính năng không. Chúng tôi đang cố hết sức để tránh số phận đó.
Tiny Glade dùng bevy_ecs nhưng hoàn toàn không dùng crate render của Bevy. Cá nhân tôi cũng đang có vài PR về việc triển khai các đường render thay thế, chẳng hạn ray tracing hoặc render meshlet do GPU điều khiển + visibility buffer, mà nội bộ Bevy gần như không thay đổi.
Với người dùng thì cũng không khác mấy. Thêm FeatureFooPlugin vào app và dùng những thứ như FooComponent là chạy.
Từng crate hay plugin riêng lẻ có thể phình to, nhưng tổng thể Bevy sẽ ổn. Người dùng có thể bỏ qua các plugin đó và dùng thứ khác phù hợp với mình hơn.
Ngoài ra đây là một game engine. Theo định nghĩa, nó là một con quái vật phình to và phức tạp, và vì có thể hữu ích cho một số game nào đó nên nó sẽ hấp thụ đủ loại tính năng. Điều cốt lõi là việc phình tính năng ảnh hưởng thế nào đến khả năng sử dụng. Dù có 1000 tính năng, nếu bạn không cần tương tác với phần lớn trong số đó thì hoàn toàn không sao.
Đúng là các dự án mới không cần bận tâm đến tương thích ngược thì dễ hơn. Bevy mà tôi thấy có văn hóa mạnh về việc đòi hỏi trải nghiệm tốt cho người dùng và giảm bề mặt API. Có thể là nhờ hệ thống đóng gói của Rust, nhưng tôi đánh giá cao việc họ khá chủ động cắt đứt với quá khứ vì mục tiêu này.
Điểm hay của cargo là dù bạn quyết định phụ thuộc vào Bevy, ngay cả khi phiên bản tương lai gây breaking change, bạn cũng không cần phải chạy theo một mục tiêu luôn di động. Chỉ cần ở lại phiên bản của mình là được. Dù vậy họ cũng cung cấp hướng dẫn để giúp chuyển lên bản mới dễ hơn. Ít nhất đó là trải nghiệm của tôi sau khi dùng thử Bevy một chút.
Khi nâng từ 0.10 lên 0.11, app của tôi cần khá nhiều thay đổi, nhưng lần này thì compile ngay lập tức.
Bevy là một trong những game engine tôi thích, đặc biệt cho các dự án lớn. Tiền xử lý Asset V2 và các file
.metatrông rất hữu ích.Tôi cũng mong chờ hỗ trợ lightmap trong các bản phát hành sắp tới.
Khi xem các ví dụ web, tôi nhìn qua phần UI và có vẻ như tất cả đều được xử lý bên trong canvas.
Có thể thay vào đó tạo UI bằng DOM rồi nối với WASM không?
Ở phía Rust, tức WASM, có các cách như web_sys; còn ở phía JavaScript cũng có cách gọi các hàm WASM, nên có khá nhiều lựa chọn.