"ความสำเร็จเป็นผลของการผสมผสานกันอย่างลงตัวของโชคและฝีมือ"
มือถือแอนดรอยด์จอ 1080p กับคำว่า "ชัดเกินไป"
10 Jul 2014 21:07   [7160 views]

เล่น Xiaomi Mi3 มาสักพักนึง ได้ประสบการณ์ใหม่ๆเยอะดี แต่สะดุดกับบางเรื่อง จนรู้สึกว่า "จอ 1080p นั้นชัดเกินไป"

อะไรกัน ยิ่งชัดก็ยิ่งดีไม่ใช่หรอ? สำหรับเหล่าผู้ใช้แล้ว ก็คงเป็นอย่างนั้นแหละ แต่เมื่อสวมหมวก Engineer แล้ว ก็พบอะไรที่แปลกๆบน Mi3 จนรู้สึกว่า 1080p นั้นสร้างปัญหามาพอๆกับความสวยงามเลยทีเดียว

อย่างแรกที่เห็นคือ "การ Scroll กระตุกของ Play Store"

อย่างที่สองคือ "แรมที่ดูใช้เยอะเป็นพิเศษ" ให้มาตั้ง 2GB แต่เหลือใช้กระติ๋วเดียว แถมเหมือนแอพฯแต่ละตัวก็ใช้แรมเยอะจัง

อย่างที่สามคือ "แบตที่ดูปริมาณแล้วควรจะใช้ได้นานกว่านี้"

ก็เลยตั้งข้อสงสัยและพิสูจน์ด้วยการเขียนแอพฯขำๆแล้ว Monitor การใช้งานดู เปรียบเทียบกับมือถือจอ 480x800 อย่าง Nexus S แอพฯก็ไม่มีอะไรมาก แค่เปิด/ปิด ImageView (ภาพ Resolution 1280x720)

พบสิ่งที่น่าสนใจดังนี้ บนเครื่อง Nexus S ระหว่างแสดงภาพและไม่แสดงภาพ ใช้แรมต่างกัน 1MB (ให้ดูจากช่อง 1-byte array)

ส่วนบน Xiaomi Mi3 ใช้แรมต่างกันถึง 4MB

สาเหตุตรงนี้ก็คือ เวลาแอพฯโหลด Image ขึ้นมาแสดง จะต้องโหลดมาขนาดเท่าจำนวนพิกเซลที่แสดงผล ซึ่งจากตัวอย่างที่ได้ลองทำขึ้นมา การแสดงผลบนจอ 1080p (1920x1080) จะต้องใช้จำนวนพิกเซลแสดงผลมากกว่าบนจอ 480x800 ประมาณ 4-5 เท่าด้วยกัน ถึงแม้สิ่งที่เห็นด้วยตาเปล่าในหน่วย cm จะเท่ากันก็ตาม

ผลจากเรื่องนี้มีอยู่สองอย่างคือ

(1) กินแบตมากขึ้น เพราะจำนวนพิกเซลที่ Controller ต้องควบคุมมีจำนวนเยอะขึ้น

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

ซึ่งมันไม่ใช่แค่นั้น การที่ภาพขนาดใหญ่กว่า ก็ต้องใช้ CPU/GPU ในการ Decode และ Resize มากขึ้น นี่คือเหตุผลที่แบตลดเร็วกว่าเครื่องจอละเอียดน้อยกว่า

และเนื่องจากต้องใช้ CPU ในการประมวลผลมากขึ้น การโหลด Bitmap ซึ่งถือว่าเป็นงานที่หนักมากบนมือถือ จึงกินเวลามากขึ้น ผนวกกับการที่ใช้แรมใน Heap มากในการเก็บ Bitmap ก็เลยต้องลำบาก GC คอยเก็บกวาด Chunk ก้อนใหญ่อยู่เรื่อยๆ และนั่นคือสาเหตุที่แอพฯเวลา Scroll จึงกระตุก เนื่องจาก CPU ก็ทำงานหนัก และ GC ก็ต้องเก็บ Chunk ก้อนใหญ่ (ซึ่ง GC เป็นจุดอ่อนของแอนดรอยด์มานานแล้ว เพิ่งมาดีตอน ART ออก)

แต่การ Scroll ก็ไม่ได้จะต้องกระตุกเสมอไป หากแอพฯเขียนมาเข้าใจและทำมาดี ก็สามารถ Scroll ลื่นไหลได้แม้บนมือถือจอ 1080p ยกตัวอย่างเช่น Facebook และ MOLOME (แอพฯตัวหลังนี่คนเขียนหล่อมาก)

แต่นั่นคือความยากและความท้าทายที่โปรแกรมเมอร์ต้องเข้าใจการทำงานของ GC และการ Manage Thread (AsyncTask) ว่าต้องทำยังไงให้ไม่ Block UI ต้อง Manage แรมยังไง บลาๆๆๆ เป็นอีกหนึ่ง Learning Curve ที่โปรแกรมเมอร์แอนดรอยด์ต้องฝ่าไปให้ได้ครับ


บทความนี้อยากจะบอกอะไร?

1) 1080p จอชัดก็จริง แต่ก็จะแลกมาด้วยการที่แบตหมดเร็ว ใช้แรมเยอะ ใช้ CPU/GPU เยอะกว่าเครื่องรุ่นจอละเอียดน้อยกว่า ในฐานะผู้ใช้ ควรจะเข้าใจสิ่งที่ตามมาในเชิงเทคนิคด้วย อย่างเห็นว่าสเปคแรงเทพจะละเอียดยิบแล้วจะดีเสมอไป

2) ถ้าเป็นโปรแกรมเมอร์ ลองหามือถือจอ 1080p มาลองดูด้วยว่า Scroll แล้วกระตุกหรือไม่ เนื่องจากมันไม่ได้ง่ายขนาดนั้นที่จะทำให้ Scroll แล้วไม่กระตุกแน่ๆบนจอ 1080p


ไปแล้นนน สวัสดีก๊ะ =D

บทความที่เกี่ยวข้อง

Jul 3, 2014, 15:13
7792 views
ทำความรู้จัก Android Wear ฉบับนักพัฒนา ในวันที่มันเริ่มมีหัวใจ
Jul 10, 2014, 21:07
7160 views
มือถือแอนดรอยด์จอ 1080p กับคำว่า "ชัดเกินไป"
0 Comment(s)
Loading