ứng dụng gặp sự cố khi đạt 1,5Gb.
Điều này cho thấy rằng bạn không thể hiện chính xác các ô của mình, vì điều này có nghĩa là mỗi ô có kích thước ~ 80 byte.
Điều bạn cần hiểu là cần có sự tách biệt giữa khái niệm trò chơi của một ô và hình ảnh trực quan mà người dùng nhìn thấy. Hai khái niệm này không giống nhau .
Lấy Terraria làm ví dụ. Thế giới Terraria nhỏ nhất chiếm 4200x1200, tức là 5 triệu gạch. Bây giờ, cần bao nhiêu bộ nhớ để đại diện cho thế giới đó?
Chà, mỗi viên gạch có một lớp tiền cảnh, một lớp nền (các bức tường nền), một "lớp dây" nơi dây dẫn đi và một "lớp đồ nội thất" nơi các vật dụng nội thất đi. Mỗi viên gạch chiếm bao nhiêu bộ nhớ? Một lần nữa, chúng ta chỉ nói về khái niệm, không trực quan.
Một gạch nền trước có thể dễ dàng được lưu trữ trong một dấu ngắn không dấu. Không có hơn 65536 loại gạch nền trước, vì vậy không có điểm nào sử dụng nhiều bộ nhớ hơn loại này. Các ô nền có thể dễ dàng ở dạng byte không dấu, vì có ít hơn 256 loại gạch nền khác nhau. Lớp dây hoàn toàn là nhị phân: hoặc một lát có một dây trong đó hoặc không. Vì vậy, đó là một bit trên mỗi lát. Và lớp đồ nội thất một lần nữa có thể là một byte không dấu, tùy thuộc vào số lượng đồ nội thất khác nhau có thể có.
Tổng kích thước bộ nhớ cho mỗi ô: 2 byte + 1 byte + 1 bit + 1 byte: 4 byte + 1 bit. Do đó, tổng kích thước cho bản đồ Terraria nhỏ là 20790000 byte, hoặc ~ 20MB. (lưu ý: các tính toán này dựa trên Terraria 1.1. Trò chơi đã mở rộng rất nhiều kể từ đó, nhưng ngay cả Terraria hiện đại cũng có thể phù hợp trong phạm vi 8 byte cho mỗi vị trí ô, hoặc ~ 40 MB. Vẫn có thể chấp nhận được).
Bạn không bao giờ nên có đại diện này được lưu trữ dưới dạng mảng của các lớp C #. Chúng nên là các mảng số nguyên hoặc một cái gì đó tương tự. AC # struct cũng sẽ hoạt động.
Bây giờ, khi đến lúc vẽ một phần của bản đồ (lưu ý sự nhấn mạnh), Terraria cần chuyển đổi các ô khái niệm này thành các ô thực tế . Mỗi ô cần thực sự chọn một hình ảnh nền trước, hình nền, hình ảnh đồ nội thất tùy chọn và có hình ảnh dây. Đây là nơi XNA xuất hiện với các bảng sprite khác nhau và như vậy.
Những gì bạn cần làm là chuyển đổi phần hiển thị của bản đồ khái niệm của bạn thành các ô xếp hình sprite XNA thực tế. Bạn không nên cố gắng chuyển đổi toàn bộ mọi thứ cùng một lúc . Mỗi ô bạn lưu trữ chỉ nên là một chỉ mục nói rằng "Tôi là loại X," trong đó X là số nguyên. Bạn sử dụng chỉ số nguyên đó để tìm nạp sprite nào bạn sử dụng để hiển thị nó. Và bạn sử dụng các tấm sprite của XNA để thực hiện việc này nhanh hơn là chỉ vẽ các hình tứ giác riêng lẻ.
Bây giờ, vùng gạch có thể nhìn thấy cần được chia thành nhiều phần khác nhau, để bạn không liên tục xây dựng các tấm sprite mỗi khi máy ảnh di chuyển. Vì vậy, bạn có thể có 64x64 khối của thế giới dưới dạng các tấm sprite. Bất kỳ khối 64x64 nào trên thế giới đều có thể nhìn thấy từ vị trí máy ảnh hiện tại của người chơi là các khối bạn vẽ. Bất kỳ khối nào khác thậm chí không có tấm sprite; nếu một đoạn rơi ra khỏi màn hình, bạn ném tờ đó ra (lưu ý: bạn không thực sự xóa nó; bạn giữ nó xung quanh và bảo vệ nó cho một đoạn mới có thể nhìn thấy sau này).
Tôi muốn có toàn bộ bản đồ được xử lý ít nhất trên ứng dụng máy chủ (và trên máy khách nếu có thể).
Máy chủ của bạn không cần biết hoặc quan tâm đến biểu diễn trực quan của gạch. Tất cả những gì nó cần quan tâm là đại diện khái niệm. Người dùng thêm một ô ở đây, vì vậy nó thay đổi chỉ mục ô đó.