เราจะแก้ปัญหาความต้องการหน่วยความจำวิดีโอขนาดใหญ่ในเกม 2D ได้อย่างไร
เรากำลังพัฒนาเกม 2D (Factorio) ใน allegro C / C ++ และเรากำลังเผชิญปัญหากับการเพิ่มความต้องการหน่วยความจำวิดีโอเมื่อเนื้อหาของเกมเพิ่มขึ้น
ขณะนี้เรารวบรวมข้อมูลทั้งหมดเกี่ยวกับรูปภาพที่จะถูกใช้ก่อนทำการครอบตัดรูปภาพเหล่านี้ให้มากที่สุดเท่าที่จะทำได้และจัดระเบียบให้เป็นแผนที่ขนาดใหญ่ให้แน่นที่สุด แผนที่เหล่านี้จะถูกเก็บไว้ในหน่วยความจำวิดีโอขนาดขึ้นอยู่กับข้อ จำกัด ของระบบ ปัจจุบันมักจะมี 2 ภาพสูงสุด 8192x8192 ดังนั้นพวกเขาต้องการหน่วยความจำวิดีโอ 256Mb ถึง 512Mb
ระบบนี้ใช้งานได้ดีสำหรับเราเช่นเดียวกับการปรับแต่งที่เหมาะสมและแยกเธรดการแสดงผลและการอัปเดตเราสามารถดึงภาพหลายหมื่นภาพบนหน้าจอใน 60 fps; เรามีวัตถุมากมายบนหน้าจอและการอนุญาตให้ซูมออกขนาดใหญ่เป็นข้อกำหนดที่สำคัญ เนื่องจากเราต้องการเพิ่มมากขึ้นอาจมีปัญหากับข้อกำหนดหน่วยความจำวิดีโอดังนั้นระบบนี้อาจไม่สามารถใช้งานได้
หนึ่งในสิ่งที่เราต้องการลองคือมีแผนที่หนึ่งที่มีรูปภาพที่พบบ่อยที่สุดและที่สองเป็นแคช ภาพจะถูกย้ายไปที่นั่นจากบิตแมปหน่วยความจำตามความต้องการ มีสองปัญหาเกี่ยวกับวิธีการนี้:
- รูปวาดจากบิตแมปหน่วยความจำไปยังบิตแมปวิดีโอช้าอย่างเจ็บปวดใน allegro
- มันเป็นไปไม่ได้ที่จะทำงานกับวิดีโอบิตแมปที่นอกเหนือจากเธรดหลักใน allegro ดังนั้นจึงไม่สามารถใช้งานได้จริง
ต่อไปนี้เป็นข้อกำหนดเพิ่มเติมบางประการที่เรามี:
- เกมดังกล่าวจะต้องถูกกำหนดไว้ดังนั้นปัญหาด้านประสิทธิภาพ / เวลาในการโหลดจะไม่สามารถเปลี่ยนแปลงสถานะของเกม
- เกมดังกล่าวเป็นแบบเรียลไทม์และเร็ว ๆ นี้จะเป็นผู้เล่นหลายคนเช่นกัน เราจำเป็นต้องหลีกเลี่ยงแม้แต่การพูดติดอ่างที่เล็กที่สุดในค่าใช้จ่ายทั้งหมด
- เกมส่วนใหญ่เป็นโลกที่เปิดกว้างอย่างต่อเนื่อง
การทดสอบประกอบด้วยการวาดภาพสไปรต์ 10,000 ชุดเป็นชุดขนาดตั้งแต่ 1x1 ถึง 300x300 หลายครั้งสำหรับการตั้งค่าทุกครั้ง ฉันทำการทดสอบกับ Nvidia Geforce GTX 760
- วิดีโอบิตแมปเป็นวิดีโอการวาดภาพบิตแมปใช้เวลา 0.1us ต่อสไปรต์เมื่อบิตแมปต้นฉบับไม่เปลี่ยนแปลงระหว่างบิตแมปแต่ละรายการ (ตัวแปรแอตลาส) ขนาดไม่สำคัญ
- วิดีโอบิตแมปเป็นการวาดบิตแมปวิดีโอในขณะที่บิตแมปต้นฉบับถูกสลับไปมาระหว่างการวาด (ตัวแปรที่ไม่ใช่แผนที่) ใช้เวลา 0.56us ต่อสไปรต์ ขนาดไม่สำคัญเช่นกัน
- บิตแมปหน่วยความจำในการวาดบิตแมปวิดีโอนั้นน่าสงสัยจริงๆ ขนาดจาก 1x1 ถึง 200x200 ใช้ 0.3us ต่อบิตแมปดังนั้นจึงไม่ช้าอย่างน่ากลัว สำหรับขนาดที่ใหญ่ขึ้นเวลาเริ่มเพิ่มขึ้นอย่างมากที่ 9us สำหรับ 201x201 ถึง 3116us สำหรับ 291x291
การใช้แอตลาสเพิ่มประสิทธิภาพโดยปัจจัยที่มากกว่า 5 ถ้าฉันมี 10 มิลลิวินาทีสำหรับการเรนเดอร์ด้วยแอตลาสฉัน จำกัด 100,000 สไปรต์ต่อเฟรมและถ้าไม่มีก็ จำกัด 20,000 สไปรต์ นี่จะเป็นปัญหา
ฉันยังพยายามหาวิธีทดสอบการบีบอัดบิตแมปและรูปแบบบิตแมป 1bpp สำหรับเงา แต่ฉันไม่สามารถหาวิธีการทำเช่นนี้ใน allegro