เราจะแก้ปัญหาความต้องการหน่วยความจำวิดีโอขนาดใหญ่ในเกม 2D ได้อย่างไร


40

เราจะแก้ปัญหาความต้องการหน่วยความจำวิดีโอขนาดใหญ่ในเกม 2D ได้อย่างไร


เรากำลังพัฒนาเกม 2D (Factorio) ใน allegro C / C ++ และเรากำลังเผชิญปัญหากับการเพิ่มความต้องการหน่วยความจำวิดีโอเมื่อเนื้อหาของเกมเพิ่มขึ้น

ขณะนี้เรารวบรวมข้อมูลทั้งหมดเกี่ยวกับรูปภาพที่จะถูกใช้ก่อนทำการครอบตัดรูปภาพเหล่านี้ให้มากที่สุดเท่าที่จะทำได้และจัดระเบียบให้เป็นแผนที่ขนาดใหญ่ให้แน่นที่สุด แผนที่เหล่านี้จะถูกเก็บไว้ในหน่วยความจำวิดีโอขนาดขึ้นอยู่กับข้อ จำกัด ของระบบ ปัจจุบันมักจะมี 2 ภาพสูงสุด 8192x8192 ดังนั้นพวกเขาต้องการหน่วยความจำวิดีโอ 256Mb ถึง 512Mb

ระบบนี้ใช้งานได้ดีสำหรับเราเช่นเดียวกับการปรับแต่งที่เหมาะสมและแยกเธรดการแสดงผลและการอัปเดตเราสามารถดึงภาพหลายหมื่นภาพบนหน้าจอใน 60 fps; เรามีวัตถุมากมายบนหน้าจอและการอนุญาตให้ซูมออกขนาดใหญ่เป็นข้อกำหนดที่สำคัญ เนื่องจากเราต้องการเพิ่มมากขึ้นอาจมีปัญหากับข้อกำหนดหน่วยความจำวิดีโอดังนั้นระบบนี้อาจไม่สามารถใช้งานได้

หนึ่งในสิ่งที่เราต้องการลองคือมีแผนที่หนึ่งที่มีรูปภาพที่พบบ่อยที่สุดและที่สองเป็นแคช ภาพจะถูกย้ายไปที่นั่นจากบิตแมปหน่วยความจำตามความต้องการ มีสองปัญหาเกี่ยวกับวิธีการนี้:

  1. รูปวาดจากบิตแมปหน่วยความจำไปยังบิตแมปวิดีโอช้าอย่างเจ็บปวดใน allegro
  2. มันเป็นไปไม่ได้ที่จะทำงานกับวิดีโอบิตแมปที่นอกเหนือจากเธรดหลักใน 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


1
แฟนตัวยงของเกมของคุณฉันสนับสนุนแคมเปญ Indiegogo ฉันดื่มสุราทุกสองสามเดือน เยี่ยมมากเลย! ฉันลบคำถาม "ซึ่งใช้เทคโนโลยี" ที่ปิดหัวข้อสำหรับเว็บไซต์ คำถามที่เหลือยังค่อนข้างกว้างถ้าคุณมีอะไรที่เจาะจงมากกว่านี้คุณควรพยายาม จำกัด ขอบเขตให้แคบลง
MichaelHouse

ขอบคุณสำหรับการสนับสนุน. ดังนั้นสถานที่ที่จะถามว่าเทคโนโลยีใดที่จะใช้แล้ว ฉันไม่ได้มองหาคำตอบที่มีคำแนะนำเครื่องยนต์เฉพาะ แต่ฉันไม่สามารถหาการเปรียบเทียบเชิงลึกของเครื่องยนต์ 2d และตรวจสอบด้วยตนเองทีละคนรวมถึงการทดสอบประสิทธิภาพและการใช้งานจะใช้เวลานาน
Marwin

ลองดูที่ด้านล่างของหน้านี้เพื่อดูสถานที่ที่จะถามคำถามเช่น "เทคโนโลยีที่ควรใช้" คุณมีคำถามที่ถูกต้องและสมเหตุสมผลทั้งหมดไม่ใช่แค่คำถามที่เราจัดการกับเว็บไซต์นี้ แม้ว่าคุณจะไม่ได้มองหาเอ็นจิ้นเฉพาะ แต่นั่นเป็นวิธีเดียวที่จะตอบคำถามที่ว่า "มีเทคโนโลยีใดบ้างที่ใช้ X" ใครบางคนสามารถตอบว่า "ใช่" และไม่ให้คำแนะนำสำหรับคนที่เฉพาะเจาะจง แต่นั่นก็ไม่เป็นประโยชน์ ขอให้โชคดีกับมัน!
MichaelHouse

2
คุณบีบอัดพื้นผิวของคุณหรือไม่?
GuyRT

3
@Marwin พื้นผิวที่ถูกบีบอัดอาจทำงานได้ดีกว่าพื้นผิวที่ไม่บีบอัดเนื่องจากมันลดแบนด์วิดท์หน่วยความจำที่จำเป็น (นี่เป็นจริงโดยเฉพาะอย่างยิ่งบนแพลตฟอร์มมือถือ คุณสามารถบันทึกหน่วยความจำจำนวนมากได้เพียงแค่บีบอัดพื้นผิวของคุณ จริงๆข้อเสียเพียงอย่างเดียวคือสิ่งประดิษฐ์ที่มีการแนะนำอย่างหลีกเลี่ยงไม่
GuyRT

คำตอบ:


17

เรามีกรณีที่คล้ายคลึงกับ RTS ของเรา (KaM Remake) ทุกยูนิตและบ้านเป็นสไปรท์ เรามีสไปรต์ 18,000 สำหรับหน่วยและบ้านและภูมิประเทศรวมถึงอีก 6,000 ~ สำหรับสีทีม (ใช้เป็นมาสก์) ยืดเยื้อเรามีตัวอักษรประมาณ 30,000 ตัวอักษรใช้

ดังนั้นจึงมีการเพิ่มประสิทธิภาพบางอย่างเมื่อเทียบกับ RGBA32 แผนที่ที่คุณใช้:

  • แบ่งสไปรต์ของคุณออกเป็นแผนที่ขนาดเล็กจำนวนมากก่อนและใช้ตามความต้องการตามที่อธิบายไว้ในคำตอบอื่น ๆ ที่ยังช่วยให้การใช้เทคนิคการเพิ่มประสิทธิภาพที่แตกต่างกันสำหรับแต่ละ Atlas เป็นรายบุคคล ฉันสงสัยว่าคุณจะมี RAM ที่สูญเปล่าน้อยกว่าเพราะเมื่อบรรจุพื้นผิวขนาดใหญ่ดังกล่าวมักจะมีพื้นที่ที่ไม่ได้ใช้ที่ด้านล่าง

  • ลองใช้พื้นผิวที่เป็นสี หากคุณใช้ตัวเคลือบเงาคุณสามารถ "ใช้" จานสีในรหัสเฉดสี

  • คุณอาจพิจารณาการเพิ่มตัวเลือกในการใช้RGB5_A1 แทน RGBA8 (หากตัวอย่างเงาของกระดานหมากรุกไม่เป็นผลสำหรับเกมของคุณ) หลีกเลี่ยง 8bit Alpha เมื่อเป็นไปได้และใช้รูปแบบ RGB5_A1 หรือเทียบเท่าที่มีความแม่นยำน้อยกว่า (เหมือน RGBA4) โดยจะใช้พื้นที่ครึ่งหนึ่ง

  • ตรวจสอบให้แน่ใจว่าคุณบรรจุสไปรต์แน่นเป็น atlases (ดูอัลกอริธึม Bin Bin) หมุนสไปรต์เมื่อจำเป็นและดูว่าคุณสามารถซ้อนมุมโปร่งใสสำหรับสไปรท์รูปสี่เหลี่ยมขนมเปียกปูนได้หรือไม่

  • คุณอาจลองใช้รูปแบบการบีบอัดฮาร์ดแวร์ (DXT, S3TC และอื่น ๆ ) - สามารถลดการใช้ RAM ได้อย่างมาก แต่ตรวจสอบการบีบอัดข้อมูล - ในบางภาพความแตกต่างอาจไม่สามารถสังเกตเห็นได้ (คุณสามารถใช้ตัวเลือกนี้ แต่ในบาง - ออกเสียงมาก รูปแบบการบีบอัดที่แตกต่างกันทำให้เกิดสิ่งประดิษฐ์ที่แตกต่างกันดังนั้นคุณอาจเลือกรูปแบบที่ดีที่สุดสำหรับสไตล์ศิลปะของคุณ

  • ดูแยกสไปรต์ขนาดใหญ่ (แน่นอนไม่ใช่ด้วยตนเอง แต่ภายในพื้นผิวของคุณ atlas packer) เป็นสไปรต์พื้นหลังแบบคงที่และสไปรต์ขนาดเล็กสำหรับชิ้นส่วนที่เคลื่อนไหว


2
+1 สำหรับการใช้ DXT มันเป็นสิ่งที่ดีมาก การบีบอัดที่ยอดเยี่ยมและใช้โดยตรงโดย GPU ดังนั้นค่าใช้จ่ายจึงน้อย

1
ฉันเห็นด้วยกับ dxt คุณอาจจะสอบถามการรองรับ DXT7 (ฮาร์ดแวร์ DX11 +) ซึ่งมีขนาดเท่ากับ DXT1 แต่คุณภาพสูงกว่า (ชัด) อย่างไรก็ตามคุณจะต้องมีพื้นผิวเป็นสองเท่า (หนึ่ง DXT7 และหนึ่ง DXT1) หรือบีบอัด / คลายในระหว่างการโหลด
Programmdude

5

ก่อนอื่นคุณต้องใช้แผนที่ที่มีขนาดเล็กและใหญ่ขึ้น พื้นผิวที่น้อยลงคุณจะมีการจัดการหน่วยความจำที่ยากและเข้มงวดมากขึ้น ฉันขอแนะนำขนาด Atlas ที่ 1024 ซึ่งในกรณีนี้คุณจะมีพื้นผิว 128 แทนที่จะเป็น 2 หรือ 2048 ซึ่งในกรณีนี้คุณจะมีพื้นผิว 32 ซึ่งคุณสามารถโหลดและยกเลิกการโหลดได้ตามต้องการ

เกมส่วนใหญ่ทำการจัดการทรัพยากรนี้โดยมีขอบเขตระดับในขณะที่หน้าจอการโหลดจะแสดงทรัพยากรทั้งหมดที่ไม่ต้องการอีกต่อไปในระดับถัดไปได้รับการขนถ่ายและทรัพยากรที่จำเป็นต้องได้รับการโหลด

อีกตัวเลือกหนึ่งคือการโหลดตามความต้องการซึ่งจำเป็นถ้าขอบเขตระดับไม่ต้องการหรือแม้แต่ระดับเดียวก็ใหญ่เกินไปที่จะใส่ลงในหน่วยความจำ ในกรณีนี้เกมจะพยายามทำนายสิ่งที่ผู้เล่นจะเห็นในอนาคตและโหลดในพื้นหลัง (ตัวอย่างเช่น: สิ่งที่อยู่ห่างจากผู้เล่น 2 หน้าจอ) ในขณะเดียวกันสิ่งที่ไม่ได้ใช้อีกต่อไปเป็นเวลานานจะถูกยกเลิกการโหลด

อย่างไรก็ตามมีปัญหาหนึ่งเกิดอะไรขึ้นเมื่อมีสิ่งที่ไม่คาดคิดเกิดขึ้นเกมไม่สามารถคาดการณ์ได้

  • พาเนลและแสดงหน้าจอการโหลดจนกว่าจะโหลดสิ่งที่จำเป็นทั้งหมด สิ่งนี้อาจทำให้ประสบการณ์หยุดชะงัก
  • มีสไปรต์ความละเอียดต่ำสำหรับทุกสิ่งที่โหลดไว้ดำเนินการต่อเกมและแทนที่พวกเขาทันทีที่สไปรต์ความละเอียดสูงโหลดเสร็จแล้ว นี่อาจดูถูกสำหรับผู้เล่น
  • ทำให้ส่งผลกระทบต่อการเล่นเกมและชะลอกิจกรรมตราบเท่าที่จำเป็น เช่นอย่าวางไข่ศัตรูนั้นจนกว่าจะโหลดกราฟิก อย่าเปิดหีบสมบัติก่อนที่จะโหลดกราฟิกทั้งหมดสำหรับของขวัญนั้นเป็นต้น

ฉันได้เพิ่มข้อกำหนดบางอย่างที่ฉันข้ามไป หน้าจอการโหลดหรือการโหลดใด ๆ เป็นไปไม่ได้ ทุกอย่างจะต้องทำในพื้นหลังหรือระหว่างแต่ละเห็บ (น้อยกว่า 15ms สำหรับแต่ละคน) ในขณะที่มีเวลาส่วนใหญ่มักจะใช้แล้วโดยการเตรียมการแสดงผลและการปรับปรุงเกม อย่างไรก็ตามการแยกออกเป็นส่วนเล็ก ๆ อาจเพิ่มความยืดหยุ่นในการสลับมันจะเร็วขึ้นอย่างแน่นอน คำถามคือมันกระทบกับประสิทธิภาพมากน้อยแค่ไหนในการเรนเดอร์เนื่องจากการสลับบิตแมปต้นฉบับในขณะที่การวาดทำให้การเรนเดอร์ช้าลง ฉันจะต้องทำการวัดที่แน่นอนเพื่อพูดเท่าไหร่
Marwin

@ มาร์วินมีผลกระทบต่อประสิทธิภาพใช่ แต่เนื่องจากคุณกำลังติดต่อกับ 2D คุณควรอยู่ห่างจากมันกลายเป็นปัญหา หากการเรนเดอร์ใช้เวลา 1ms ต่อเฟรมและการใช้พื้นผิวขนาดเล็กก็จะใช้เวลา 2 มิลลิวินาทีซึ่งก็ยังเร็วพอที่จะเข้าถึง 60 FPS ที่สอดคล้องกัน (16ms)
API-Beast

@Marwin Multiplayer นั้นเป็นธุรกิจที่มีเล่ห์เหลี่ยมมักจะเป็นเสมอ คุณอาจจะต้องประนีประนอมที่นั่น คุณจะมี stutters เพียงเพราะคุณต้องถ่ายโอนข้อมูลผ่านทางอินเทอร์เน็ตแพคเกจจะหายไป pings อาจขัดขวางทันที ฯลฯ Stutter นั้นหลีกเลี่ยงไม่ได้ดังนั้นสิ่งที่สำคัญกว่าคือการทำให้รูปแบบเครือข่ายทนต่อการพูดติดอ่าง รู้ว่าต้องรอเมื่อไหร่และจะรอผู้เล่นคนอื่นได้อย่างไร
API-Beast

สวัสดีพูดติดอ่างเป็นเกือบจะหลีกเลี่ยงได้ในหลายเรากำลังทำงานในพื้นที่ว่าในขณะนี้และผมเชื่อว่าเรามีแผนการที่ดี ฉันสามารถโพสต์และตอบคำถามของฉันเองที่อธิบายสิ่งที่เราค้นคว้าในรายละเอียดในภายหลัง :) มันอาจจะแปลกใจ แต่เวลาเรนเดอร์เป็นปัญหาจริงๆ เราได้ทำการปรับแต่งมากมายเพื่อให้การเรนเดอร์เร็วขึ้น ตอนนี้การเรนเดอร์หลักจะทำในเธรดแยกต่างหาก อย่าลืมว่าในการซูมสูงสุดผู้เล่นสามารถเห็นสไปรท์นับหมื่นในเวลาเดียวกันได้อย่างง่ายดาย และเราต้องการอนุญาตให้ระดับการซูมสูงขึ้นในภายหลัง
Marwin

@Marwin อืมวัตถุ 10k โดยปกติแล้วจะไม่เป็นปัญหาสำหรับพีซีหรือแล็ปท็อปสมัยใหม่หากคุณใช้แบทช์ที่เหมาะสมคุณสร้างโปรไฟล์การแสดงผลของคุณหรือไม่
API-Beast

2

ว้าวนั่นเป็นจำนวนมากของสไปรต์ภาพเคลื่อนไหวที่สร้างจากแบบจำลอง 3 มิติที่ฉันเข้าใจ

คุณไม่ควรสร้างเกมนี้ในแบบ 2D จริงๆ เมื่อคุณมีมุมมองคงที่สิ่งที่ตลกเกิดขึ้นคุณสามารถผสมผสานสไปรต์และพื้นหลังที่แสดงผลล่วงหน้ากับโมเดล 3 มิติที่แสดงผลสดซึ่งต่อเนื่องซึ่งบางเกมใช้กันอย่างหนัก หากคุณต้องการภาพเคลื่อนไหวที่ดีที่ดูเหมือนเป็นวิธีที่เป็นธรรมชาติที่สุด รับเอนจิ้น 3 มิติกำหนดค่าให้ใช้เปอร์สเปคทีฟไอโซโทปและเรนเดอร์วัตถุที่คุณยังคงใช้สไปรต์เป็นพื้นผิวเรียบ ๆ ที่เรียบง่ายพร้อมรูปภาพบนพวกมัน และคุณสามารถใช้การบีบอัดพื้นผิวด้วยเอ็นจิ้น 3 มิติได้เพียงก้าวเดียว

ฉันไม่คิดว่าการโหลดและการขนถ่ายจะทำอะไรมากมายสำหรับคุณเพราะคุณสามารถมีทุกอย่างบนหน้าจอได้ในเวลาเดียวกัน


2

ขั้นแรกให้ค้นหารูปแบบพื้นผิวที่มีประสิทธิภาพที่สุดที่คุณสามารถทำได้ในขณะที่ยังคงมีความสุขกับภาพของเกมไม่ว่าจะเป็น RGBA4444 หรือการบีบอัด DXT เป็นต้นหากคุณไม่พอใจกับสิ่งประดิษฐ์ที่สร้างขึ้นเป็นภาพบีบอัด DXT alpha การทำให้ภาพไม่โปร่งใสโดยใช้การบีบอัด DXT1 สำหรับสีรวมกับพื้นผิวปิดบังระดับสีเทา 4 หรือ 8 บิตสำหรับอัลฟ่า ฉันคิดว่าคุณจะอยู่บน RGBA8888 สำหรับ GUI

ฉันสนับสนุนการแบ่งสิ่งต่าง ๆ ออกเป็นพื้นผิวขนาดเล็กโดยใช้รูปแบบใดก็ได้ที่คุณตัดสินใจ กำหนดรายการที่อยู่บนหน้าจอเสมอและดังนั้นจึงถูกโหลดอยู่เสมอนี่อาจเป็นภูมิประเทศและแผนที่ของ GUI จากนั้นฉันจะแยกรายการที่เหลือซึ่งมีการแสดงร่วมกันให้มากที่สุด ฉันไม่คิดว่าคุณจะเสียประสิทธิภาพมากเกินไปแม้ว่าจะใช้การโทรแบบดึงได้ 50-100 ครั้งบนพีซี แต่แก้ไขให้ถูกต้องถ้าฉันผิด

ขั้นตอนต่อไปคือการสร้างเวอร์ชัน mipmap ของพื้นผิวเหล่านี้ตามที่มีคนกล่าวไว้ข้างต้น ฉันจะไม่เก็บไว้ในไฟล์เดียว แต่แยกกัน ดังนั้นคุณจะจบลงด้วยแต่ละไฟล์ 1024x1024, 512x512, 256x256 และฉันจะทำเช่นนี้จนกว่าจะถึงรายละเอียดที่ต่ำที่สุดที่ฉันต้องการจะแสดง

ตอนนี้คุณมีพื้นผิวแยกจากกันแล้วคุณสามารถสร้างระบบรายละเอียดระดับ (LOD) ที่โหลดพื้นผิวสำหรับระดับการซูมปัจจุบันและยกเลิกการโหลดพื้นผิวหากไม่ได้ใช้ ไม่ได้ใช้พื้นผิวหากรายการที่แสดงนั้นไม่ได้อยู่บนหน้าจอหรือไม่จำเป็นต้องใช้ระดับการซูมปัจจุบัน ลองโหลดเท็กซ์เจอร์ลงใน RAM วิดีโอในเธรดแยกต่างหากกับเธรดการอัปเดต / แสดงผล คุณสามารถแสดงพื้นผิว LOD ที่ต่ำที่สุดจนกว่าจะโหลดสิ่งที่ต้องการ บางครั้งสิ่งนี้อาจส่งผลให้มองเห็นสลับระหว่างรายละเอียดต่ำ / พื้นผิวรายละเอียดสูง แต่ฉันคิดว่านี่จะเป็นเฉพาะเมื่อคุณทำการซูมออกอย่างรวดเร็วมากและในขณะที่เคลื่อนที่ข้ามแผนที่ คุณสามารถทำให้ระบบอัจฉริยะโดยพยายามโหลดล่วงหน้าที่คุณคิดว่าบุคคลนั้นจะย้ายหรือซูมเข้าและโหลดให้มากที่สุดเท่าที่จะทำได้ภายในข้อ จำกัด หน่วยความจำปัจจุบัน

นั่นคือสิ่งที่ฉันจะทดสอบเพื่อดูว่ามันช่วยได้ไหม ฉันจินตนาการว่าจะมีระดับการซูมที่สูงมากคุณจะต้องใช้ระบบ LOD อย่างหลีกเลี่ยงไม่ได้


1

ฉันเชื่อว่าวิธีที่ดีที่สุดคือการแยกพื้นผิวในไฟล์จำนวนมากและโหลดตามความต้องการ อาจเป็นปัญหาของคุณได้ว่าคุณกำลังพยายามโหลดพื้นผิวขนาดใหญ่ที่คุณต้องการสำหรับฉาก 3 มิติที่สมบูรณ์และคุณใช้ Allegro สำหรับเรื่องนั้น

สำหรับการย่อขนาดใหญ่ที่คุณต้องการใช้คุณต้องใช้ mipmaps Mipmaps เป็นพื้นผิวที่มีความละเอียดต่ำกว่าซึ่งใช้เมื่อวัตถุอยู่ห่างจากกล้องมากพอ ซึ่งหมายความว่าคุณสามารถบันทึก 8192x8192 เป็น 4096x4096 และอีก 2048x2048 และต่อไปและคุณสลับไปที่ความละเอียดต่ำลงยิ่งมีขนาดเล็กลงคุณจะเห็นสไปรท์บนหน้าจอ คุณสามารถบันทึกเป็นพื้นผิวแยกต่างหากหรือปรับขนาดเมื่อโหลด (แต่การสร้าง mipmaps ระหว่างรันไทม์จะเพิ่มเวลาในการโหลดเกมของคุณ)

ระบบการจัดการที่เหมาะสมจะโหลดไฟล์ตามที่ต้องการและปล่อยทรัพยากรเมื่อไม่มีใครใช้งานรวมถึงสิ่งอื่น ๆ การจัดการทรัพยากรเป็นหัวข้อสำคัญในการพัฒนาเกมและคุณกำลังลดการจัดการของคุณลงในการทำแผนที่พิกัดอย่างง่ายไปยังพื้นผิวเดียวซึ่งใกล้เคียงกับการไม่มีการจัดการเลย


1
เมื่อแยกไฟล์คุณหมายถึงไฟล์บน HDD หรือไม่ ฉันคิดว่าฉันสามารถเก็บรูปภาพทั้งหมดบน RAM สำหรับ starters และแม้แต่การคัดลอกจาก memory-bitmap ไปยัง video-bitmap นั้นช้าเกินไปดังนั้นการโหลดจาก HDD จะช้าลงอย่างแน่นอน การมี mimpaps จะไม่ช่วยฉันเพราะฉันยังคงมีความละเอียดที่ใหญ่ที่สุดใน vram
Marwin

ใช่คุณไม่ต้องโหลดทุกอย่างคุณต้องโหลดเฉพาะสิ่งที่คุณใช้ เมื่อใดก็ตามที่คุณต้องการเปลี่ยนพิกเซลบนพื้นผิวที่โหลดใน VRAM ระบบจะต้องย้ายพื้นผิวทั้งหมดไปที่ RAM เพียงเพื่อให้คุณปรับเปลี่ยนพิกเซลเดียวแล้วย้ายกลับไปที่ VRAM หากคุณมีทุกอย่างในพื้นผิวเดียวสิ่งนี้เกี่ยวข้องกับการย้าย 256 MB ไปยัง RAM จากนั้นกลับสู่ VRAM อีกครั้งซึ่งล็อคคอมพิวเตอร์ทั้งเครื่อง การแยกมันไว้ในไฟล์และพื้นผิวต่างกันเป็นวิธีที่ถูกต้องในการทำ
Pablo Ariel

การปรับเปลี่ยนพื้นผิวที่ก่อให้เกิดการคัดลอกไปยังหน่วยความจำและกลับไปที่ ram ใช้สำหรับบิตแมปแบบต่อเนื่องเท่านั้นแคชอาจจะไม่ถูกตั้งค่าเป็นแบบถาวรข้อเสียเพียงอย่างเดียวคือต้องรีเฟรชเมื่อจอแสดงผลหายไป / พบ แต่ในระบบเสียงดนตรีแม้การลอกแบบง่าย ๆ ของรูปภาพขนาด 640X480 จาก vram ไปยังบิตแมปหน่วยความจำ (บันทึกตัวอย่างเกม) ใช้เวลาค่อนข้างนาน
Marwin

1
ฉันต้องมีทุกอย่างในพื้นผิวขนาดใหญ่เพื่อเพิ่มประสิทธิภาพการวาดภาพเองโดยไม่ต้องมีผลกระทบของการสลับบริบทในแต่ละสไปรต์ช้าลงวิธีการเรนเดอร์อย่างน้อยที่สุดใน allegro อย่าเข้าใจฉันผิด แต่คุณเป็นกัปตันที่ชัดเจนในที่นี้เพราะคุณแนะนำให้ฉันทำสิ่งที่ฉันขอในคำถามนี้
Marwin

1
การมีพื้นผิวแบบ mip-mapped เหล่านี้ในไฟล์ที่แตกต่างกันจะบังคับให้ฉันโหลดแผนที่ทั้งหมดเมื่อผู้เล่นซูมเข้าเนื่องจากเครื่องยนต์มี ms เพียงไม่กี่หน่วยสำหรับส่วนใหญ่ฉันไม่เห็นวิธีการทำ
Marwin

0

ฉันขอแนะนำให้สร้างไฟล์แอตลาสเพิ่มเติมที่สามารถบีบอัดด้วย zlib และสตรีมจากการบีบอัดสำหรับแต่ละแอตลาสและโดยการมีไฟล์แอตลาสและไฟล์ขนาดเล็กลงคุณสามารถ จำกัด จำนวนข้อมูลภาพที่ใช้งานในหน่วยความจำวิดีโอ นอกจากนี้ให้ใช้กลไกบัฟเฟอร์สามชั้นเพื่อให้คุณเตรียมกรอบการวาดแต่ละเฟรมให้เร็วขึ้นและมีโอกาสที่จะทำให้เสร็จเร็วขึ้นเพื่อไม่ให้ Stutters ไม่ปรากฏบนหน้าจอ

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