Giới hạn kích thước cho Unity 2017.2 Tilemap là gì?


17

Tôi đã tìm hiểu kỹ tài liệu về tính năng Tilemap của Unity 2017.2.

Unity có giới hạn số lượng gạch tối đa mà nó sẽ hỗ trợ cho một lưới tilemap cụ thể không?

Tôi biết rằng mỗi ô được khởi tạo một lần và được sử dụng để kết cấu các hình tứ giác trên lưới Tilemap khi chạy, vì vậy tôi đoán rằng giới hạn số lượng hình tứ giác cuối cùng phụ thuộc vào phần cứng và ít nhiều tùy ý cao.

Đó có phải là một giả định chính xác, hoặc có một nắp cứng trong động cơ?


1
Tại sao các downvote? Đây là một câu hỏi chính đáng.
Philipp

Câu trả lời:


25

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 .


5
Đây là câu trả lời hay nhất tôi từng thấy trong một thời gian dài. "Hãy cùng tìm hiểu!" viết kịch bản để búa hệ thống chạy máy tính kịch bản bắt đầu hút thuốc "Có vẻ như nó không giới hạn bạn!" Cảm ơn @Philipp!
Stephan

Tốc độ khung hình trong quá trình tạo thử nghiệm 8192 ^ 2 là gì? Tôi tò mò không biết bao nhiêu nỗ lực của thế hệ đã làm hỏng hệ thống.
Stephan

1
@Stephan Zero FPS. Như tôi đã nói, thế hệ mất vài phút. Và bởi vì tập lệnh này không rời khỏi nó Updatetrong suốt thế hệ, trò chơi và trình soạn thảo Unity đóng băng cho đến khi thế hệ kết thúc. Nếu bạn muốn trò chơi của mình phản ứng nhanh trong quá trình tạo bản đồ, hãy chuyển thế hệ sang một coroutine tạo ra một đoạn tại một thời điểm và mang lại kết quả giữa chúng.
Philipp

@Stephan Và nhân tiện, thể nhanh hơn khi sử dụng SetTilesBlock để đặt tất cả các ô cùng một lúc. Nhưng việc tạo ra bản đồ thử nghiệm nhanh chóng không phải là mục tiêu của tôi ở đây.
Philipp

Oh! duh, ok Vì một số lý do tôi đã nghĩ rằng nó sẽ làm gián đoạn. Đó là một suy nghĩ thú vị. Tôi sẽ phải chơi xung quanh với nó vào cuối tuần này. Dường như không có nhiều kết quả khủng khiếp về tính năng này vì nó rất mới. Cảm ơn đã phản hồi kỹ lưỡng! Nó đã thu hút được rất nhiều sự chú ý. Giúp hậu thế!
Stephan
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.