Pack vs. Single POT

ภาพ 512x256 จำนวน 64 ภาพเหมือนกัน แต่ชุดแรกเป็นแบบเดี่ยวๆให้ compress ด้วยพลัง power of two แต่ละภาพ (กติกาของ Android ไม่ต้องจตุรัสก็ได้) อีกชุดให้ pack ลง 2048x2048 สองแผ่นพอดี ซึ่งขนาดภาพแต่ละภาพเล็กลงนิดหน่อยเพราะ Unity มันมี padding power อยู่ 2 pixel

โค้ดโปรเจคทดสอบนี้ออกแบบไว้ให้ใช้ภาพทั้งหมดในโปรเจคแล้ว ตามภาพ ดังนั้นทุกภาพต้องถูกใส่ลงไปใน build

ใน Import Settings บอกว่าภาพขนาด 64 KB

ใน Import Settings บอกว่าภาพขนาด 378 KB แต่ขนาดจริงน่าจะต้องรอ Atlas

ภาพหลัง pack แล้ว

ผลหลังจาก build ออกมา (ทำไม inf% nan%) พบว่า

  1. ในรายการ build มีบรรทัด atlas อันเดียว ถึงจริงๆแล้วจะมี 2 แผ่น atlas ก็เถอะ
  2. เหมือนนอกจากจะมีแผ่นใหญ่ข้างบนสุดแล้วยังมีวิญญาณอยู่ข้างล่างอีก แต่ขนาดเล็กกว่า

ผลสรุปคือ

แบบ atlas

4000 KB + (0.4 KB * 12) + (0.3 KB * 52) = 4020.4 KB

แบบ compress power of two เดี่ยวๆ

(64.5 KB * 12) + (64.4 KB * 52) = 4122.8 KB

แบบ atlas ขนาดชนะนิดนึง แถมตอน draw น่าจะดีต่อ draw call มากกว่า ถ้าบังเอิญภาพอยู่ใน atlas แผ่นเดียวกัน เพราะงั้นเราควรใช้แบบ atlas ที่ภาพเล็กลงมากว่า power of two นิดนึงให้ pack ได้

(แล้วตกลง 378 KB ที่โชว์มันคืออะไร)

Compression Quality

ทีนี้เราจะมาทดลองแบบเดิมแต่เปลี่ยน Compression Quality กันดูครับ

ซึ่ง High แปลว่าเสียเวลา compress นาน แล้วตอนใช้กิน memory มากกว่า แต่น่าจะเล็กกว่า เขาว่างั้น

Low Quality

ผลคือเหมือนเดิม

High Quality

ผลก็ยังเหมือนเดิม (อ้าว!)

Compression Quality อีกอัน

แต่เดี๋ยวก่อน! ยังมี option ลับอีกอย่างที่ต้องตั้งจากโค้ดซึ่งมีค่าตั้งแต่ 0 ถึง 100 (ปกติคือ 50)

Quality : 100 + HQ Compression

เอาแบบสุดติ่งไปเลยทีนี้

Reimport นานมาก ประมาณภาพละ 6–10 วิ แสดงว่าต้องรอ 1280 วินาทีถ้าเราไปแตะต้องอะไรก็ตามที่ทำให้ต้อง import ใหม่ (21 นาที!!)

จริงๆไม่ถึง ประมาณ 10 นาทีก็เสร็จ ผลลัพธ์คือ

เหมือนเดิม (อ้าว!)

สำหรับคนสงสัยว่าขนาด APK อาจจะต่างกันมากก็ได้

Crunch Texture

ยังมีอีก! เทคโนโลยี Crunch นี้ค่อนข้างใหม่ (https://github.com/BinomialLLC/crunch) เสียเวลา crunch นิดๆแต่ขนาดเล็กลงมาก เครื่องที่รับ DXT Texture ได้จะสามรถใช้ Crunch Texture ได้เลย แต่เครื่องที่ว่ามีน้อย (พวก Tegra) ถ้าเครื่องไหนรับไม่ได้ขึ้นมามันจะบานเป็น RGBA 32 bit ทันที แต่ก็ดีที่เซฟขนาด APK ได้ (ถ้ายอมโดนบานไหว RAM เยอะจัด หรือเป็นภาพ key จริงๆที่อยากจะให้ดูแปปเดียวแต่ภาพใหญ่)

อันนี้ไม่รู้เหมือนกันว่าทำไม Fast แล้วขนาดยิ่งเล็กลงอีกได้ ขนาดที่เห็นคือขนาดเมื่ออยู่ใน memory นะครับ

แล้วก็ Crunch ที่ให้ติ้กหน้าแรกลองติ๊กแล้วไม่มีผล ต้องมาหน้า Android

เมื่อลอง reimport และ build ดู

Crunch Normal
Crunch Fast

จะเห็นว่าผลคือขนาดเล็กลงแล้วครับ