06 December 2011

"Why Android UI is so lag?" Explained.

ผมเป็นคนนึงที่รู้สึกขัดใจกับ UI (User Interface) ของ Android OS ถึงกระตุก ไม่ลื่นไหลเหมือน iOS หรือ Windows Phone ได้ถึงเพียงนี้ มันเป็นต้นเหตุของความไม่ประทับใจทั้งปวงที่ผมมีต่อมือถือ Android และผมมักจะบ่นให้เพื่อนที่ใช้ Android ฟังเสมอๆ

ในที่สุด! วันนี้ก็มีคำตอบกระจ่างชัดมาให้อ่านซักที โดยพนักงานแผนก Android 2 คน ออกมาประกาศเหตุผลว่าทำไมการใช้งานมันถึงดูไม่ลื่นไหล สบายตาเหมือนกับระบบปฏิบัติการดังตัวอื่นๆ

คนแรกคือ  อยู่ในทีมเขียน Framework ออกมาบอกรายละเอียดทางด้านเทคนิก (เทคนิกจ๋ามากๆ ถ้าไม่ได้ศึกษาด้านนี้มาระดับหนึ่งอาจจะงงได้) ผมอ่านแค่คร่าวๆ
https://plus.google.com/105051985738280261832/posts/2FXDCz8x93s

คนที่สองคือ  เป็นอดีตเด็กฝึกงาน (Intern) อยู่ในทีม Android ไม่มีลงเรื่องทางเทคนิกมาก ใครไม่ได้เรียนทางคอมฯ แนะนำให้อ่านอันนี้นะ มีอธิบายถึงทางแก้ไขด้วย
https://plus.google.com/100838276097451809262/posts/VDkV9XaJRGS

สรุปสาเหตุหลัก ได้คร่าวๆ แบ่งเป็นสี่ข้อ

  1. UI Process - ของ Android จะทำงานใน Normal Priority แถมเป็น Thread แบบปกติเทียบเท่ากับ App หรือการทำงานส่วนอื่นๆ เมื่อเปรียบเทียบกับ iOS ที่ทำงานแบบ Real-time Priority ใน UI Thread เฉพาะ ซึ่งจะทำงานได้เร็วกว่ามาก แต่เมื่อผู้ใช้ทำงานกับ UI การทำงานส่วนอื่นๆ เช่น การเรนเดอร์เว็บเพจก็จะหยุดเพื่อมาทำการเรนเดอร์ ซึ่งตรงข้ามกับ Android ที่จะทำงานหลายๆ อย่างไปพร้อมกันได้ แบบ "พอใช้" (ซึ่งก็หมายถึงกระตุกนั่นแหละ -*-)
  2. Hardware Acceleration - เมื่อก่อนสามารถเรียกให้ทำงานได้แค่ Native App UI อันนี้แก้ไขแล้วใน Android 4.0 Ice Cream Sandwich
  3. Garbage Collection (GC) - อันนี้เป็นปัญหาด้านประสิทธิภาพที่ Dalvik VM ซึ่ง Android รันอยู่ ในบางสถานการณ์ GC ก็จะทำงาน เช่นใน Photo Gallery ทำให้การแสดงผลหยุดชะงัก ทำให้ต้องจำกัดการแสดงผลไว้ที่ 30fps จาก 60fps
  4. UI Views - Android จะต้องโหลด UI View ใหม่ทุกครั้งที่ทำการเรียกใช้ ตรงข้ามกับ iOS ที่เก็บทุก views ไว้ในหน่วยความจำตั้งแต่แรก (อันนี้เข้าใจว่าเป็นผลมาจากประสิทธิภาพการจัดการหน่วยความจำของ byte code ของ Android ที่ไม่ดีเท่ากับ native code ของ iOS, WP และอื่นๆ)
โชคดีที่สามข้อหลังสามารถแก้ไขได้ หรือมีวิธีอ้อมที่พอจะบรรเทาได้ แต่มันก็ไม่มีทางที่จะทำให้ UI ใช้งานได้ไหลลื่นเท่า iOS/WP เพราะตัว UI ของ Android ถูกเขียนขึ้นมาเพื่อแข่งกับ BB ก่อน แต่พอ iPhone เปิดตัวมา ทำให้ต้องใส่ Touch UI เพิ่มเข้าไป โดยที่ไม่ได้เขียนขึ้นมาใหม่ ทำให้การใช้งานมีปัญหาอย่างที่เห็นกัน

ทางเดียวที่จะแก้ไขอาการนี้ได้แบบถาวรคือการรื้อ code ส่วน UI ออกมาเขียนใหม่ทั้งหมด ซึ่งจะเกิดปัญหาตามมาหลายอย่าง 

การพัฒนาส่วนอื่นๆ ต้องหยุดชะงัก, ต้องสร้าง compatibility mode ขึ้นมาสนับสนุน App เก่าทั้งหมด และนักพัฒนาต้องเขียน App ตัวเองใหม่เพื่อใช้งาน UI ใหม่

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

แถมรีวิว Android 4.0 ICS รุ่นล่าสุดมาให้ดูด้วย เผื่อสงสัยว่าดีขึ้นขนาดไหนแล้ว

เทียบกับ Android 1.5 Cupcake


ปล. สเปกของสองเครื่องต่างกันเยอะมากๆๆๆ (Samsung Galaxy Nexus กับ HTC Magic) อาจจะเปรียบเทียบได้ไม่ดีเท่าไหร่ แต่เอาให้เห็นคร่าวๆ ว่า hardware ต่างกันขนาดนี้ กระตุกต่างกันแค่ไหน