Bản đồ 2D từ trên xuống


8

Tôi đã tự hỏi làm thế nào điều này hoạt động.

Bạn có tải bản đồ hoàn chỉnh khi trò chơi khởi động không, hoặc bạn tải các phần của bản đồ khi chạy?

Và làm thế nào bạn sẽ lưu các bản đồ? Nó sẽ ở dạng XML hoặc một số định dạng nhị phân?

Cảm ơn!

Câu trả lời:


23

Tôi đồng ý với Kinh doanh điện tử. Nó phụ thuộc vào kích thước và cách bạn muốn chỉnh sửa nó.

Ước tính kích thước byte của bản đồ của bạn trong một đại diện hợp lý nhỏ gọn. Cũng quyết định phần nào của bản đồ có thể thay đổi khi trò chơi chơi. Những phần không thay đổi có thể được tải và không phải lưu. Nếu kích thước ước tính là nhỏ, chỉ cần lưu trữ mọi thứ trong bộ nhớ. Không có giá trị phức tạp thêm khi tải các phần của bản đồ và theo dõi những gì bạn đã tải hoặc không, trừ khi dữ liệu quá lớn đến mức cần thiết.

Ví dụ: nếu bạn đang viết Civilization II , kích thước bản đồ của bạn có thể là 100x100 ô.

  1. Mỗi ô là một trong 12 loại, vì vậy bạn có thể lưu trữ trong 4 bit. Điều đó có nghĩa là bản đồ chính là 100 x 100 x 0,5 byte = 5.000 byte để lưu trữ các loại ô. Bản đồ chính không bao giờ thay đổi.
  2. Bạn cũng có thể cải thiện gạch bản đồ với đường, thủy lợi, v.v., và có tới 7 cải tiến. Điều đó có nghĩa là 2 ^ 7 giá trị khác nhau, lấy 7 bit, nhưng có lẽ chúng ta chỉ sử dụng 1 byte cho nó. Điều đó mang lại cho chúng tôi 100 x 100 x 1 byte = 10.000 byte để lưu trữ các cải tiến.
  3. Sương mù chiến tranh cho chúng ta biết những ô bản đồ nào bạn đã thấy, vì vậy bạn cần 1 bit cho mỗi người chơi. Nếu bạn giới hạn ở 8 người chơi, đó là một byte khác trên mỗi ô bản đồ hoặc 10.000 byte cho sương mù chiến tranh.
  4. Cuối cùng, có tất cả các thành phố và đơn vị. Bạn có thể ước tính rằng mỗi người chơi có tối đa 20 thành phố và 100 đơn vị và mỗi đơn vị này có thể yêu cầu 100 byte dữ liệu (phỏng đoán hoang dã), do đó, đó là 12.000 byte (nhiều hơn nữa nếu bạn đang sử dụng XML).

Đó là dưới 30k cho một đại diện nhị phân nhỏ gọn cho các đối tượng bản đồ + II, vì vậy bạn có thể lưu trữ tất cả trong bộ nhớ, ngay cả khi bạn sử dụng định dạng dài dòng lớn hơn nhiều. Tôi đã nhận được những con số trên từ một người nào đó đảo ngược cấu trúc bản đồ Civil II .

Daggerfall , được một số người coi là có bản đồ rộng đến mức lố bịch, có vẻ là 5000x2500 và khoảng 25 megabyte, nhưng nó cũng có một số lượng lớn NPC (750.000 là những gì tôi đã đọc nhưng có vẻ rất cao). Trên các máy tính để bàn / máy tính xách tay ngày nay, điều này cũng có thể phù hợp với bộ nhớ, nhưng trên các thiết bị di động hoặc trình duyệt có thể hơi lớn. Có một wiki mô tả định dạng bản đồ Daggerfall .

Bạn có thể giảm kích thước bằng cách xác định và bao thanh toán dự phòng . Ví dụ: thay vì lưu trữ 100.000 cây hoặc thanh kiếm giống nhau ở định dạng XML, hãy lưu trữ một cây và một thanh kiếm và 100.000 tham chiếu đến chúng. Trong các định dạng nhị phân, tham chiếu có thể chỉ có 1 hoặc 2 byte và ở định dạng dài hơn, tham chiếu vẫn có thể nhỏ một cách hợp lý.

Làm điều đơn giản nhất làm việc cho trò chơi của bạn. Nếu bản đồ nhỏ, sẽ không có vấn đề gì nếu bạn sử dụng định dạng nhỏ gọn hoặc dài dòng. Nếu định dạng nhỏ gọn sẽ phù hợp với bộ nhớ nhưng định dạng dài dòng thì không, bạn phải quyết định xem công việc bổ sung của định dạng nhị phân nhiều hay ít hơn công việc phụ của việc tải các phần của bản đồ. Điều đó sẽ phụ thuộc vào trò chơi. Trong một trò chơi giống như Civil, nơi bạn cần tất cả dữ liệu để mô phỏng lượt chơi, định dạng nhị phân có lẽ là lựa chọn tốt hơn. Trong một trò chơi giống như Daggerfall, nơi bạn không cần tải các khu vực ngoại trừ những gì gần người chơi, tải các phần của bản đồ có lẽ là một lựa chọn tốt hơn. Nếu bản đồ là như vậy lớn đến mức ngay cả định dạng nhỏ gọn cũng không vừa với bộ nhớ, trước tiên hãy tự hỏi liệu nó có thực sự xứng đáng với tất cả công việc phụ để xử lý hay không, và nếu vậy, hãy thiết kế định dạng nhị phân mà bạn có thể tải các phần.

Đối với dự án (sở thích) hiện tại của tôi, các bản đồ và tất cả các đối tượng trên chúng phù hợp với 50 MB, vì vậy giữ tất cả trong bộ nhớ sẽ ổn. Tuy nhiên, tôi muốn nó chạy trên trình duyệt và 50 MB nhiều hơn tôi muốn chuyển qua mạng, vì vậy tôi giữ tất cả chúng trong bộ nhớ trên máy chủ và sau đó chỉ tải các phần của thế giới vào máy khách. Các lát bản đồ của tôi là 1 byte cho mỗi ô, các ô 2048x2048 (4 MB). Các đối tượng (cây, ghế, orc, v.v.) được mã hóa JSON để đơn giản. Trong máy khách, tôi chỉ tải các khu vực bản đồ (bao gồm các đối tượng của chúng) ở gần trình phát.


1
Cảm ơn cho một câu trả lời tuyệt vời, điều này đã xóa tất cả lên rất nhiều với tôi! (PS chúc may mắn với dự án của bạn :)
Kevin

4

Tải bao nhiêu ít nhất phụ thuộc vào độ lớn của bản đồ, nếu dữ liệu có thể phù hợp một cách hợp lý trong bộ nhớ thì thực sự không có lý do gì để bận tâm với tải liên tục.

Điều đáng chú ý nhất mà XML thực hiện là chiếm rất nhiều dung lượng lưu trữ / bộ nhớ / không gian mạng / lưu lượng truy cập bổ sung. Nếu bạn nghĩ rằng sử dụng XML là thú vị, hãy chắc chắn chỉ làm như vậy đối với lượng dữ liệu tương đối nhỏ.

Khi bạn thiết kế một định dạng dữ liệu, bạn nên nhớ cách bạn muốn chỉnh sửa dữ liệu này. Bạn có thể sử dụng trình soạn thảo văn bản đơn giản để ghi dữ liệu của mình dưới dạng tệp văn bản thuần túy, bạn có thể sử dụng trực tiếp các tệp này hoặc bạn có thể chuyển đổi chúng sang định dạng nhị phân để tiết kiệm dung lượng. Bạn có thể sử dụng trình chỉnh sửa hình ảnh để tạo các cấp độ của mình dưới dạng bitmap, một lần nữa, bạn có thể muốn chuyển đổi thành một tệp nhỏ hơn.

Hoặc bạn có thể tạo trình soạn thảo của riêng mình, trong trường hợp đó có rất ít lý do để không sử dụng định dạng nhị phân nhỏ gọn.


1

Không có ai trả lời cho những câu hỏi này. Đây là tất cả vốn tùy thuộc vào bạn.

Bạn có thể lưu bản đồ bằng mọi cách bạn thích và hiển thị / hiển thị chúng bất cứ lúc nào.


Tôi sẽ thêm một điều nữa, lý do hiệu suất có thể khiến bạn tải các mảnh bản đồ theo thời gian, nhưng tôi nghĩ đối với hầu hết các trò chơi thực tế, điều đó thực sự không quan trọng trừ khi bạn phát triển trên thiết bị di động.
Bryan Harrington

2
Điều này có thể đúng, nhưng thật tuyệt khi đưa ra một số cách chung để thực hiện.
Vịt Cộng sản

Trong khi tôi hiểu, tôi đã từng ở vị trí đó "Làm thế nào để tôi làm" cái này "". Tôi đã học được cách khó khăn trong một khóa học đồ họa mà tôi đã tham gia, chúng tôi cần triển khai A * với lưới Điều hướng. Tôi đã dành hàng giờ để nghiên cứu, đọc và cố gắng tìm cách để làm điều đó. Cuối cùng, nó không bao giờ được thực hiện. Tôi đã học được bài học gì? Lẽ ra tôi nên làm theo cách mà tôi đã hiểu cách thực hiện trước khi tôi bị rối loạn não.
Bryan Harrington
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.