Яка обмеження розміру для типової карти Unity 2017.2?


17

Я переглядав документацію про функцію Tilemap Unity 2017.2.

Чи обмежує Unity максимальну кількість плиток, яку він підтримуватиме для певної сітки карти кави?

Я знаю, що кожна плитка інстанціюється один раз і використовується для текстурування квадратиків на сітці Tilemap під час виконання, тому я б здогадався, що обмеження кількості квадратиків сітки в кінцевому підсумку залежить від обладнання, і більш-менш довільно висока.

Це правильне припущення, або в двигуні є жорстка кришка?


1
Чому потік? Це законне питання.
Філіп

Відповіді:


25

Ваша ОЗУ - це ваша межа .

Наступні випробування були виконані в системі з цими характеристиками:

  • Intel i5-6600
  • 16 Гб оперативної пам’яті
  • NVIDIA GeForce GTX 1070
  • Windows 7 Home Premium

Ось сценарій, який я запустив, який вирощує карту плиток, заповнюючи її однією плиткою (32x32 пікселів). Метод Grow()додає ще один стовпець та інший рядок до поточної карти. Метод називається 100 разів за кожне оновлення.

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++;
    }
}

Через кілька хвилин у мого комп’ютера закінчилося пам’ять, і Unity розбився. На той момент це було на 8400x8400 (70 мільйонів) плиток, і Unity.exe витрачав трохи вище 11 ГБ оперативної пам’яті, за словами менеджера завдань.

Ну а що з розрідженими картами?

Ось інший сценарій, який розмістив одну плитку при збільшенні координат x і y з кроком 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;
    }    
}

Сліди пам’яті Unity.exe насправді зросли дуже мало, що натякає на те, що порожні клітини плитки не потребують майже жодної оперативної пам’яті. Однак FPS продовжував падати, коли набір плиток зростала. Він досягав 60 Fps при 30000x30000, 30 Fps при 60000x60000 і 15 Fps при 90000x90000. Fps залишився таким низьким, коли я видалив сценарій, поки тестова гра працювала. Таким чином, це уповільнення не було від зміни файлової карти. Це було просто з його надання. Отже, коли ви хочете створити справді величезну гру з відкритим світом, можливо, вам доведеться використовувати кілька менших плиткових карт, які ви створюєте та знищуєте під час виконання.

Висновки: Величезні, але в основному порожні карти плиток не використовують багато оперативної пам’яті, але вони є вузьким місцем візуалізації , навіть якщо більшість із них не знаходиться у вікні перегляду камери.

Потім я експериментував із цим сценарієм, який генерує табличні карти із заданим розміром:

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);
            }
        }
    } 
}

Цей сценарій я використовував для створення карти 8192x8192. Минуло кілька хвилин, але коли сценарій був закінчений, він працював зі стійкими 95 Fps.

Висновок: Карти з мільйонами плиток можливі, принаймні, на ігрових ПК .


5
Це найкрасивіша відповідь, яку я бачив за довгий час. "Давай дізнаємось!" пише сценарії, щоб забити систему, запускаючи сценарій, комп'ютер починає курити "Схоже, це не обмежує вас!" Дякую @Philipp!
Стефан

Який був кадр під час генерації тесту 8192 ^ 2? Мені цікаво, скільки зусиль покоління завалило систему.
Стефан

1
@Stephan Zero FPS. Як я вже сказав, покоління займає кілька хвилин. А оскільки цей сценарій не залишає його Update-методом під час покоління, гра та редактор Unity замерзають, поки покоління не закінчиться. Якщо ви хочете, щоб ваша гра відповідала під час генерації карт, перемістіть покоління на підпрограму, яка генерує по одному шматку за один раз і врожаєм між ними.
Філіп

@Stephan І, до речі, може бути швидше використовувати SetTilesBlock для встановлення всіх плиток одночасно. Але генерування тестової карти не було моєю метою тут.
Філіп

Ой! да, добре. Я чомусь думав, що це перерве. Це цікава думка. Мені доведеться пограти з цим у вихідні. Здається, не існує дуже багато результатів щодо цієї функції, оскільки вона стала такою новою. Дякуємо за ретельну відповідь! Це вже привернуло багато уваги. Допомагаємо нащадкам!
Стефан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.