HN giới thiệu: Mã nguồn mở hóa engine game của tôi
(github.com/moddio)Engine game Moddio 2
- Moddio là một engine game ưu tiên chế độ nhiều người chơi.
- Tích hợp sẵn mã mạng có máy chủ toàn quyền, nội suy snapshot và tính năng hiệu chỉnh phía máy khách.
- Hỗ trợ hơn 50 người chơi đồng thời hoặc hơn 300 đối tượng chuyển động trên một VM 5 USD/tháng.
Bản demo
- Bao gồm sẵn: engine vật lý Box2D, mã mạng có máy chủ toàn quyền, hệ thống kho đồ và vật phẩm, thuộc tính tích hợp sẵn (HP, năng lượng, v.v.) và tốc độ hồi, hệ thống hội thoại, cửa hàng, điều khiển đơn vị, đạn và di chuyển đơn vị có dự đoán phía máy khách, AI đơn vị và tìm đường A*, điều khiển trên di động, v.v.
Cách chạy game
- Cần Node 18 trở lên.
- Sau khi thiết lập kho lưu trữ, chuyển đến thư mục
/src, đổi têngame-sample.jsonthànhgame.json, rồi quay lại thư mục gốc và chạy máy chủ. - Giờ bạn có thể chơi game tại http://localhost:80.
Cách tạo game mới từ đầu
- Game Moddio được tạo và chỉnh sửa bằng trình biên tập game Moddio do https://www.modd.io cung cấp.
- Sau khi tạo game, bạn có thể xuất
game.jsonđể dùng cho bản cài đặt cục bộ. - Đổi tên JSON game đã xuất thành
game.jsonvà chuyển nó vào thư mục./src.
Cách đóng góp
- Moddio hoàn toàn miễn phí và mã nguồn mở theo giấy phép MIT.
- Để tìm hiểu cách trở thành người đóng góp, hãy truy cập trang hướng dẫn đóng góp.
Ghi công
- Có sử dụng Isogenic game engine, Phaser, PlanckJS, uWebsocket, Box2D, tài nguyên Kenney, Hero Icons, v.v.
Ý kiến của GN⁺
- Engine game Moddio chuyên biệt cho phát triển game nhiều người chơi và cung cấp các tính năng mạnh mẽ để hỗ trợ số lượng lớn người chơi với chi phí thấp.
- Đây là mã nguồn mở và liên tục phát triển nhờ đóng góp của cộng đồng, nên cũng dễ tiếp cận với các kỹ sư phần mềm mới vào nghề.
- Tích hợp sẵn nhiều tính năng cần thiết cho phát triển game, giúp nhà phát triển có môi trường để nhanh chóng tạo nguyên mẫu và thử nghiệm.
1 bình luận
Ý kiến trên Hacker News
Trên màn hình đăng ký của ứng dụng Android, họ yêu cầu nhập tên người dùng và mật khẩu Google vào một chỗ trông như biểu mẫu web bên trong ứng dụng, nhưng người dùng không có cách nào biết ứng dụng có đang nhìn lén mật khẩu hay không
Thường thì có vẻ ứng dụng dùng luồng chuyển sang màn hình đăng nhập rồi quay lại, nên tôi tò mò không biết việc triển khai mẫu đó có khó không. Cũng tò mò liệu đây có phải vấn đề do hỗ trợ đa nền tảng không
Tuy nhiên cách nói ở trên thực sự không nên xảy ra, và tôi tưởng Google đã cấm rồi
Khiến người dùng chấp nhận một game engine chưa bao giờ là việc dễ, đặc biệt nếu đó là mã nguồn đóng thì càng khó hơn
Nhìn gallery game trên trang web thì có vẻ họ đã làm khá tốt cho đến nay; tôi tò mò không biết đó là do vài người bạn làm ra hay có một cộng đồng khá sôi động
Hãy nghĩ tới một cấu trúc mà chỉ cần bỏ vài ngày, hoặc thậm chí vài giờ một cách casual, cũng có thể tạo ra kết quả có ý nghĩa. Cứ nhớ lại Flash là được
Việc rào cản gia nhập thấp cho cả nhà phát triển game lẫn người chơi chắc chắn có ích. Không cần tải xuống hay đăng ký
Chỉ nhìn tiêu đề thì tôi không nghĩ đây là modd.io. Đây là một framework/nền tảng phổ biến dùng để tạo game IO
Tôi đã vào thử một server Brains và tò mò trải nghiệm với khoảng 50 người chơi ra sao. Chuyển động hơi giật cục như có thể dự đoán với WebSocket, và vì tôi cũng đang làm thứ tương tự nên cũng tò mò về nén mạng
Tôi không chắc chỉ nén LZ-string có đủ không. Với 50 người chơi, nó dùng khoảng 20KB mỗi giây, trong khi Warzone với 150 người chỉ dùng khoảng 48KB mỗi giây. Nếu không phải dữ liệu không giới hạn, chi phí băng thông cloud có thể khá đáng kể
Việc buffer byte đã nén trông như
埒愑䣔橤㤰゙㟍稦獦ঙ惝䓇強栛䳌۬䌃̩佼cũng thú vị. Tôi không biết kết quả nén LZ-string vốn có trông như vậy không, nhưng nhìn khá lạDù sao thì để giảm chi phí tiềm ẩn, phần networking còn nhiều chỗ có thể cải thiện. Toàn bộ dự án rất ấn tượng và được làm rất tốt
Điểm cốt lõi là dự đoán phía client và thuật toán networking rollback. Trạng thái game của chúng tôi ở 30Hz khoảng 1KB nên thường nằm gọn trong một packet đơn, vì vậy WebSocket cũng không quá tệ. Tất nhiên một giao thức không bảo đảm tin cậy vẫn tốt hơn
Vài tháng trước tôi có thử nghiệm WebSockets một chút, và theo tôi hiểu thì việc dùng TCP cho giao tiếp nhạy cảm với độ trễ như game có khá nhiều nhược điểm. Header TCP lớn hơn UDP hơn 2 lần, có các packet điều khiển bổ sung, và việc gửi dữ liệu mới bị trì hoãn trong khi dữ liệu cũ được truyền lại. WebSockets cũng hoạt động trên TCP nên có cùng nhược điểm
Dù vậy người ta vẫn nói TCP bảo đảm việc gửi thông điệp WebSocket, nhưng tôi đã có thể tái hiện mất packet. Cuối cùng thì nhược điểm vẫn còn, và nếu thực sự cần bảo đảm gửi đến thì bạn phải tự xây thêm gì đó bên trên; mà nếu vậy thì có lẽ ngay từ đầu cũng có thể chỉ xây những thông điệp cần thiết như thế trên UDP
Ngoài việc từng vọc qua networking một chút, tôi gần như không có kiến thức và kinh nghiệm, nên hãy đọc với lưu ý đó
U+3400~U+4DBF,U+4E00~U+9FFFChuỗi đó được giải mã thành
\u57d2\u6111\u48d4\u6a64\u3930\u3099\u37cd\u7a26\u7366\u0999\u60dd\u44c7\u5f37\u681b\u4ccc\u06ec\u4303\u0329\u4f7c[1] https://en.wikipedia.org/wiki/CJK_Unified_Ideographs
Cách chắc chắn để không bao giờ hoàn thành game là bắt đầu bằng việc viết engine
Tự làm công nghệ của riêng mình là hoàn toàn có thể, nhưng ở mỗi bước, công nghệ đó nên được điều chỉnh cho dự án của bạn chứ không phải thành một nền tảng game đa dụng
Ở đây “bắt đầu viết blog” nghĩa là tạo một blog engine mới hoàn toàn từ đầu
Tôi từng thấy các backend multiplayer dựa trên Node.js cuối cùng chậm như bò khi số lượng kết nối tăng lên. Tò mò là các bạn đã giải quyết vấn đề này như thế nào
Trong trường hợp như vậy, liệu một lựa chọn thay thế như Go có tốt hơn không?
Backend cũng không có vẻ sẽ phải làm các tác vụ tính toán vật lý nặng thay cho frontend
Trong các thử nghiệm đơn giản, hiệu năng của nó tốt hơn nhiều so với các thư viện WebSocket phổ biến khác vốn nhanh chóng chậm lại
Vì vậy Node có vẻ là một lựa chọn tốt
Mỗi game bị giới hạn tối đa 64 người, nhưng khi thử nghiệm tới hơn 100 kết nối, chúng tôi không thấy vấn đề hiệu năng nào. Mỗi game chạy trong một container tách biệt
Tôi tò mò về động lực tạo ra engine mới
Nhìn README thì thấy có sẵn những thứ khá cụ thể như hệ thống vũ khí (cận chiến/đạn bay), cửa hàng, projectile dự đoán phía client và di chuyển unit
Tôi thắc mắc vì sao lại nhúng những thứ này vào engine, thay vì làm thành plugin có thể sao chép. Tất nhiên nhiều game không cần các tính năng như vậy; vậy đây là game engine? Hay là engine cho FPS/RPG/thể loại cụ thể nào đó?
Tôi không ghét công nghệ này, nhưng vẫn còn câu hỏi “tại sao?”. Nó dùng để làm gì? Vì sao nên dùng cái này thay vì Three.js và server tự viết?
Ví dụ, chúng tôi đã làm một MMORPG đơn giản trong 2 giờ: https://www.youtube.com/watch?v=GZVsxkALR5U
Tôi cho rằng có sự đánh đổi giữa mức độ dễ dùng và khả năng tùy biến. Chúng tôi chọn vế trước để thu hẹp khoảng cách giữa game multiplayer, vốn nổi tiếng là khó làm, và các nhà phát triển game casual
Có vẻ không dành cho bạn, mà dành cho những người muốn làm những game cụ thể kiểu đó. Không phải engine nào cũng cần phải đa dụng
Tôi có vài dự án sở thích có vẻ rất hợp với cái này. Tôi biết code, nhưng khi làm dự án hobby có những lúc tôi không muốn tập trung đến mức đó, nên low-code và trình chỉnh sửa tương tác có vẻ rất tốt cho developer làm vì sở thích
Cá nhân tôi mong chờ nhất phần bản đồ và tạo thế giới. Có vẻ cách tốt nhất là export game ra JSON, chỉnh sửa bằng chương trình rồi import lại; không biết có đúng không
Tuy nhiên cũng hơi ngợp. World tutorial chưa chỉnh sửa đã là JSON 3.500 dòng, nên có nhiều thứ phải hiểu
Cách đầu tiên tôi nghĩ tới là cố tình chỉnh sửa trong editor rồi xem JSON thay đổi ra sao. Tôi cũng cần tìm một JSON diff viewer tốt. Làm vậy có lẽ sẽ giúp tìm được phần mình muốn đụng tới. Asset và tile bản đồ chắc tôi sẽ gom bằng trình chỉnh sửa tương tác
Tôi tò mò liệu cách tiếp cận này có hợp lý không, và có công cụ nào hữu ích không
Một creator trong cộng đồng của chúng tôi đang dùng ChatGPT để tạo bản đồ động. Anh ấy đang làm game trốn tìm, gửi prompt yêu cầu tạo JSON bản đồ 2D và tải bản đồ đó mỗi khi bắt đầu vòng mới. Game chưa công khai nên khó chia sẻ
Ngoài ra, một thành viên cộng đồng khác đang làm interpreter cho JSON game của chúng tôi. Ví dụ: https://pypi.org/project/pymodd/
Thật vui khi thấy có thêm những dự án open-source như thế này. Ngạc nhiên là nó còn chưa tới 100 sao GitHub