รูปแบบภาพใดมีประสิทธิภาพการใช้หน่วยความจำมากกว่า: PNG, JPEG หรือ GIF


70

รูปแบบภาพใดมีประสิทธิภาพในการประหยัดหน่วยความจำมากขึ้น PNG, JPEG หรือ GIF?


4
รูปแบบของไฟล์ไม่เกี่ยวข้องกับพื้นผิวหรือการกำจัดวัตถุ
Kylotan

คำตอบ:


153

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

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

การเก็บรักษา

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

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

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

PNG สนับสนุนความโปร่งใส (และความโปร่งใสกึ่งโปร่งใส) บีบอัดข้อมูลโดยไม่ลดคุณภาพ (เช่นใช้การบีบอัดแบบไม่สูญเสียข้อมูล) และบีบอัดได้ค่อนข้างดี แต่ไม่มากเท่ากับ JPG

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

หากคุณต้องการลดขนาดการกระจายของคุณอย่างจริงจังคุณสามารถประมวลผลภาพทุกภาพด้วยตนเองดังนี้:

if the image has transparency then
    try pngquant on the image
    if the results are not satisfactory then
        revert to the non-quantized image
    end
    store as PNG
else
    try storing it as JPG with different quality settings
    if no single setting yields an image of an acceptable quality then
        try pngquant on the image
        if the results are not satisfactory then
            revert to the non-quantized image
        end
        store as PNG
    else
        store as JPG
    end
end

เคล็ดลับ: การเก็บรูปภาพบางรูปในรูปแบบเดียวนั้นทำได้ไม่ดีและรูปแบบอื่นในรูปแบบอื่น

มีรูปแบบเฉพาะอื่น ๆ เช่น DXT, ETC และ PVRTC พวกมันรองรับการบีบอัดและสามารถโหลดลงในหน่วยความจำได้ แต่รองรับเฉพาะ GPU ที่เฉพาะเจาะจงเท่านั้นและ GPU เหล่านี้ส่วนใหญ่รองรับเพียงหนึ่งเท่านั้นดังนั้นหากคุณไม่ทราบข้อกำหนดฮาร์ดแวร์ที่แน่นอนของฮาร์ดแวร์เป้าหมายของคุณ iPhone / iPad ซึ่งรองรับพื้นผิว PVRTC) คุณควรหลีกเลี่ยงรูปแบบเหล่านี้

โปรแกรมหน่วยความจำ

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

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

หน่วยความจำวิดีโอ

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

ทีนี้ VRAM ที่ภาพของคุณใช้ในการโหลดภาพwidth * height * bitdepth แต่ละภาพใน VRAM จะเป็นแบบคร่าวๆ มีสองสิ่งที่ควรสังเกตที่นี่:

  1. ความกว้างและความสูงที่ภาพของคุณถูกจัดเก็บใน VRAM ไม่จำเป็นต้องตรงกับภาพต้นฉบับของคุณ GPU บางตัวสามารถรองรับพื้นผิวที่มีขนาดเป็น 2 เท่านั้นดังนั้นรูปภาพขนาด 320x240 ของคุณอาจถูกจัดเก็บในพื้นที่ 512x256 ใน VRAM ด้วยหน่วยความจำที่ไม่ได้ใช้อย่างมีประสิทธิภาพ บางครั้งคุณไม่ได้รับอนุญาตให้โหลดพื้นผิวที่มีขนาดที่ไม่ใช่พลังของ 2 (เช่นใน GLES 1.1)

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

  2. ความลึกเป็นสิ่งสำคัญมาก โดยปกติพื้นผิวจะถูกโหลดลงใน VRAM ใน ARGB แบบ 32 บิตหรือ XRGB แบบ 32 บิต แต่ถ้าฮาร์ดแวร์ของคุณสามารถรองรับความลึก 16 บิตและคุณไม่ทราบว่าจะมีความลึกบิตที่ต่ำกว่าคุณสามารถ VRAM ที่ใช้ในแต่ละภาพได้ครึ่งหนึ่ง ซึ่งอาจเป็นสิ่งที่น่าสนใจที่ต้องพิจารณา

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

ความเร็วในการประมวลผล

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

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

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

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


25
+1 นี่เป็นคำตอบที่ครอบคลุมอย่างยิ่งซึ่งครอบคลุมพื้นที่มากมาย ฉันไม่แน่ใจว่าขนาดของตัวอธิบายพื้นผิวต้องการพื้นที่มากเท่าที่ควรและการกล่าวถึง DXT / ETC / PVRTC ควรรวมว่าแต่ละอันนั้นใช้ได้เฉพาะในบางแพลตฟอร์มเท่านั้น - พวกเขาไม่ได้เปิดข้ามแพลตฟอร์ม มาตรฐานที่สามารถใช้งานได้ทุกที่ตามวิธี JPEG, PNG และ GIF แต่โดยรวมแล้วประทับใจมาก นี่เป็นมากกว่า "คำอธิบายประกอบเล็กน้อย" ด้านบนของคำตอบของฉัน! : D
Trevor Powell

9
@PandaPajama: อาจจะไม่ใช่ แต่มันเป็นคำตอบที่ดีกว่าที่ควรจะเป็น
Marcks โทมัส

1
+1 และอีกมากถ้าทำได้ นี่เป็นคำตอบที่ยอดเยี่ยมและควรเป็นจุดอ้างอิงมาตรฐานสำหรับคำถามใด ๆ เกี่ยวกับ "ประสิทธิภาพของหน่วยความจำ" เพราะมันจะทำการหักล้างตำนานทั่วไปที่การใช้หน่วยความจำน้อยกว่านั้นเป็นวิธีที่ดีที่สุดเสมอ ไอเท็มหนึ่งที่ฉันขอแนะนำให้เพิ่มคือในกรณีที่ไม่เร่งความเร็วหากจำเป็นต้องใช้การบีบอัดแบบ on-the-fly เมื่อวาดภาพมันอาจทำให้เกิดค่าใช้จ่ายที่ไม่สามารถยอมรับได้
Maximus Minimus

2
ผมอยากจะขอแนะนำPNGGauntlet มันสามารถทำการปรับแต่งแบบไม่สูญเสียขนาดใหญ่สำหรับขนาดไฟล์ PNG ที่สามารถเพิ่มได้โดยเฉพาะเมื่อคุณมีสไปรต์มากมาย เป็นเรื่องน่าเศร้าที่มีเฉพาะ Windows เท่านั้น แต่มีตัวเลือกอื่น ๆ ไว้ในโฮมเพจสำหรับระบบปฏิบัติการอื่น
orlp

1
@DavidDimalanta ฉันไม่เคยมีประสบการณ์กับ libgdx แต่อย่างที่ฉันเห็นจากเอกสารประกอบsetEnforcePotImagesมันปิดการบังคับใช้พลังของพื้นผิวขนาด 2 สำหรับ OpenGLES 1.0 ไม่ใช่ความคิดที่ดีเนื่องจากฮาร์ดแวร์บางตัวไม่รองรับพื้นผิวที่ไม่มีประสิทธิภาพ OpenGLES 2.0 ต้องการการสนับสนุนสำหรับพื้นผิวที่ไม่ได้ใช้พลังงานเท่ากันดังนั้นหากคุณกำหนดเป้าหมายที่ 2.0 คุณสามารถใช้พื้นผิวขนาดใดก็ได้ สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารประกอบของ libgdx
แพนด้า Pajama

26

เมื่อรูปภาพถูกโหลดออกจากดิสก์และมีการจัดรูปแบบสำหรับการเรนเดอร์รูปภาพนั้นจะใช้หน่วยความจำจำนวนเท่ากันไม่ว่ารูปภาพนั้นจะถูกบันทึกลงดิสก์โดยใช้ PNG, JPEG หรือ GIF

กฎทั่วไปของหัวแม่มือ: JPEG เป็นรูปแบบที่สูญเสียและจะลดคุณภาพของภาพเพื่อทำให้ภาพมีขนาดเล็กลงบนดิสก์ ในทางกลับกัน PNG เป็นรูปแบบภาพที่ไม่มีการสูญเสียดังนั้นโดยทั่วไปจะทำให้ไฟล์มีขนาดใหญ่ขึ้นในดิสก์ GIF ยังเป็นรูปแบบที่ไม่มีการสูญเสียทางเทคนิค แต่รองรับได้สูงสุด 256 สีต่อภาพและดังนั้นรูปภาพที่มีสีสูงมักจะมีการสูญเสียคุณภาพจำนวนมากหากบันทึกเป็น GIF

นั่นเป็นเพียงการแสดงบนดิสก์เท่านั้น ในหน่วยความจำทั้งคู่จะขยายออกเป็นรูปแบบพื้นผิวเดียวกันโดยใช้หน่วยความจำในจำนวนเท่ากันไม่ว่าคุณจะบันทึกไว้ในดิสก์เป็น PNG หรือ JPEG หรือ GIF ก็ตาม


ดังนั้นมันไม่ได้ขยายไฟล์ที่แตกต่างกันขนาดหน่วยความจำ แต่ขนาดไฟล์?
Tredecies Nocturne

ทั้ง ขนาดในหน่วยความจำขึ้นอยู่กับขนาดของภาพและความลึก การบีบอัดใด ๆ ในไฟล์ภาพจะถูกลบออกเมื่อภาพถูกโหลดลงในหน่วยความจำที่จะดึงไปยังหน้าจอ (เนื่องจาก GPU ไม่สามารถแสดง PNGs หรือ JPEG หรืออื่น ๆ ได้รูปภาพจึงถูกขยายออกเป็น pixmaps ทั่วไปเพื่อให้ GPU สามารถจัดการกับมันได้)
Trevor Powell

2
สิ่งนี้ไม่เป็นความจริง 100% GPU ที่ทันสมัยส่วนใหญ่ (รวมถึงตัวที่ฝังอยู่) รองรับการโหลดและจัดเก็บพื้นผิวที่ถูกบีบอัดในหน่วยความจำกราฟิกด้วยรูปแบบเช่น DXT, ETC และ PVRTC ซึ่งเป็นเรื่องธรรมดาที่สุดในโลกที่ฝังตัว แน่นอนคุณจะต้องเก็บพื้นผิวของคุณในรูปแบบเหล่านี้ในสถานที่แรกแทน PNG / JPG / GIF
ชุดนอนแพนด้า

6
คำถามนี้เป็นตัวเลือกที่ชัดเจนระหว่าง PNG / JPG / GIF ซึ่งไม่ได้รับการสนับสนุนใน GPU ใด ๆ ที่ฉันรู้จัก ผู้ถามดั้งเดิมมีปัญหามากพอกับความแตกต่างระหว่างขนาดไฟล์บนดิสก์และเนื้อที่ที่ใช้ใน RAM ที่ฉันรู้สึกว่าการเพิ่มรูปแบบไฟล์เพิ่มเติมจะสร้างความสับสนให้กับปัญหาพื้นฐานเท่านั้น แต่อย่าลังเลที่จะให้คำตอบของคุณเอง
เทรเวอร์พาวเวล

2
ความคิดเห็นของฉันเป็นเพียงคำอธิบายประกอบ ถ้าฉันต้องตอบคำถามฉันน่าจะเขียนแบบเดียวกับที่คุณทำบวกความคิดเห็นของฉันเป็นคำแถลงการณ์ปิดท้าย ฉันไม่มีอะไรเพิ่มดังนั้นฉันจะหลีกเลี่ยงการทำซ้ำโดยให้คำตอบของฉันเอง
แพนด้า Pajama

3

มันขึ้นอยู่กับ.

Jpeg มีประสิทธิภาพมากที่สุดสำหรับภาพถ่าย มันไม่ได้สูญเสียอะไรเลย แต่สิ่งประดิษฐ์ที่แนะนำโดยการบีบอัดจะมองเห็นได้น้อยที่สุดในกรณีใช้งานนี้

PNG นั้นไม่สูญเสียและมีประสิทธิภาพมากที่สุดสำหรับพิกเซล - อาร์ตที่มีเส้นคมและสีน้อย นอกจากนี้ยังรองรับอัลฟ่าโปร่งใส

GIF ไม่สามารถทำอะไรได้ PNG ทำได้ดีกว่านี้ยกเว้นความสามารถในการเก็บภาพเคลื่อนไหว แต่นี่จะเกี่ยวข้องในบริบทของเว็บแอปพลิเคชันเท่านั้น ในการพัฒนาเกมคุณมักสร้างภาพเคลื่อนไหวโดยใช้ spritesheet

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


2

ฉันไม่รู้เกี่ยวกับ libgdx มากนัก แต่เกี่ยวกับรูปแบบภาพและกราฟิก:

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

GIF ล้าสมัยสามารถเก็บสีที่ถูกกำหนดไว้ (สูงสุด 8 บิตต่อพิกเซล) ด้วยสีเฉพาะหนึ่งสีเพื่อความโปร่งใสที่สมบูรณ์ ช่วยให้ภาพเคลื่อนไหวขนาดเล็กขึ้นอยู่กับเฟรม เมื่อมีสิทธิบัตรในอัลกอริทึมการบรรจุเพื่อให้ไม่สามารถใช้งานได้ทุกที่อย่างถูกกฎหมาย เนื่องจากสิทธิบัตรนั้น PNG จึงได้รับการพัฒนา

PNG เป็นบิตแมปซิปที่มากขึ้นหรือน้อยลงที่สามารถเก็บ RGB + alpha (สูงสุด 32 บิต) และรูปแบบพิกเซลอื่น ๆ มันมีความเชี่ยวชาญในการคลายไฟล์ส่วนเล็ก ๆ ของรูปภาพซึ่งสะดวกสำหรับอุปกรณ์ที่มีขนาดเล็กและช้ามาก (เช่นโทรศัพท์มือถืออายุ 10 ปี) แต่ห้องสมุดในปัจจุบันเพียงแค่แกะมันออกเป็นบิตแมปเมื่อโหลด

PNG นั้นดีกว่า GIF ในขนาดและความเร็วและฟีเจอร์ แต่ถ้าคุณต้องการเก็บบิตแมปอย่างมีประสิทธิภาพฉันขอแนะนำ: .PNM.BZ2 ([แก้ไข] เนื่องจากวิธีการบรรจุที่แตกต่างกัน. PNM.BZ2 ไม่ได้มีประสิทธิภาพมากขึ้นเสมอไป กว่า. PNG [/ แก้ไข])

PNM / PBM / PGM / PAMเป็นรูปแบบบิตแมปธรรมดาที่มีส่วนหัว KISS ในข้อความธรรมดา การใช้ gzip บนไฟล์เหล่านั้นจะทำให้ไฟล์มีขนาดใกล้เคียงกับ PNG ดังนั้น bzip2 จึงเป็นทางออกที่ดีกว่า หากคุณจะใช้บิตแมปภายในโปรแกรมของคุณคุณอาจต้องการใช้บิตแมปที่บีบอัด bzip2 ในคอนเทนเนอร์. tar หรือ. zip หากคุณไม่มี bzip2 การใช้ PNM ในคอนเทนเนอร์ zip (zip ที่มีการบีบอัดสูงสุด) อาจคล้ายกับการใช้ PNG - ดังนั้นการจัดเก็บ PNGs ในไฟล์ ZIP อาจมีประโยชน์เพียงเล็กน้อยหรือไม่มีประโยชน์ - มันน่าจะเป็นการเพิ่มเวลาในการโหลดรูปภาพ

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


ไฟล์ PNM พร้อมใช้งานและสามารถอ่านได้กับระบบปฏิบัติการ OS ของสมาร์ทโฟนและคอมพิวเตอร์ตั้งโต๊ะทั้งหมด
David Dimalanta

1
@ David Dimalanta: ฉันไม่รู้ว่ามันรองรับที่ไหนและที่ไหน หากคุณต้องการตั้งโปรแกรมด้วย PNM คุณไม่ต้องการใช้ไลบรารีใด ๆ เนื่องจากรูปแบบนั้นง่ายเกินไปที่จะเลือก API ใด ๆ ด้วยเหตุนี้จึงสามารถอ่านและเขียนได้ด้วยภาษาการเขียนโปรแกรมที่มีอยู่ทั้งหมดซึ่งสนับสนุนการอ่าน / เขียนไฟล์ไบนารี แน่นอนคุณสามารถใช้ Netpbm ในระบบปฏิบัติการใด ๆ ไม่เพียง Unix ในทางกลับกันฉันไม่ทราบว่าไลบรารีรูปภาพทั่วไปใดที่ไม่สนับสนุนสิ่งนี้ มันไม่ใช่รูปแบบการบีบอัดดังนั้นจึงไม่ค่อยใช้ในการจัดเก็บภาพบนดิสก์อยู่ดี ดูen.wikipedia.org/wiki/Netpbm_format
comonad

1

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

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

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

ข้อมูลรูปภาพที่บีบอัดมีความหมายมากกว่านี้เล็กน้อยหากการถอดรหัสฮาร์ดแวร์อย่างรวดเร็วเป็นไปได้ สำหรับการแมปปกติอย่างน้อยฉันจำhttp://en.wikipedia.org/wiki/3Dcนี้ เมื่อคุณสามารถบันทึก VRAM บางส่วนแล้ว ฉันยังไม่ทราบตัวอย่างอื่น ๆ ของการถอดรหัสฮาร์ดแวร์

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

ในที่สุด: ฉันเป็นเดสก์ท็อป เมื่อฉันพูดว่า "หน่วยความจำ" ฉันมักจะอ้างถึงหน่วยความจำแบบไดนามิก เมื่อฉันพูดว่า "ดิสก์", "ระบบไฟล์" หรือ "ที่เก็บข้อมูลถาวร" ฉันมักจะอ้างถึงสิ่งที่อุปกรณ์ของคุณใช้เป็นที่เก็บข้อมูลถาวรฉันมักจะคิดว่าในฮาร์ดดิสก์ เมื่อคุณพูดว่า "memory-efficiency" ฉันใช้มันเพื่อ "memory memory" ไม่ใช่ "persistent storage" เมื่อเร็ว ๆ นี้ฉันเห็นผู้คนจำนวนมากที่ใช้คำว่า "หน่วยความจำ" เพื่ออ้างถึง "พื้นที่เก็บข้อมูลถาวร" (อาจเป็นคำศัพท์ของอุปกรณ์มือถือ)


เป็นไปได้ไหมที่มันไม่ได้เป็น JPEG หรือ PNG ที่ส่งผลกระทบต่อหน่วยความจำ แต่ขนาดของไฟล์?
Tredecies Nocturne

ใช่. คุณจะเลือกรูปแบบที่กล่าวถึงในการประหยัดเนื้อที่ดิสก์หรือแบนด์วิดท์ เมื่อโหลดภาพในเกมไลบรารี / เอ็นจิ้นใด ๆ ที่ฉันรู้จักจะถอดรหัสให้เป็นบัฟเฟอร์พิกเซลที่ไม่บีบอัด (คิดเป็นพิกเซลบัฟเฟอร์เป็นอาร์เรย์ของค่า RGB หรือ RGBA ซึ่งแต่ละช่องมักใช้ 1 ไบต์ใน RAM / VRAM ถ้าใช้ 32 บิตต่อ พิกเซลนั่นอาจเป็นสิ่งที่ทุกคนกำลังทำ)
Hatoru Hansou
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.