2 điểm bởi GN⁺ 2023-06-26 | 1 bình luận | Chia sẻ qua WhatsApp
  • Hypersomnia là một game bắn súng nhiều người chơi dựa trên cộng đồng, hỗ trợ đấu tay đôi với bạn bè hoặc chiến đấu giữa hai clan, và là trò chơi có thể chơi online từ năm 2017
  • Được viết bằng Modern C++ và triển khai không dùng game engine, đồng thời được cung cấp như một game mã nguồn mở miễn phí
  • Cấu trúc trò chơi kết hợp chiến thuật của Counter-Strike, sự năng động của Hotline Miami và nét hoài niệm pixel art của các RPG old-school; hiện cung cấp 24 loại súng độc nhất, 10 bản đồ cộng đồng và hai chế độ Bomb defusal cùng Gun game
  • Các kênh phân phối gồm chơi trên trình duyệt, Steam, Windows, Linux AppImage và macOS dmg; khi khởi động game sẽ chạy interactive Tutorial
  • Có thể chạy server bằng Server Docker hoặc Headless AppImage, và mọi archive đều được ký số, kèm đường dẫn xác minh chữ ký
  • Trình chỉnh sửa bản đồ tích hợp sử dụng cách làm việc 100% WYSIWYG trực tiếp trong thế giới game, được tạo bằng ImGui và dùng định dạng bản đồ JSON
    • Chỉ cần dán các thư mục PNG, WAV, OGG vào thư mục bản đồ là game sẽ tự động nhận diện
    • Kéo thả GIF vào cảnh là nó sẽ hoạt động ngay như animation trong game
    • Bản đồ đang làm có thể được playtest chỉ với một cú nhấp, còn các client kết nối sẽ tự động tải xuống phiên bản bản đồ hiện tại và tài nguyên tùy chỉnh
    • Server, game và editor đều nằm trong cùng một file thực thi trên mọi OS, nên có thể bắt đầu một phiên làm việc từ editor, dừng bằng ESC rồi quay lại đúng trạng thái ban đầu
  • Mạng được xây dựng dựa trên tính quyết định của mô phỏng đa nền tảng, hoạt động 100% quyết định giữa client trình duyệt, client native trên Windows, Linux, macOS và cả bản dựng native ARM
    • Thay vì liên tục gửi toàn bộ trạng thái đối tượng qua mạng, hệ thống chỉ truyền input của người chơi, phần còn lại được mỗi client mô phỏng cục bộ
    • Để đảm bảo tính quyết định của phép tính dấu chấm động, dự án dùng clang trên mọi OS, áp dụng /fp:strict cho bản dựng Windows, -ffp-model=strict cho bản dựng ARM, và thay các hàm toán học như std::sin, std::sqrt bằng các triển khai thuộc họ STREFLOP
    • Trong ví dụ có hai nhân vật do người chơi điều khiển, với tickrate 60Hz thì lưu lượng vào khoảng 40 kbit/s (= 5 KB/s), và chỉ các nhân vật do người chơi điều khiển mới đóng góp vào lưu lượng mạng
  • Client trình duyệt và client native có thể chơi cùng trên một server nhờ libdatachanneldatachannel-wasm
    • Có thể host server ngay trong trình duyệt rồi kết nối bằng client native, hoặc mở server từ client native rồi gửi liên kết truy cập cho trình duyệt
    • Bản trình duyệt hỗ trợ đăng nhập Discord, rank match và global Leaderboards; nếu liên kết tài khoản Discord với tài khoản Steam thì bản Steam và bản web sẽ dùng chung rating
  • rectpack2D được viết cho việc đóng gói texture hiện đang được dùng trong Assassin's Creed: Valhalla, bởi một công ty sản xuất drone và trong 2 bài báo khoa học
  • Phần triển khai memory pool cung cấp vùng lưu trữ liên tục, cấp phát O(1), giải phóng O(1), dereference O(1), tự động mở rộng và hành vi quyết định; khi truyền trạng thái thế giới ban đầu, nó còn bao gồm cả trạng thái nội bộ của pool đối tượng game để client có thể mô phỏng một cách quyết định với cùng định danh đối tượng và thứ tự bộ nhớ
  • self-updater tích hợp sẽ tự động tải xuống và áp dụng bản cập nhật, xác minh đó có phải là bản cập nhật đến từ khóa công khai của nhà phát triển được hardcode thông qua lời gọi ssh-keygen hay không; nếu nơi lưu trữ bản dựng bị tấn công và có bản độc hại bị đưa lên, các client hiện có sẽ từ chối áp dụng bản cập nhật đó

1 bình luận

 
GN⁺ 2023-06-26
Ý kiến trên Hacker News
  • Tôi không biết rằng để có được hành vi mang tính quyết định 100% với số thực dấu phẩy động thì ngay cả khi dùng cùng một hàm toán học cũng cần cùng một trình biên dịch
    Tôi từng tự hỏi liệu phép toán dấu phẩy động có được đặc tả hoàn toàn hay không, đáng lẽ nên tìm kiếm trước: https://stackoverflow.com/questions/49471943/floating-point-...
    • Theo cách tôi hiểu thì tiêu chuẩn gần như không đặc tả cả các hàm toán học
      Nó không chỉ kết thúc bằng một lệnh sqrt, mà thường bắt đầu từ xấp xỉ Taylor rồi chạy phương pháp Newton vài lần để tinh chỉnh kết quả, nên sẽ có nhiều lựa chọn như bậc của chuỗi Taylor, điểm tâm và số lần lặp
      IEEE 754 có thể quy định phép nhân, nhưng với sqrt, sin, cos, tan thì phải quyết định cách tính, và thông thường phần cài đặt đó nằm trong thư viện chuẩn do trình biên dịch cung cấp
      Ngoài ra, số dấu phẩy động không thỏa tính kết hợp, nên (a+b)+c != a+(b+c), vì vậy chỉ cần đổi thứ tự phép toán cơ bản là kết quả cũng có thể khác nhau
    • Tôi cũng không chắc tính quyết định có được đảm bảo khi khác kiến trúc hay không
      Cách làm tròn có thể khác nhau giữa các kiến trúc, và nếu trộn arm/amd/intel thì có khả năng xuất hiện hành vi không quyết định: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
      Có vẻ trò chơi này dùng cài đặt dấu phẩy động bằng phần mềm để tránh vấn đề đó, và nếu cộng thêm một trình biên dịch thống nhất thì có lẽ sẽ tránh được phần lớn rắc rối
    • Có một bài viết khá dài từ thời Sun, giờ thuộc Oracle, nên có lẽ đọc phần kết luận trước rồi xem ngược lại sẽ dễ hơn
      https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
    • Tính quyết định của dấu phẩy động về lý thuyết có vẻ như phải hoạt động một cách quyết định, nhưng trên thực tế gần như là miền vô luật lệ
      Trong C và nhiều ngôn ngữ khác, các toán tử phổ biến không được ánh xạ tường minh tới các phép toán dấu phẩy động cụ thể, nên trình biên dịch có rất nhiều quyền tùy nghi
      Ngoài ra còn có trạng thái toàn cục vô hình như chế độ làm tròn cũng được dùng ở một mức độ nào đó; nếu nhớ không nhầm thì DirectX từng đổi cờ ở hậu trường
    • Ngay cả khi dùng cùng một trình biên dịch, nếu -march khác nhau thì kết quả cũng có thể lệch đi khá nhiều
  • Phần nói rằng “networking dựa trên tính quyết định của mô phỏng đa nền tảng” là điều Springrts[0] đã làm từ cuối những năm 2000 vì lý do tương tự, và có lẽ rất nhiều game RTS cũng vậy
    Chỉ là chúng không phải mã nguồn mở, và điều đó không có nghĩa đây không phải thành tựu. Thực sự đây là việc rất khó
    [0] https://springrts.com/
    • Phần đó có xuất hiện trong nội dung chi tiết dưới tiêu đề được trích dẫn
      Điểm khác ở đây là các game RTS không dùng vật lý dấu phẩy động mang tính quyết định, nên Hypersomnia cần một lời giải mới
    • Tôi đã chơi Spring với Balanced Annihilation trong một thời gian rất dài
      Nó lấp vào khoảng trống mà TA và SupCom để lại, còn SupCom 2 tự nó là một game RTS nhỏ hơn, casual hơn và khá ổn, nhưng vẫn không tới mức đó
      Và tốt hơn là đừng nhắc đến PA
      BAR cũng có vẻ rất hứa hẹn: https://www.beyondallreason.info
  • Trông khá thú vị, nhưng tiêu đề thì thực sự khó đọc
    • Tôi cũng thấy vậy, và đến giờ vẫn nghĩ nó hơi dễ gây hiểu nhầm
      Không phải bản thân trò chơi đã được đưa vào AC:Valhalla, mà là thư viện đóng gói texture được tạo ra trong quá trình phát triển đã được dùng trong đó[1]. Tất nhiên tôi không có ý hạ thấp thành tựu này, vì riêng việc đó cũng đủ để thành một bài viết
      Ngoài ra, việc nói nó là nguồn gốc của hệ thống ECS được dùng trong Unity cũng có vẻ hơi cường điệu. Trước năm 2010 tôi đã từng dùng các game engine sử dụng ECS, và trong giới game engine thì nó có vẻ bắt nguồn từ Operation Flashpoint[2]
      [1] https://github.com/TeamHypersomnia/rectpack2D
      [2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
  • Tôi rất thích những bài viết và dự án như thế này, và biết ơn vì nó được cung cấp dưới dạng mã nguồn mở
    Một ngày nào đó khi có thời gian, có lẽ là sau khi nghỉ hưu, tôi muốn thử làm việc như thế này, và những dự án như vậy rất có thể sẽ trở thành tài liệu học tập để tìm hiểu thế giới đó
  • Trông rất ngầu
    Nó làm tôi nhớ đến ARC cuối những năm 90, tức Attack Retrieve Capture, giờ chỉ còn được duy trì cầm chừng dưới cái tên Armor Critical
    https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
    http://armorcritical.com
  • Một thành tựu đáng kinh ngạc và trò chơi cũng có vẻ rất tuyệt
    Tôi tò mò không biết ngoài ra họ đã làm gì về mặt thương mại để duy trì dự án, có kế hoạch phát hành trên Steam hay không, và thế giới liên tục ảnh hưởng tới gameplay như thế nào
    Tôi cũng muốn biết kỹ thuật thông minh dùng để tái dựng trạng thái vật lý khi người chơi mới tham gia sẽ trông như thế nào từ phía những người chơi đang có mặt, ví dụ như vị trí viên đạn có bị xê dịch hay không
    • Gần đây tôi đã làm lập trình gameplay cho mini game này của PUBG: https://www.youtube.com/watch?v=tSP5P0QGWa4
      Tôi cũng đầu tư khoản tiết kiệm khá tốt nên có thể toàn tâm tập trung vào Hypersomnia
      Tôi muốn phát hành trên Steam trước cuối năm 2024

Hiện tại hoàn toàn chưa có thế giới duy trì liên tục; đó chỉ là nhắc sơ như một teaser về hướng có thể đi tới trong tương lai nếu trò chơi thành công
Việc dựng lại vật lý không được làm thay đổi vị trí chút nào. Thứ được dựng lại chỉ là các “trạng thái nóng” như va chạm hoặc cây cối, và thời điểm trạng thái này có ý nghĩa chỉ là khi chạy mô phỏng từ trạng thái này sang trạng thái tiếp theo, nên sau đó nó không ảnh hưởng tới việc render
Ảnh hưởng duy nhất có thể xảy ra với người chơi hiện tại là tụt khung hình một lần nếu thế giới vật lý cần dựng lại quá lớn, nhưng trên thực tế mọi bản đồ hiện vẫn còn nhỏ và phù hợp nhất với các trận 3v3

  • Việc dựng lại trạng thái vật lý khi client kết nối là một cách giải quyết rất hay cho vấn đề đồng bộ
  • Trước hết, trông nó thật sự ngầu một cách khó tin, và cứ nhìn những thứ như thế này lại khiến tôi nhận ra mình biết ít đến mức nào về khoa học máy tính
    Thứ hai, tôi đã tìm thấy một lỗi lớn trên MacOS. Ở màn hình tạm dừng/cài đặt, thao tác chuột bị lệch rất nhiều nên tôi thậm chí không thể bấm được các tùy chọn ở menu chính
    Tôi đã gom ảnh chụp màn hình, log và báo cáo hệ thống ở đây: https://youtu.be/O4OoMdeFAt0
    • Xin lỗi về vấn đề trên MacOS
      Tôi hầu như luôn chơi trên Windows và Linux nên đã lâu rồi chưa chạy thử trên MacOS, tôi sẽ xem có thể sửa được không
  • Trời, giờ tôi mới nhận ra là suốt mấy năm qua mình đã vô tình theo dõi đọc vài bài viết của bạn
    Đặc biệt là các bài về ECS và mạng
    Thật vui khi thấy nó đã tiến xa đến vậy
    • Tôi từng viết một bài về ECS trên Stack Exchange vào năm 2013, nhưng tôi nghĩ đây là lần đầu tiên tôi xuất bản một bài đúng nghĩa về mạng
      Tôi có đặt liên kết tới các bài blog quan trọng của Glenn Fiedler khi giải thích kiến trúc tất định trong README, nhưng tôi không phải người đó, nên nếu điều đó gây hiểu lầm thì đó không phải chủ ý của tôi
  • Lối chơi làm tôi nhớ đến Infantry Online, một game bắn súng multiplayer góc nhìn từ trên xuống cũ từ đầu những năm 2000
    https://www.freeinfantry.com/
    https://en.m.wikipedia.org/wiki/Infantry_(video_game)