Làm thế nào để cứu một thế giới thủ tục?


17

Gần đây tôi đã đọc về cách tạo ra thế giới thủ tục ... nhưng làm cách nào để cứu một thế giới?

Trong các trò chơi như Terraria hay Minecraft, người dùng có thể tự do sửa đổi cảnh quan, nhưng thế giới đó không thể được tạo lại từ hạt giống ban đầu. Những kỹ thuật được sử dụng để cứu thế giới thủ tục nhưng có thể sửa đổi?

Câu trả lời:


21

Lưu hạt giống mà bạn đã sử dụng để tạo ra thế giới và các sửa đổi dưới dạng "lệnh" nguyên tử hoặc kết quả của những hạt giống đó.

Sau đó, khi tải trò chơi đã lưu, bạn làm như sau:

  1. Thủ tục tạo ra một phần của thế giới bạn hiện đang truy cập.
  2. Áp dụng các lệnh đã lưu hoặc ghi đè lên các phần tử được tạo bằng các phần tử đã lưu.

Cập nhật: Và tất nhiên, có tùy chọn lưu thế giới được tạo của bạn giống như một thế giới bình thường, nếu tài nguyên có sẵn (như đã thấy trong Minecraft). Trong trường hợp này, bạn chỉ nên lưu các phần của thế giới đã được truy cập (nếu không việc tạo thủ tục sẽ khá vô nghĩa), xếp từng ô. Điều này ngốn nhiều tài nguyên ổ cứng và / hoặc cơ sở dữ liệu hơn, nhưng sẽ cần ít năng lượng CPU hơn khi tải trò chơi.


2
Ngoài các sửa đổi, có lẽ anh ta cũng cần phải lưu hạt giống đã được sử dụng để xây dựng thế giới thủ tục ;-)
bummzack

@bummzack Tất nhiên, tôi quên đề cập đến điều đó, vì rõ ràng :-) Tôi sẽ chỉnh sửa câu trả lời của mình.
Marton

10
Tôi không hoàn toàn chắc chắn rằng tái tạo thế giới từ hạt giống là ý tưởng tốt nhất. Thế hệ thế giới thường liên quan đến các thuật toán phức tạp và do đó cần có thời gian: chúng ta tạo ra các thế giới ngẫu nhiên không phải để tiết kiệm không gian nói chung mà là để hưởng lợi từ sự ngẫu nhiên. Do đó, tôi sẽ cân nhắc rằng việc cứu toàn bộ thế giới ở định dạng nhị phân sẽ hiệu quả hơn.
Jonathan Connell

2
Vì vậy, bạn đang nói để cứu một thế giới được tạo theo thủ tục, bạn tạo ra nó, sau đó lưu nó? Đây không phải là một câu trả lời rất đầy đủ.
MichaelHouse

2
@ Random832 Minecraft không cứu thế giới ở định dạng nhị phân, thay vì tái tạo nó từ hạt giống và phát lại các sửa đổi. Để giải quyết vấn đề cứu toàn bộ thế giới, Minecraft chỉ lưu các khối đã được tạo ra cho đến nay. Khi bạn tiếp tục khám phá thế giới, trò chơi tiết kiệm của bạn trở nên lớn hơn.
Joseph Mansfield

8

Lưu một thế giới được tạo theo thủ tục cũng giống như lưu bất kỳ dữ liệu bản đồ nào.

Bạn có thể muốn cứu thế giới ở định dạng nhị phân, giả sử thế giới được xây dựng từ các loại gạch khác nhau, bạn sẽ phải:

  1. Quyết định tổng số loại gạch khác nhau. (Tùy theo bạn sẽ cần nhiều hay ít bit để đại diện cho mỗi ô)
  2. Xác định chiều rộng và chiều cao của thế giới đã truy cập (sửa đổi).
  3. Đại diện cho ô thế giới bằng ô xếp từ ô trên cùng bên trái (bao gồm cả bầu trời) theo hàng cho đến ô dưới cùng bên phải.
  4. Nếu bạn muốn tiết kiệm không gian, hãy sử dụng DEFLATE hoặc một thuật toán tương tự để nén mảng 2d này (được biểu thị là 1-d) http://en.wikipedia.org/wiki/DEFLATE
  5. Sử dụng I / O tệp thích hợp cho API của bạn để lưu trữ dữ liệu trên đĩa.

Bạn cũng có thể sử dụng cùng một phương pháp để lưu bản đồ dựa trên voxel.

Lưu trữ một mô hình bản đồ dựa trên đỉnh là phức tạp hơn.

Bạn có muốn tôi giải thích về chủ đề đó?


Nếu bạn muốn, bạn có thể lưu nó trong tệp png bằng cách mã hóa màu cho từng ô. Điều này sẽ cho phép bạn tổng quan kết quả nhanh chóng mà không cần sử dụng trình xem chuyên biệt.
sói


3

Bất kỳ cấu trúc dữ liệu nào bạn đang sử dụng để lưu trữ thế giới trong bộ nhớ đều có thể được sử dụng làm mẫu để ghi và đọc từ đĩa. Phần thủ tục trong trò chơi của bạn sẽ điền vào các cấu trúc dữ liệu này lần đầu tiên, nếu không có dữ liệu từ đĩa. Sau đó, khi bạn sẵn sàng dỡ một vùng khỏi bộ nhớ, hãy ghi nó vào đĩa vì nó đã được tạo hoặc sửa đổi.

Bất cứ khi nào bạn sẵn sàng tải một khu vực mới vào bộ nhớ, trước tiên hãy kiểm tra xem nó có được tạo trước đó không và được lưu vào đĩa. Nếu có, hãy tải nó từ đĩa thay vì từ các thuật toán tạo thủ tục của bạn.

Thông thường, điều này sẽ được thực hiện với khối địa hình. Bạn có thể lưu từng đoạn vào tệp riêng của nó hoặc tạo cấu trúc đĩa phức tạp hơn chứa dữ liệu trong một tệp với bảng tra cứu. Có những câu hỏi khác về những cách tốt để lưu dữ liệu của bạn vào đĩa.

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.