ขนาด จำกัด ของ Unity 2017.2 Tilemap คือเท่าใด


17

ฉันกำลังขุดอ่านเอกสารเกี่ยวกับคุณสมบัติ Tilemap ของ Unity 2017.2

Unity จำกัด จำนวนสูงสุดของการเรียงแบบต่อเนื่องที่จะรองรับการเรียงต่อกันแบบเรียงต่อกันหรือไม่?

ฉันรู้ว่าแต่ละไทล์จะถูกสร้างอินสแตนซ์หนึ่งครั้งและเคยใช้ประกอบฉากล่ามใน Tilemap mesh ที่รันไทม์ดังนั้นฉันเดาว่าขีด จำกัด จำนวน quad quad นั้นขึ้นอยู่กับฮาร์ดแวร์ในที่สุดและสูงหรือน้อยก็ได้

นั่นเป็นข้อสันนิษฐานที่ถูกต้องหรือมีฝาปิดที่แข็งอยู่ในเครื่องยนต์หรือไม่?


1
ทำไมต้องลงคะแนน นี่เป็นคำถามที่ถูกกฎหมาย
ฟิลิปป์

คำตอบ:


25

RAM ของคุณเป็นขีด จำกัด

ทำการทดสอบต่อไปนี้บนระบบที่มีข้อกำหนดเหล่านี้:

  • Intel i5-6600
  • RAM 16 GB
  • 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 นั้นใช้ RAM สูงกว่า 11 GB เล็กน้อยตามตัวจัดการงาน

แต่แผนที่เบาบางล่ะ

นี่คือสคริปต์อื่นที่วางไทล์เดี่ยวที่เพิ่มพิกัด 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 อยู่ในระดับต่ำเมื่อฉันลบสคริปต์ในขณะที่เกมทดสอบกำลังทำงานอยู่ ดังนั้นการชะลอตัวนี้ไม่ได้มาจากการเปลี่ยน tilemap มันเป็นเพียงแค่การแสดงผล ดังนั้นเมื่อคุณต้องการสร้างเกมโอเพ่นเวิร์ลที่มีขนาดใหญ่มากคุณอาจต้องใช้ไทล์แผนที่ขนาดเล็กหลาย ๆ อันที่คุณสร้างและทำลายที่รันไทม์

สรุป: แผนที่ย่อยขนาดใหญ่ แต่ว่างเปล่าส่วนใหญ่จะไม่ใช้ RAM มากนัก แต่เป็นคอขวดที่ใช้ในการเรนเดอร์แม้ว่าส่วนใหญ่จะไม่อยู่ในวิวพอร์ตของกล้องก็ตาม

จากนั้นฉันทดสอบสคริปต์นี้ซึ่งสร้าง tilemaps ตามขนาดที่กำหนด:

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 จะหยุดจนกว่าการสร้างจะเสร็จสิ้น หากคุณต้องการให้เกมของคุณตอบสนองในระหว่างการสร้างแผนที่ให้ย้ายการสร้างไปยัง coroutine ซึ่งสร้างหนึ่งชิ้นในแต่ละครั้งและให้ผลตอบแทนระหว่างพวกเขา
ฟิลิปป์

@Stephan และมันอาจจะเร็วกว่าที่จะใช้SetTilesBlockเพื่อตั้งค่าไทล์ทั้งหมดในครั้งเดียว แต่การสร้างแผนที่ทดสอบอย่างรวดเร็วไม่ใช่เป้าหมายของฉันที่นี่
ฟิลิปป์

Oh! ดูโอเค ด้วยเหตุผลบางอย่างฉันคิดว่ามันจะขัดจังหวะ นั่นเป็นความคิดที่น่าสนใจ ฉันจะต้องเล่นกับมันในสุดสัปดาห์นี้ ดูเหมือนจะไม่มีผลลัพธ์ที่น่ากลัวมากมายในฟีเจอร์นี้ตั้งแต่มันใหม่ ขอบคุณสำหรับการตอบสนองอย่างละเอียด! มันได้รับความสนใจเป็นอย่างมาก ช่วยลูกหลาน!
เตฟาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.