ฉันกำลังพัฒนาเกม 2D และฉันมีสไปรต์มากมาย ฉันใช้ภาพเคลื่อนไหวและโมเดล 3 มิติเพื่อแสดงเป็น 2D เพื่อให้พวกเขาเห็นว่า "Fallout" หรือ "Diablo" นอกจากนี้ยังง่ายกว่าการวาดด้วยมือฮ่า ๆ
ฉันต้องลดอัตราเฟรมลงเหลือ 15 เฟรมต่อวินาทีซึ่งต่ำที่สุดที่ฉันสามารถลดได้โดยไม่ทำให้พวกเขาดูขาด ๆ หาย ๆ อย่างไรก็ตามมันเป็นเรื่องน่าเศร้าเนื่องจากมี 24 เฟรมที่ดูราบรื่น
มีสองเหตุผลที่ฉันทำสิ่งนี้:
1) ลดพื้นที่ HDD ยิ่งภาพน้อยลงเท่าไหร่เกมของฉันก็ยิ่งเล็กลงเท่านั้น
2) ลดปริมาณการใช้ RAM ยิ่งฉันโหลดภาพน้อยลงเท่าไหร่ฉันก็ยิ่งมีแนวโน้มที่จะหลีกเลี่ยงปัญหาที่ทำให้เกิดข้อ จำกัด RAM ของฉันมากขึ้นเท่านั้น
อย่างไรก็ตามหากมีวิธีการบีบอัดภาพในพื้นที่ HDD และ RAM ฉันจะทำเช่นนั้น ฉันได้ทำการทดสอบมาก่อนและส่วนใหญ่ไม่ได้รับการเปลี่ยนแปลงคุณภาพใด ๆ เมื่อให้จาก RGBA8888 เป็น RGBA5555 และมีการเข้าชมเพียงเล็กน้อยเมื่อแปลงเป็น RGBA4444 ในโปรแกรม TexturePacker ของฉัน ฉันไม่ได้ทำเช่นนี้ในขณะนี้เนื่องจาก SFML ดูเหมือนว่าจะใช้หน่วยความจำในปริมาณเท่ากันไม่ว่าจะเป็นรูปภาพ. PNG ประเภทใด ฉันค้นหาการค้นคว้าวิธีโหลดมันแตกต่างกัน แต่ไม่พบสิ่งใดในหัวข้อ
ฉันได้อ่านมากเกี่ยวกับวิธีจัดการกับวิดีโอเกม 2 มิติ ฉันทามติเป็นอย่างยิ่ง: จัด Sprite ของคุณลงใน Texture Bigger เพื่อประสิทธิภาพที่ยอดเยี่ยม! ดังนั้นฉันจึงบรรจุสไปรต์ตัวจิ๋วของฉันไปไว้ในสไปรต์ชีตที่ใหญ่กว่ามากโดยใช้ TexturePacker
อย่างไรก็ตามฉันวางแผนที่จะมีแอนิเมชั่น 10-15 ตัวต่อตัวละคร 5 ทิศทางในการย้ายและ 15-40 เฟรมต่อภาพเคลื่อนไหว (อาจเป็นค่าเฉลี่ย 24) ด้วยภาพเคลื่อนไหว 15 ภาพ, 5 ทิศทางและค่าเฉลี่ย 24 เฟรมต่อภาพเคลื่อนไหว; นั่นคือ 1800 แต่ละเฟรมต่อตัวละคร หากบรรจุในแผ่นสไปรต์นั่นเป็นเพียง 75 ภาพแทน (หนึ่งแผ่นสไปรต์ต่อภาพเคลื่อนไหวต่อทิศทาง 15 * 5)
สำหรับตัวละครบอสตัวใหญ่ในเกมฉันไม่สามารถใช้สไปรต์ชีตและต้องเขียนโปรแกรมเพื่อโหลดภาพทีละภาพ ฉันไม่ทราบว่าฉันสามารถทำสิ่งนี้เพื่อการแสดงได้หรือไม่
สำหรับตัวละครฉันเก็บไว้ในสไปรต์แผ่น สำหรับตัวละครเดียวที่เดินไปรอบ ๆ ดูเหมือนว่ามันจะได้ผลเกือบตลอดเวลา อย่างไรก็ตามฉันเชื่อว่ารหัสที่ไม่ดีของฉันที่สลับพื้นผิวแทนการโหลดพื้นผิวทั้งหมดสำหรับตัวละครนั้นล่วงหน้า
ถ้าฉันจะโหลดพื้นผิวล่วงหน้ามันสมเหตุสมผลสำหรับแผ่นผีสาง ฉันแค่คิดว่ามันเป็นความคิดที่ดีที่จะโหลดภาพขนาดเล็ก 1800 ภาพสำหรับตัวละครแต่ละตัว
อย่างไรก็ตามฉันนึกภาพการสตรีมเข้าและออกจากหน่วยความจำทีละครั้งจะเร็วมากดังนั้นฉันจะต้องมีเพียงภาพเดียวในหน่วยความจำในคราวเดียว นี่ไม่ได้หมายความว่าในเวลาใดก็ตามฉันจะให้ตัวละครแต่ละตัวกินเนื้อที่เพียงไม่กี่ KB แทนที่จะเป็น 45 + MB?
ฉันคิดว่าสิ่งนี้จะฆ่าการแสดงของฉันเนื่องจากการสตรีมจะต้องรวดเร็วอย่างไม่น่าเชื่อ (15 ภาพที่จะเข้าและออกจากหน่วยความจำและการเรนเดอร์ต่อวินาที) และแม้ว่าภาพจะมีขนาดเล็กมาก ลงในหน่วยความจำแทน แต่ฉันจะต้องเขียนโค้ดระบบเรนเดอร์ที่มีภาพเหมือนภาพเดียวสำหรับตัวละครที่ใหญ่กว่าของฉัน
ฉันทดลองมาแล้ว แต่มันไม่ใช่กระบวนการง่ายๆ โดยเฉพาะอย่างยิ่งความจริงที่ฉันกำลังทำงานในส่วนอื่น ๆ ของเกมเอ็นจิ้นที่ไม่ได้จัดการกับกราฟิกในขณะนี้