1 điểm bởi GN⁺ 2023-12-10 | 1 bình luận | Chia sẻ qua WhatsApp
  • Murder Engineengine 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 gamegame.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.exe riê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ừ .csproj qua 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 Engineengine 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
  • Để 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.editor
    • game bao gồm bin, packed, resources cho game hoàn chỉnh
    • game.editor bao gồm binresources cho editor của game
  • Không có editor.exe bê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

 
GN⁺ 2023-12-10
Ý 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ới xem lần đầu, nhưng chỉ cần lướt qua một chút thôi cũng đủ khiến tôi tin rằng đây là blog hay nhất trên toàn Internet
    • Tôi không biết là cùng một người. Trước đây tôi đã xem loạt hướng dẫn này, và cách trình bày từng phần nội dung rất xuất sắc
    • Có vẻ saint11 là người làm phần art cho game Celeste
    • Anh ấy đã tham gia Celeste và Towerfall, mà cả hai đều có pixel art rất xuất sắc. Trông thật sự rất tài năng
  • 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ư CarComponent và 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ạy
    Hơ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, SetVelocity dường như được sinh ra dựa trên sự tồn tại của component Velocity, Friction, dù tôi không chắc, có thể là vì cơ chế cache ID component
    Nó 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ăng
    Cá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

    • Tôi cũng tò mò về thứ tự thực thi của system. Việc phải tự thêm system mới vào một danh sách cố định có thể khá bực, nhưng đồng thời các system thường có phụ thuộc ngầm với nhau, nên việc cố định thứ tự chạy ngay từ lúc biên dịch cũng rất quan trọ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

    • Tôi đã có kết quả khá tốt bằng cách quản lý đối tượng đơn giản và chủ động gọi GC.Collect() theo các khoảng bội số nhỏ của độ trễ mô phỏng. Điểm tối ưu có vẻ thay đổi theo nội dung scene và kiểu gameplay, tức là scene thay đổi đối tượng như thế nào
      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ệ
    • Có. Có một bài thuyết trình rất hay nói về lịch sử Miguel de Icaza thêm C# vào game engine, và vì sao ông kỳ vọng dùng Swift trong Godot do cho rằng cơ chế đếm tham chiếu của Swift tránh được vấn đề pause do GC
      https://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez
    • Tôi nghĩ vấn đề GC gần như chỉ có ở phía Unity. Các game engine khác dùng .NET thông thường, như Stride, vẫn chạy ổn không vấn đề gì
    • Có. Không chỉ Unity mà Unreal cũng có GC, nên bạn phải cấp phát từ đầu và dùng object pooling
    • Giống như phần lớn ngôn ngữ khác, C# cũng có thể được viết theo cách tránh cấp phát
  • 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

    • Bạn có thể giải thích kỹ hơn về sự khác biệt không?
  • 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

    • Hơi gượng ép, nhưng cũng từng có người hiểu bài báo của The Onion theo nghĩa đen
      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
    • Kiểu suy nghĩ này, chỉ là theo hướng ngược lại, chính là cách duy nhất để tiêu thụ tin tức truyền thông đại chúng. Giờ mọi thứ đều thiên lệch và lố bịch đến mức khó mà tin nổi
  • ECS là gì?

    • Chắc là Entity Component System. Đây là kiến trúc phổ biến trong game engine
    • Đây là kiến trúc hiệu năng cao đang thịnh hành hiện nay. Unity gần đây cũng đang cố phổ biến nó rộng rãi hơn nhiều