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