Làm cách nào tôi có thể xử lý các thay đổi phiên bản khi lưu tài sản?


9

Bây giờ tôi đã làm việc về một game nhập vai và tôi sử dụng hai kỹ thuật tuần tự hóa khác nhau.

  • Kẻ thù, Vũ khí, vật phẩm được lưu dưới dạng XML.
  • Bản đồ và sự kiện được lưu dưới dạng "nhị phân được kiểm soát" (mỗi lớp có phương thức lưu / tải và họ quyết định những gì họ muốn lưu / tải).

Nhưng tôi đã bắt đầu đặt câu hỏi về sự lựa chọn của tôi cho bản đồ và sự kiện. Mối quan tâm của tôi:

  • Tôi đã tạo một trình chỉnh sửa bản đồ nhưng tôi vẫn nhớ việc có thể thay đổi những thứ nhỏ bằng cách chỉ mở tệp.
  • Thay đổi lộn xộn lên rất nhiều. Giả sử tôi muốn thêm một biến vào một lớp, nếu tôi không tải / lưu lại mỗi bản đồ thì nó sẽ bị hỏng sau đó.

Mối quan tâm đầu tiên là khó có thể đi xung quanh mà không thay đổi kỹ thuật của tôi. Tôi đã nghĩ về việc thay đổi thành JSON, nhưng nó rất nhiều công việc. Tôi cũng nghĩ rằng nó trông khá xấu xí với các thuộc tính [DataContract] và [DataMember] ở mọi nơi.

Điều đó khiến tôi lo lắng thứ hai và tôi tự hỏi làm thế nào tôi có thể đối phó với nó? Bạn có tạo một chương trình nhỏ lặp qua tất cả các bản đồ và lưu lại chúng với biến mới không? Bởi vì bây giờ tôi bắt đầu có được một vài bản đồ và tôi vẫn làm nó bằng tay. Nó khiến tôi suy nghĩ hai lần mỗi khi tôi muốn thực hiện một số thay đổi vì nó tạo ra rất nhiều công việc phụ.

Câu trả lời:


5

Có rất nhiều cách để xử lý vấn đề phiên bản; bạn có thể thực hiện bằng cách có một chức năng tải cho mỗi phiên bản, bạn có thể cố gắng tự động hóa quy trình bằng cách mô tả (thông qua các thuộc tính thường) chuyển đổi cấu trúc tài sản theo thời gian, bạn có thể thực hiện kiểm tra cụ thể theo phiên bản bên trong chức năng tải / lưu, et cetera .

Tôi thích cách tiếp cận "mô tả các thay đổi" nhưng thấy rằng cố gắng thực hiện nó thông qua các thuộc tính trở nên khó xử nhanh chóng . Tôi sẽ sử dụng các chức năng thay thế; thực hiện chức năng biến đổi dữ liệu trong phiên bản Nthành dữ liệu trong phiên bản N + 1cho tất cả phiên bản phù hợp của bạn. Khi tải, hãy kiểm tra phiên bản mới nhất và nếu không, hãy chạy dữ liệu thông qua tất cả các chức năng tạo phiên bản phù hợp. Luôn luôn lưu phiên bản mới nhất.

Điều này hoạt động tốt nhất nếu bạn thực hiện chuyển đổi khi dữ liệu vẫn ở dạng khóa-giá trị thời gian chạy. Điều này có nghĩa là bạn có thể muốn triển khai biểu diễn cho dữ liệu của mình theo cách tiếp cận "túi thuộc tính thời gian chạy", bởi vì bạn không thể sử dụng dạng JSON hoặc XML cơ bản dưới dạng khóa nếu bạn có định dạng nhị phân của riêng mình. Nếu bạn không làm điều này, bạn cũng có thể cần phải giữ các định nghĩa lớp cũ xung quanh, điều này trở nên xấu xí. Có thể có tài sản của bạn ở định dạng xấu này cũng rất hữu ích cho việc phát triển trình chỉnh sửa trò chơi.

Trong quá trình phát triển khi bạn lặp lại dữ liệu của mình, nó sẽ tự nhiên nổi lên phiên bản mới nhất và cuối cùng bạn có thể xóa các chức năng tạo phiên bản cũ. Đây ít nhiều là cách tiếp cận cấp cao tương tự mà chúng tôi đã sử dụng để phiên bản các tài sản nghệ thuật (như bản đồ) trong Guild Wars 2.


Bây giờ, tất cả những gì đã nói, tôi nghĩ thật hữu ích khi hỗ trợ cả tuần tự văn bản và nhị phân cho tài sản. Trong quá trình phát triển, hãy giữ tất cả dữ liệu của bạn ở định dạng có thể đọc được dựa trên XML hoặc JSON. Điều này có thể tăng khả năng lặp lại của bạn rất nhiều vì bạn không cần phải xây dựng các công cụ phức tạp như vậy xung quanh việc chỉnh sửa dữ liệu. Bạn có thể quay lại để có thể thực hiện các điều chỉnh nhanh đơn giản bằng tay.

Thứ hai, giả sử bạn thậm chí vẫn muốn định dạng nhị phân để vận chuyển trò chơi (có thể cải thiện kích thước tệp hoặc thời gian IO của tệp, vì vậy đó là mong muốn hợp lệ), thiết kế API tuần tự hóa và khử tuần tự hóa của bạn để xử lý phiên bản. Versioning vẫn còn hữu ích trong bối cảnh vận chuyển, bởi vì như một lúc nào đó bạn có thể muốn cập nhật tàu hoặc sửa lỗi. Có một số tài liệu mô tả các khả năng phiên bản của tuần tự hóa .NETtuần tự hóa Boost mà bạn có thể thấy thú vị. Nếu bạn đang đi để hỗ trợ cả hai văn bản và định dạng nhị phân, chắc chắn rằng bạn kiểm tra chúng thường xuyên (hoặc tự động xây dựng các xét nghiệm để làm như vậy, thậm chí tốt hơn).


Cảm ơn các bình luận, đã cho tôi một số ý tưởng làm thế nào để tiếp tục.
dùng1776562

1

Sử dụng ngôn ngữ đánh dấu với các cặp giá trị thuộc tính như XML hoặc JSON.

Trình phân tích cú pháp có thể bỏ qua mọi thuộc tính mà nó không hiểu hoặc sử dụng mặc định cho bất kỳ thuộc tính nào mà nó không tìm thấy, điều này làm cho khả năng tương thích ngược và chuyển tiếp khá dễ dàng. Ngoài ra, định dạng có thể đọc được bằng con người để bạn có thể dễ dàng chỉnh sửa nó bằng trình soạn thảo văn bản.

Khi bạn sử dụng một ngôn ngữ đã được thiết lập như XML hoặc JSON, bạn cũng sẽ nhận thấy rằng nhiều ngôn ngữ script hỗ trợ nó, vì vậy khi bạn vẫn cần viết một tập lệnh để chỉnh sửa một số lượng lớn tệp, bạn sẽ thấy việc đó dễ dàng hơn nhiều.

Hạn chế của hầu hết các ngôn ngữ này là chúng khá dài dòng. Điều đó có nghĩa là các tệp kết quả lớn hơn nhiều so với định dạng nhị phân được tối ưu hóa. Ngày nay, kích thước tệp không quan trọng quá nhiều trong hầu hết các tình huống. Nhưng ở những nơi có vấn đề, kích thước tệp thường có thể giảm đáng kể bằng cách nén tệp bằng thuật toán chứng khoán như zip.

Ngôn ngữ đánh dấu thường không cho phép truy cập ngẫu nhiên trừ khi toàn bộ tài liệu được đọc từ ổ cứng và được phân tích cú pháp. Nhưng trong thực tế, điều này không quan trọng lắm, bởi vì ổ cứng là nhanh nhất với các lần đọc tuần tự. Tìm kiếm ngẫu nhiên nhiều lần đến các phần khác nhau của cùng một tệp thường có thể chậm hơn nhiều so với chỉ đọc tệp trong một lần, ngay cả khi điều đó có nghĩa là bạn đọc nhiều dữ liệu hơn mức cần thiết.


1

bạn có thể sử dụng protobuf. https://code.google.com.vn/p/protobuf/ Nó mang đến cho bạn những lợi thế của json / xml, mà bạn có thể dễ dàng mở rộng nó trong khi tương thích ngược, cộng với lợi thế là nhị phân. Quy trình công việc là, bạn tạo một mô tả định dạng dữ liệu bằng ngôn ngữ protobuf và sau đó tạo mã nguồn để tuần tự hóa và giải tuần tự hóa. Nguồn có thể được tạo ra cho một số ngôn ngữ. Ngoài ra, đó là một lợi thế lớn khi bạn có một đặc tả rõ ràng về dữ liệu được xê-ri hóa của mình, ngược lại với json nơi đặc tả được thực hiện hoàn toàn trong việc đọc / ghi.


Trông thật tuyệt nhưng tôi sử dụng c #, điều này dường như là dành cho c ++, python và java.
dùng1776562

Có phiên bản C #. Tôi đã không kiểm tra cá nhân, nhưng có một.
Arne
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.