RAM của bạn là giới hạn của bạn .
Các thử nghiệm sau đây đã được thực hiện trên một hệ thống với các thông số kỹ thuật sau:
- Intel i5-6600
- RAM 16 GB
- NVIDIA GeForce GTX 1070
- Windows 7 phiên bản Home Premium
Đây là một đoạn script tôi đã chạy để phát triển một tilemap bằng cách điền nó với một ô duy nhất (32x32 pixel). Phương thức Grow()
thêm một cột khác và một hàng khác vào bản đồ hiện tại. Phương thức được gọi 100 lần mỗi lần cập nhật.
public class TileTest : MonoBehaviour {
public Tile tile;
private Tilemap tilemap;
public int currentSize;
void Start () {
tilemap = GetComponent<Tilemap>;
Grow();
}
void Update() {
for (var i = 0; i < 100; i++) {
Grow();
}
Debug.Log(currentSize);
}
private void Grow() {
for (int x = 0; x < currentSize; x++) {
tilemap.SetTile(new Vector3Int(x, currentSize, 0), tile);
}
for (int y = 0; y < currentSize; y++) {
tilemap.SetTile(new Vector3Int(currentSize, y, 0), tile);
}
tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);
currentSize++;
}
}
Sau vài phút, máy tính của tôi hết bộ nhớ và Unity bị hỏng. Vào thời điểm đó, nó ở mức 8400x8400 (70 triệu) và Unity.exe đã tiêu thụ ít hơn 11 GB RAM theo trình quản lý tác vụ.
Vâng, nhưng những gì về bản đồ thưa thớt ?
Đây là một tập lệnh khác nhau đã đặt một ô đơn lẻ khi tăng tọa độ x và y theo gia số của 100 ô:
public class TileTest : MonoBehaviour {
public Tile tile;
private Tilemap tilemap;
public int currentSize;
void Start () {
tilemap = GetComponent<Tilemap>();
}
void Update() {
tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);
currentSize+= 100;
}
}
Trên thực tế, dung lượng bộ nhớ của Unity.exe tăng rất ít, điều này gợi ý rằng các ô ô trống không cần RAM. Tuy nhiên, FPS tiếp tục giảm khi các viên gạch đang phát triển. Nó đạt 60 Fps ở 30000x30000, 30 Fps ở 60000x60000 và 15 Fps ở 90000x90000. Các Fps vẫn ở mức thấp khi tôi gỡ bỏ tập lệnh trong khi trò chơi thử nghiệm đang chạy. Vì vậy, sự chậm lại này không phải là từ việc thay đổi tilemap. Nó chỉ đơn giản là từ việc kết xuất nó. Vì vậy, khi bạn muốn tạo ra một trò chơi thế giới mở thực sự khổng lồ, bạn có thể phải sử dụng nhiều tilemaps nhỏ hơn mà bạn tạo và phá hủy khi chạy.
Kết luận: Các tilemaps khổng lồ nhưng chủ yếu trống không sử dụng nhiều RAM, nhưng chúng là một nút cổ chai kết xuất , ngay cả khi hầu hết không nằm trong chế độ xem camera.
Sau đó, tôi đã thử nghiệm với kịch bản này để tạo ra các tilemaps với kích thước nhất định:
public class TileTest : MonoBehaviour {
public Tile tile;
public int xSize;
public int ySize;
void Start () {
Tilemap tilemap = GetComponent<Tilemap>();
for (int x = 0; x < xSize; x++) {
for (int y = 0; y < ySize; y++) {
tilemap.SetTile(new Vector3Int(x, y, 0), tile);
}
}
}
}
Tôi đã sử dụng tập lệnh này để tạo bản đồ 8192x8192. Phải mất vài phút, nhưng khi kịch bản kết thúc, nó chạy ở tốc độ ổn định 95 khung hình / giây.
Kết luận: Bản đồ với hàng triệu ô xếp là khả thi, ít nhất là trên PC chơi game .