[Unity] ว่าด้วยเรื่อง Audio Compression Format หรือวิธีบีบอัด Audio ให้ไม่กิน Memory ขณะรัน by

30
Apr
0

ปกติแล้วเวลาเราใส่ Audio ต่างๆลงในโปรเจ็คแล้วสั่งเล่น ขณะรันจะพบว่าตัว Audio นั้นกิน Memory มากเกินควร ซึ่งทั้งๆที่ Source Audio ของเรานำเข้ามาเป็น MP3 ขนาดไฟล์ไม่ใหญ่แท้ๆ แต่พอนำเข้ามากลับมีกิน Memory ไปเยอะมากขณะรัน ซึ่งถ้าเรามาย้อนดู Inspect ที่ตัวไฟล์ตั้งแต่แรกนั้นก็จะพบว่า Audio ของเรานั้นมีขนาดมากกว่าตัวไฟล์จริงๆ ซึ่งเกิดจากเจ้า Unity ไม่ว่าจะนำ Audio ใดๆก็ตามเข้ามาจะพยายามแกะให้เป็น Audio ที่ Decompress (ไม่บีบอัดเลย) ขณะรัน ซึ่งก็เหมือนกับเราเอา WAV ไฟล์มาใส่ตรงๆนั่นแหละครับ พอ Decompress ไฟล์ก็จะบานออกทำให้กิน Memory มากขึ้นนั่นเอง เราจึงต้องทำการปรับ Setting ใน Inspect ให้เรียบร้อยก่อนการรันนั่นเองครับ

จากรูปด้านบน ที่ใต้สุดของรูปจะเห็นได้ว่า ขนาดของ Audio ตัวนี้กลายเป็น 10.3 MB ซึ่งขนาดจริงมีเพียง 2.7 MB ซึ่งสิ่งที่เราต้องเช็คคือ Load Type และ Compression Format

ให้เราทำการเปลี่ยน Load Type เป็น Compressed In Memory ซึ่งจะทำงานตามชื่อมันเลยคือจะยัง Compressed (บีบอัด) อยู่เหมือนเดิมเวลาเก็บลง Memory แต่ ถ้าถามว่าอ่าวแล้วไม่มีข้อเสียเลยหรอ มีครับ การที่มันบีบอัดอยู่ใน Memory ก็แปลว่าการรันของมันจะต้องทำการแกะมาอ่านในทุกๆ Sample เสียงแทน ซึ่งจะใช้งาน Process มากขึ้น แต่ถ้าเพื่อแลกกับการทำให้ Memory ล้นจนเกมพัง ก็ยังถือว่าคุ้มครับ

ส่วน Compression Format มัน Default ไว้ที่ Vorbis อยู่แล้วให้ทิ้งไว้แบบนั้นครับ Format อื่นๆ แทบจะไม่ได้ลดขนาดลงเท่าไรเลยครับ และ Quality แนะนำว่าเต็มไว้ดีแล้วครับ ลดลงจากนี้จะทำให้เริ่มฟังออกแล้วว่าคุณภาพเสียงตกลง

เมื่อปรับเรียบร้อย แถ่นแท้นนน 1.8 MB เองครับ

ว่าด้วยเรื่อง Texture Compression Format หรือวิธีบีบอัด Texture ให้เล็กลง by

30
Apr
0

ปกติเราทำเกมลงมือถือ เราอาจจะพบปัญหาเช่น apk ใหญ่เกิน 50MB เอาลง Google Play ไม่ได้ หรือ Memory ถูกกินไปหมดเครื่องโทรศัพท์ ซึ่งส่วนใหญ่แล้วที่กินพื้นที่ไปมากที่สุดก็ไม่ใช่อะไร มาจากรูปภาพที่ใช้ในเกมหรือ Texture ต่างๆ นั่นเอง ดูตามรูปด้านล่างเลย คือตัวอย่าง Inspector เมื่อคลิกที่รูปภาพ

texture_inspect

เปลี่ยน Texture Type เป็น Advanced ก็จะได้ดังรูป

texture_inspect2

เลือกที่ Format จะมีรูปแบบให้เลือกมากมาย (bpp = bytes per pixel)

  • Automatic Compressed – ตัวนี้หากไม่ได้กด Advance มันคือ Compress เฉยๆ ซึ่งจะเลือก RGBA 16 bit ให้อัตโนมัติ ใช้ได้กับรูปภาพทุกรูปแบบ ทุก device และรองรับ Transparent มีข้อเสียคือพวก Gradient สีจะเละมาก โดยสามารถกินพิ้นที่ 2 bpp
  • RGB DXT1 – ใช้สำหรับอุปกรณ์ที่รองรับ Direct X ซะส่วนใหญ่และอุปกรณ์ที่มีชิป Vivante, Nvidia กินพื้นที่ 0.5 bpp
  • RGBA DXT5 - ใช้สำหรับอุปกรณ์ที่รองรับ Direct X ซะส่วนใหญ่และอุปกรณ์ที่มีชิป Vivante, Nvidia กินพื้นที่ 1 bpp ใช้ transparent ได้
  • RGB ETC1 – รองรับในอุปกรณ์ Android ตั้งแต่ 2.3 ขึ้นไปทุกยี่ห้อไม่ว่าจะใช้ชิปเซ็ตใดก็ได้ เรียกว่ามีโอกาสใช้ได้ก็ใช้ไปเลย วิธีนี้มีข้อเสียหลักคือไม่รองรับ Transparent กินพื้นที่ 0.5 bpp
  • RGB PVRTC 2 bits – 0.25 bpp รองรับ ios ทุกรุ่น และ PVR ชิปเป็นหลัก
  • RGBA PVRTC 2 bits – 0.25 bpp รองรับ ios ทุกรุ่น และ PVR ชิปเป็นหลัก
  • RGB PVRTC 4 bits – 0.5 bpp รองรับ ios ทุกรุ่น และ PVR ชิปเป็นหลัก
  • RGBA PVRTC 4 bits – 0.5 bpp รองรับ ios ทุกรุ่น และ PVR ชิปเป็นหลัก
  • RGBA ATC 8 bits – 0.5 bpp รองรับชิปตระกูล Qualcomm
  • RGBA ETC2 8 bits – 1 bpp ชิป Mali จาก ARM
  • RGB + 1-bit Alpha ETC2 4 bits – 0.5 bpp ชิป Mali จาก ARM
  • ASTC ทั้งหลาย – ไม่แนะนำให้ใช้เนื่องจาก เครื่องที่ไม่ support จะกิน memory มากกว่าปกติเสียอีก

กล่าวโดยสรุปแล้วหากเป็นรูปที่ไม่มี transparent ควรใช้ etc1 สำหรับ android และ pvrtc สำหรับ ios ซึ่งสามารถแยกได้จาก setting ใน inspector ของตัว unity เองอยู่แล้ว แต่หากมี transparent อาจเลือกรูปแบบ RGBA สักอันที่ไม่ใช่ ASTC ซึ่งถึงแม้ว่า hardware จะไม่ support แต่ขนาด memory และพื้นที่ apk ที่ใข้ก็จะยังคงเล็กลงอยู่ โดยยังมีข้อเสียอยู่คือ unity จะใช้ software ในการ decode แทน ส่งผลให้การแสดงรูปช้ากว่าปกติ ซึ่งถ้ารูปที่โหลดติดหน้า Loading อยู่พอดีอยู่แล้วก็อาจจะไม่เป็นไรนัก ทั้งนี้ขึ้นกับผู้พัฒนาจะตัดสินใจเองว่าจะยอมให้รูปโหลดช้าลงเล็กน้อยแลกกับพื้นที่เก็บเล็กลงหรือไม่ หากยอมไม่ได้จริงๆ คงจะเหลือแค่ RGBA 16 bit เท่านั้นที่พอจะทำได้ แล้วแต่ตัดสินใจครับ ขอให้โชคดี :)

 เราชนะรอบ 4 | ยืมเงิน 3000 ด่วน | แอพกู้เงิน | แอพเงินด่วน | สินเชื่อออนไลน์อนุมัติทันที | Site Map | กู้เงินก้อน | กระเป๋าตัง | thisshop และ ยืมเงินฉุกเฉิน 5000 ด่วน