Làm thế nào để bạn thiết kế một hệ thống ghi / phát lại cho một trò chơi thường xuyên thay đổi?


10

Tôi đang làm việc trong một MMORPG miễn phí và tôi gặp vấn đề.

Tôi (cùng với những người khác) đang phát triển một hệ thống quay video cho trò chơi. Ý tưởng về cơ bản là: chúng tôi ghi lại tất cả các gói được gửi và nhận với dấu thời gian, cộng với một số dữ liệu cục bộ từ máy khách và sau đó kết xuất nó trong một tệp. Để phát video, chúng tôi chỉ mô phỏng mọi thứ trên tệp. Chúng tôi cũng có một tùy chọn để xuất video sang avi với ffmpeg.

Vấn đề là: khi chúng tôi thay đổi giữa các phiên bản của trò chơi, thật khó để duy trì khả năng tương thích ngược cho video (các lệnh được thêm / xóa, thay đổi chức năng, v.v.). Có một cách tốt để xử lý vấn đề này? thay vì có một loạt các trình phát khác nhau và chọn một trình phát phù hợp cho từng phiên bản của tệp video?

Sẽ rất hữu ích khi biết các trò chơi khác xử lý tình huống này như thế nào.

Cảm ơn sự giúp đỡ, xin lỗi cho tiếng Anh của tôi.


Cũng giống như một số thực phẩm khác để tìm hiểu / nghiên cứu: Cách bạn thực hiện chính xác là cách Quake Games ghi lại các bản demo, bằng cách chụp Gói máy chủ. Theo như tôi biết họ chỉ đơn giản là không bao giờ giải quyết các vấn đề tương thích.
Michael Stum

Tôi đã thay đổi tiêu đề của câu hỏi này - nó không thực sự về MMO, ngoại trừ MMO là trò chơi thay đổi thường xuyên nhất.

Câu trả lời:


8

Quy tắc cơ bản của chúng tôi là không bao giờ thay đổi loại gói hiện có. Mọi thứ đều được thêm vào cuối của một lệnh hiện có hoặc một lệnh mới. Điều này cũng khiến cho hai người ít có khả năng dậm chân vào công việc của nhau.


Trong trò chơi này, điều đó xảy ra .. Các gói được thêm, xóa, di chuyển (ví dụ, cách đây một thời gian, chúng tôi đã quyết định chuyển tất cả các gói liên quan đến Lệnh GM sang "gói mở rộng", điều này có thể sẽ xảy ra lần nữa khi chúng tôi viết lại Hệ thống bang hội .. Chỉnh sửa các lệnh / chức năng (thay đổi chức năng của nó) ít có khả năng hơn, nhưng đó không phải là vấn đề. Bạn nói rằng từ bây giờ, chúng ta không nên xóa bất kỳ gói nào, xóa các lệnh chỉ để chúng không thể truy cập được phía máy chủ? cho câu trả lời của bạn!
Marco

1
Đúng, không dùng nữa và để chúng ở đó. Cuối cùng những thứ cũ có thể được gỡ bỏ, nhưng đó thường là sau một hoặc hai năm.
coderanger

1
Ngoài ra, một số kế hoạch bổ sung sẽ giúp. Bạn càng lên kế hoạch tốt hơn cho các gói của mình bây giờ, thì càng ít thay đổi bạn sẽ cần thực hiện trong tương lai.
Kylotan

Vấn đề là trò chơi luôn thay đổi. Chúng tôi thêm một gói mới gần như mỗi tháng (chúng tôi thêm các tính năng mới). Tuy nhiên, chúng ta phải thực hiện nhiều thay đổi đối với các tính năng viết lại gói cũ và vì vậy .. Nhưng tôi đoán chúng ta có thể để các phương thức ở đó và đợi một năm để loại bỏ chúng.
Marco

3
Sử dụng các loại gói chung hơn sẽ giúp bạn rất nhiều ở đây. Bạn không cần thêm tin nhắn mới cho mỗi tính năng mới mà bạn triển khai.
Kylotan

5

Không thể tưởng tượng được, đặc biệt là trên PC, họ chỉ phiên bản mã trò chơi và nâng cấp phiên bản khi họ thực hiện thay đổi ảnh hưởng đến hệ thống phát lại. Nếu tệp phát lại được gắn thẻ với phiên bản mã trò chơi, nó được tạo và khách hàng vẫn có quyền truy cập vào phiên bản đó để nó hoạt động tốt.


Đó là cách tôi đã thấy điều này trong thực tế, lưu trữ số phiên bản với nhật ký trò chơi. Sau đó, tất nhiên bạn cũng phải giữ các phiên bản phần mềm trước đó để phát lại các bản ghi trước đó, ví dụ như trong kho lưu trữ mã nguồn, nhưng có lẽ bạn vẫn nên làm điều đó.
Ian Schreiber

Cảm ơn câu trả lời của bạn, trò chơi này miễn phí (được cấp phép GPL), vì vậy bất kỳ ai cũng có thể truy cập vào các phiên bản trò chơi cũ và thậm chí biên dịch ứng dụng khách để không có vấn đề gì với tất cả các phiên bản khác nhau của nó. Điều này rất được sử dụng, không phải tất cả các máy chủ thay thế đều sử dụng các phiên bản mới nhất, có những máy chủ chạy các phiên bản từ năm 2004 ..
Marco

@Marco: Tôi nghi ngờ cách SC2 hoạt động là nó đặt gần như tất cả các mã trong một DLL. Khi tải lại một bản phát lại, nó sẽ kiểm tra phiên bản và tải DLL cho phiên bản đó và chạy. Nó phức tạp hơn một chút, nhưng người dùng chỉ cần một lần cài đặt và một exe có thể chạy tất cả các replay cũ.
Vịt Mooing

1

Một cách để giải quyết vấn đề này là dọc theo dòng của một trò chơi có tên "Heroes of Newerth". (thay đổi sau mỗi +/- 2 tuần) Từ những gì tôi có thể nói với họ:

  1. Sử dụng vá khác nhau cho trò chơi và phát lại.
  2. Tất cả các replay được lưu trữ trên đám mây. Cuối cùng họ hết hạn.
  3. Nếu người dùng muốn xem một bản phát lại cũ đã tải xuống, trước tiên họ cần sử dụng nút "Tương thích".
  4. Có vẻ như điều này từ xa khác với phiên bản mới nhất; hoặc trong trường hợp phát lại không còn được lưu trữ, hãy tải nó lên và sau đó thực hiện điều khiển từ xa.

Vì tôi không làm việc ở S2 nên rõ ràng tôi không thể nói đó chắc chắn là cách nó hoạt động. Tuy nhiên, tôi đã nhận thấy xu hướng kích thước tải xuống được đánh dấu liên quan đến tuổi của phát lại.

Hoặc là, hoặc họ thêm các bản vá thực thể vào phát lại (ví dụ: chính tả X có hiệu ứng Y thay vì hiệu ứng Z). Nếu thông tin liên quan đến gói cũng được lưu trữ trong cấu hình thực thể, bản vá nóng thực thể này cũng sẽ cho phép bạn hiểu các gói cũ hơn.

Tôi chắc chắn sẽ không lưu trữ hành vi lịch sử trên máy khách vì điều đó có thể trở nên rất nhanh chóng. Đặc biệt là khi máy khách đang cập nhật từ ví dụ 10.1.0 đến 10.2.0 (vì họ cần tải xuống mọi bản vá giữa hai phiên bản, thay vì bản vá cuối cùng).

Google Protobuf là một ý tưởng tốt như một lớp tuần tự hóa vì nó hỗ trợ những thứ như thế này theo thiết kế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.