Engine game ECS pixel art viết bằng C# 'Murder'
(github.com/isadorasophia)- Murder Engine là engine game ECS cho pixel art được xây dựng trên FNA; hiện vẫn đang trong quá trình phát triển nên sẽ có nhiều thay đổi và dự kiến có breaking change
- Các ví dụ khởi đầu được đề xuất gồm dự án game jam neocityexpress và hellomurder, cho thấy luồng tạo world, entity và component
- Cấu trúc dự án tách
gamevàgame.editor, đồng thời chọn cách điều khiển trực tiếp editor ngay trong dự án của người dùng thay vì cóeditor.exeriêng - Môi trường phát triển hỗ trợ Linux, MacOS, Windows, Steam Deck; yêu cầu là .NET 8 SDK, còn nền tảng đích của game hỗ trợ Linux, MacOS, Windows
- Hiện chưa có gói NuGet, nên khuyến nghị tham chiếu từ
.csprojqua git submodule; hiện cũng chưa có kế hoạch hỗ trợ chính thức cho web hoặc di động
Tính chất và trạng thái của Murder Engine
- Murder Engine là engine game ECS cho pixel art dựa trên FNA
- Đây là engine hiện vẫn đang được phát triển; nhánh phát hành được cố gắng giữ ổn định nhưng cần dự liệu sẽ có nhiều thay đổi và nhiều phần vẫn chưa hoàn thiện
- README cảnh báo “Proceed at your own risk” và nêu rõ khả năng xuất hiện breaking change
Ví dụ bắt đầu và lộ trình học ECS
- Với những người muốn xem ví dụ nhanh để nắm bắt, luồng khởi đầu được khuyến nghị là bắt đầu từ các dự án sau
- game jam project: dự án game jam để xem kiến trúc của Murder
- Hello World project: ví dụ cho thấy cách tạo world, entity và component
- Để hiểu ECS được áp dụng như thế nào trong Murder, tài liệu hướng dẫn khuyên tham khảo tài liệu của Bang
- Bang là framework ECS mà Murder sử dụng
Cấu trúc dự án và cách tổ chức editor
- Cấu trúc dự án Murder được chia thành
resources,src/game,src/game.editorgamebao gồmbin,packed,resourcescho game hoàn chỉnhgame.editorbao gồmbinvàresourcescho editor của game
- Không có
editor.exebên ngoài, chỉ tồn tại chính dự án của người dùng - Cách tổ chức này được chọn để có thể trực tiếp kiểm soát toàn bộ dự án, tương tự cách phát triển dự án MonoGame hoặc FNA
- Lý do đặt editor thành dự án riêng là để mã editor không chạm vào mã game, đồng thời phía editor có thể tự do thực hiện các tác vụ mong muốn
Cách build và quản lý phụ thuộc
- Hiện chưa có gói NuGet cho Murder
- Cách được khuyến nghị là thêm Murder dưới dạng git submodule rồi tham chiếu từ
.csproj - Có thể xem ví dụ tham chiếu tại HelloMurder.csproj
Yêu cầu và nền tảng được hỗ trợ
- Môi trường phát triển để chạy editor hỗ trợ Linux, MacOS, Windows, Steam Deck
- Yêu cầu cần có là cài đặt .NET 8 SDK
- Nền tảng đích cho game hỗ trợ Linux, MacOS, Windows
- Linux bao gồm Steam Deck
- Hỗ trợ console hiện đang được triển khai
- Web và di động iOS·Android hiện chưa có kế hoạch hỗ trợ chính thức
Đóng góp và phản hồi
- Dự án hiện vẫn đang ở giai đoạn rất sớm
- Có thể liên hệ tác giả để gửi đề xuất hoặc phản hồi; dự án cho biết họ quan tâm đến việc được sử dụng thực tế và nhận phản hồi
1 bình luận
Ý kiến trên Hacker News
Nhìn thấy cái tên saint11 là đã tin chắc sẽ hay rồi. Loạt hướng dẫn pixel art của anh ấy được hệ thống hóa rất tốt: http://saint11.org/blog/pixel-art-tutorials/
Mấy game engine mới và framework ECS luôn rất thú vị để ngắm. Nhìn vào phần ECS là Bang thì có các ví dụ về component như
CarComponentvà system nhưCarMoverSystem, và có vẻ system là class, còn interface mà nó triển khai sẽ quyết định thời điểm chạyHơi giống DOTS một chút, nhưng tôi vẫn chưa tìm ra system được thêm vào game ở đâu, hay các system cùng loại được sắp xếp như thế nào. Tôi cũng tò mò system xử lý nhiều truy vấn khác nhau, như xe và chướng ngại vật, sẽ trông ra sao
Có vẻ Bang dùng trình sinh mã nguồn. Không giống
GetComponent, các hàm nhưTryGetVelocity,RemoveFriction,SetVelocitydường như được sinh ra dựa trên sự tồn tại của componentVelocity,Friction, dù tôi không chắc, có thể là vì cơ chế cache ID componentNó không dựa trên archetype; thay vào đó mỗi entity lưu một dictionary
component id => component, còn mỗi system sẽ theo dõi entity nào khớp với bộ lọc của mình. Tôi không rõ hiệu năng sẽ tốt đến đâu, nhưng với nhiều game thì sự tiện lợi khi phát triển có thể quan trọng hơn hiệu năngCác thay đổi cũng có vẻ được áp dụng ngay lập tức. Vậy thì tôi thắc mắc khi system thêm/xóa component trên entity làm thay đổi việc khớp bộ lọc, liệu nó có được xử lý trong cùng tick hay không sẽ phụ thuộc vào ID của entity chăng
Lướt tài liệu thì tôi chưa thấy cách nào để biểu thị rõ ràng các phụ thuộc hay thứ tự này, nên tôi tò mò engine này xử lý chuyện đó như thế nào
Trang Itch và bản tải xuống của game jam làm bằng framework này: https://saint11.itch.io/neo-city-express
Rất ấn tượng đối với một game jam 72 giờ. Phần art và phần chữ đều hay, và cơ chế chơi cũng thú vị theo cách không ngờ tới
Rất đẹp. Tôi thích editor này, trông cực kỳ có phong cách. Tôi luôn thích MonoGame vì hiệu năng tốt và đa nền tảng, nhưng chưa từng làm game lớn với nó, chỉ thỉnh thoảng làm vài bản demo
Trông ổn đấy. Tôi tò mò liệu phát triển game bằng C# có gặp vấn đề pause do GC không
Với scene và gameplay kiểu Q3A thì rất vững. Hầu như không có yếu tố scene nào thay đổi theo từng tick, nên pause do GC phần lớn có thể bỏ qua
Trên .NET 6+, trong engine tự làm, khi lặp nhanh một cách có chủ đích thì pause do GC đo được vào khoảng 1~5ms. Tắt concurrent/server/background GC trong cấu hình dự án và dùng foreground + workstation GC cho độ jitter thấp nhất
Có vẻ lựa chọn chỉ là hoặc tự quản lý 100% bộ nhớ, hoặc dọn rác thường xuyên nhất có thể. Trên .NET hiện đại, gần như không thể tắt hẳn GC nếu không dùng kiểu phù phép cấp DLL thấp. Nếu có thể khởi động lại tiến trình giữa các sự kiện nghiệp vụ hay giữa các round game thì
Process.Exit()trong một số trường hợp cũng là một kỹ thuật GC hợp lệhttps://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez
Chỉ đọc mỗi link thì tôi chưa rõ lắm, nhưng tôi tò mò không biết làm một game F# bằng Murder game engine sẽ khó đến mức nào
Tôi đã dùng ECS một chút trong Unity, và ECS của Murder dễ hơn nhiều. Các dev làm rất tốt
Tôi đã làm một dự án game arcade nhỏ bằng Murder, có thể chơi ở đây: https://nopetrides.itch.io/bombs-away
Trên trang giới thiệu của saint11 có viết thế này: “Murder Engine: 2D Pixel art C# ECS Game Engine made by Isa! I usually help on the render and physics side of it.”
Isa: https://isadorasophia.com/projects/
Không liên quan đến game engine, nhưng buồn cười ở chỗ một kẻ ác ý có thể nói rằng “những người trên trang web hacker đó đang bàn về murder”
Dạo này tôi nghĩ khá nhiều về việc những kẻ thù địch dai dẳng có thể lợi dụng các tư liệu hoàn toàn vô hại kiểu này như thế nào
Dù vậy, trong trường hợp dễ bác bỏ như thế này thì tôi cũng không chắc có khác biệt lớn nào giữa câu “mọi người đang bàn về murder” và một lời nói dối trắng trợn
ECS là gì?