1 điểm bởi GN⁺ 2024-06-14 | 1 bình luận | Chia sẻ qua WhatsApp

Phân tích mã nguồn Serious Engine 1

Tổng quan

  • Serious Sam được thiết kế như một trò chơi nhiều người chơi.
  • Chiến dịch chơi đơn cũng hoạt động như chế độ nhiều người chơi.
  • Serious Engine hỗ trợ chơi đơn, nhiều người chơi, ghi demo và phát lại.

Tính quyết định của số dấu phẩy động

  • Để đồng bộ hóa trò chơi, việc các phép toán dấu phẩy động hoạt động một cách quyết định là rất quan trọng.
  • Vì chỉ phát hành trên Windows, nên có thể tránh được các vấn đề đồng bộ do khác biệt trình biên dịch.
  • Để giải quyết các vấn đề do khác biệt độ chính xác của FPU, họ sử dụng precision guard.

Tick vs frame

  • Tick rate của logic game được tách biệt khỏi frame rate kết xuất.
  • Logic game được cố định ở 20 tick mỗi giây.
  • Sử dụng interpolation để có chuyển động và hoạt ảnh mượt mà.

Nhiều người chơi qua mạng

  • Mô hình mạng của Serious Engine là client-server.
  • Server nhận và xử lý các thông điệp từ client, rồi truyền thông tin liên quan đến tất cả client.
  • Sử dụng giao thức UDP để truyền packet.

Lớp packet

  • Packet UDP có thể đến sai thứ tự hoặc không đến nơi.
  • Serious Engine triển khai giao thức riêng trên UDP để bảo đảm độ tin cậy và thứ tự packet.
  • Các packet đáng tin cậy được xác nhận thông qua packet ACK.

Vòng đời kết nối

  • Sử dụng packet broadcast để thiết lập kết nối ảo giữa client và server.
  • Server gán một định danh duy nhất cho client và định tuyến packet dựa trên đó.

Chơi ngoại tuyến

  • Chơi đơn và phát lại demo là những trường hợp đặc biệt của nhiều người chơi.
  • Server và client giao tiếp trong cùng một tiến trình.

Lớp thông điệp

  • CNetworkMessage là một lớp trừu tượng thông điệp có thể đọc và ghi như stream.
  • Thông điệp có thể được nén, mặc định dùng nén LZRW1.
  • Sử dụng delta encoding để giảm thiểu lượng dữ liệu truyền đi.

Bảo mật thông điệp

  • Thông điệp không được mã hóa.
  • Tin nhắn chat được truyền dưới dạng văn bản thuần.

Ý kiến của GN⁺

  • Hữu ích cho nhà phát triển game: Cấu trúc mạng và cơ chế đồng bộ của Serious Engine có thể là tài liệu tham khảo hữu ích cho phát triển game nhiều người chơi.
  • Tầm quan trọng của hành vi quyết định: Cách bảo đảm tính quyết định của phép toán dấu phẩy động là yếu tố quan trọng để giải quyết các vấn đề đồng bộ trong game.
  • Thiết kế giao thức mạng: Việc triển khai một giao thức riêng trên UDP để bảo đảm độ tin cậy và thứ tự là một ví dụ tốt về lập trình mạng.
  • Cân nhắc về bảo mật: Việc không có mã hóa thông điệp là một điểm cần cân nhắc về mặt bảo mật trong phát triển game hiện đại.
  • Thách thức kỹ thuật: Bài viết giúp hiểu rõ hơn những thách thức kỹ thuật khi triển khai game nhiều người chơi tốc độ cao trong môi trường mạng đầu những năm 2000.

1 bình luận

 
GN⁺ 2024-06-14
Ý kiến trên Hacker News
  • Tôi là nhà phát triển đã triển khai mã mạng của Serious Sam. Tôi đã viết một MVP đơn giản lấy cảm hứng từ hệ thống dự đoán của QuakeWorld.
  • Serious Sam lúc nào cũng hoạt động tốt ở các buổi LAN party. Ngay cả khi những game khác gặp trục trặc, nó vẫn chạy ổn định.
  • Tôi đã triển khai chế độ nhiều người chơi của Vigilante 8 trên cổng GB Color bằng gameplay quyết định luận. Dùng cáp liên kết GBC để truyền dữ liệu từng 1 byte một.
  • Croteam là một đội ngũ phát triển game rất tài năng. Họ đã làm ra series Talos Principle và một game engine Vulkan tùy chỉnh.
  • Có phải đây là ý tưởng kiểu như "1500 archers on a 28.8" của Age of Empires không?
  • Chỉ ra hiện tượng phần mềm trở nên chậm hơn và kém hiệu quả hơn khi tài nguyên kỹ thuật tăng lên. Gọi đó là "hiệu ứng thiết kế phần mềm Benjamin Button".
  • Kiến trúc của Factorio chỉ truyền các sự kiện đầu vào và dựa vào lõi mô phỏng được đồng bộ hóa.
  • Nhớ lại thời từng chơi Serious Sam bằng bản demo trên PC Gamer. Giờ đây nó đã được xem là một game kinh điển.
  • Giải thích tính năng nội suy (interpolation) của Serious Engine. Có thể chơi game không nội suy bằng cách nhập net_bLerping=0 trong console.