60fps คืออัตราเฟรม 60 เฟรมต่อวินาที โดยแต่ละเฟรมใช้เวลา 16.7 มิลลิวินาทีพอดี ทำให้เกิดการเคลื่อนไหวที่ราบรื่นตามการมองเห็น ตาม Android Game Optimization Guide 60 FPS ที่คงที่ถือเป็นมาตรฐานขั้นต่ำสำหรับแอนิเมชันที่สบายตาในแอปพลิเคชันมือถือ 16.7 มิลลิวินาที คืองบประมาณเวลาสำหรับการเรนเดอร์หนึ่งเฟรมที่นักพัฒนาต้องทำให้ได้เพื่อบรรลุ 60 FPS
ประเด็นสำคัญ
60fps (60 เฟรมต่อวินาที, frames per second) คือการวัดอัตราเฟรมที่จอแสดงผลรีเฟรชภาพ 60 ครั้งทุกวินาที ดวงตามนุษย์หยุดแยกแยะเฟรมแต่ละเฟรมที่ประมาณ 50–60 Hz ด้วยเอฟเฟกต์การคงอยู่ของการมองเห็น ทำให้ 60fps เป็นเกณฑ์ธรรมชาติของความลื่นไหลสำหรับผู้ใช้ส่วนใหญ่
แต่ละเฟรมที่ 60fps มี งบประมาณเวลาคงที่ 16.67 มิลลิวินาที งบประมาณนี้รวมทุกอย่างตั้งแต่การประมวลผลอินพุตของผู้ใช้ไปจนถึงการเรนเดอร์และแสดงผลบนหน้าจอ หากการดำเนินการใด ๆ — ฟิสิกส์ แอนิเมชัน การเรนเดอร์ฉากที่ซับซ้อน — เกินขีดจำกัดนี้ อัตราเฟรมจะลดลงเหลือ 30fps หรือต่ำกว่า ซึ่งรับรู้ได้ว่าเป็นการสะดุด
ใน การพัฒนามือถือ 60fps เป็นขีดจำกัดบนมานานเนื่องจากข้อจำกัดของฮาร์ดแวร์ จอแสดงผลส่วนใหญ่ก่อนปี 2017 ทำงานที่ 60 Hz ด้วยการมาถึงของหน้าจอ 90 Hz และ 120 Hz ทำให้ 60fps กลายเป็นมาตรฐานล่างแทนที่จะเป็นเป้าหมายบน อย่างไรก็ตาม สำหรับแอปพลิเคชัน UI วิดีโอ และเกมทั่วไปส่วนใหญ่ 60fps ยังคงเป็น ตัวชี้วัดเป้าหมาย ของประสิทธิภาพ
60 Hz คือความถี่ของกระแสสลับในโครงข่ายไฟฟ้าของสหรัฐอเมริกาและญี่ปุ่น ซึ่งในอดีตกำหนดอัตรารีเฟรชของมาตรฐานโทรทัศน์ NTSC แรก มาตรฐาน PAL ใช้ 50 Hz เนื่องจากโครงข่ายไฟฟ้าของยุโรปที่ 50 Hz ความเฉื่อยทางประวัติศาสตร์นี้ส่งต่อไปยังจอคอมพิวเตอร์และต่อมายังจอมือถือ
เอฟเฟกต์การคงอยู่ คือคุณสมบัติของการมองเห็นของมนุษย์ที่เก็บภาพไว้บนเรตินาประมาณ 30–50 มิลลิวินาทีหลังจากสิ่งเร้าหายไป ที่ 60fps เฟรมใหม่มาถึงทุก 16.7 มิลลิวินาที — ก่อนที่ร่องรอยการคงอยู่ของเฟรมก่อนหน้าจะหายไป สร้างภาพลวงตาของการเคลื่อนไหวอย่างต่อเนื่อง การศึกษาของ มหาวิทยาลัยคาร์ดิฟฟ์ (2023) แสดงให้นักบินขับไล่สามารถแยกแยะเฟรมเดี่ยวที่ 220 Hz แต่สำหรับผู้ใช้ทั่วไป ความแตกต่างระหว่าง 60 และ 120 Hz นั้นสังเกตได้น้อยกว่าระหว่าง 30 และ 60 Hz มาก
Apple กำหนด 60fps เป็นมาตรฐานสำหรับ iOS ในปี 2007 พร้อมกับ iPhone เครื่องแรกและคงไว้จนถึง iPhone 13 Pro (2021) Android ในอดีตปฏิบัติตามมาตรฐานเดียวกัน แม้ว่าอุปกรณ์แรกที่มี 90 Hz (OnePlus 7 Pro, 2019) และ 120 Hz (Razer Phone, 2017) จะปรากฏก่อนหน้านี้ ปัจจุบัน 60fps เป็นเกณฑ์ขั้นต่ำสำหรับการผ่านการตรวจสอบใน App Store และ Google Play สำหรับแอปพลิเคชันที่มีแอนิเมชัน แม้ว่าข้อกำหนดอย่างเป็นทางการจะไม่ได้ถูกบันทึกเป็นเอกสาร
การวัด FPS คือขั้นตอนแรกของการปรับแต่ง หากไม่มีเมตริกวัตถุประสงค์ เป็นไปไม่ได้ที่จะระบุว่าประสิทธิภาพสูญเสียไปที่ใด แพลตฟอร์มมือถือมีเครื่องมือทำโปรไฟล์ในตัวและ API ซอฟต์แวร์สำหรับวัดอัตราเฟรมแบบเรียลไทม์
Android Studio Profiler และ Xcode Instruments เป็นเครื่องมือหลักสำหรับการวิเคราะห์ FPS Android Profiler แสดงเวลาเรนเดอร์ GPU อัตราเฟรม และ Jank (จำนวนเฟรมที่ตก) Xcode Instruments มีเทมเพลต Core Animation ซึ่งแสดงอัตราเฟรม เวลาเรนเดอร์ และจำนวน draw call สำหรับเอนจินเกม Unity Profiler และ Unreal Insights ให้การแยกย่อยเวลาโดยละเอียดตามโมดูล
// Android — การวัด FPS ผ่าน FrameMetrics
window.addOnFrameMetricsAvailableListener(
{ _, frameMetrics ->
val duration = frameMetrics[FrameMetrics.TOTAL_DURATION]
val fps = 1000f / (duration / 1_000_000f)
Log.d("FPS", "Frame duration: ${duration / 1_000_000} ms, FPS: $fps")
},
Handler(Looper.getMainLooper())
)
CADisplayLink ใน iOS และ Choreographer ใน Android เป็นกลไกระบบที่ซิงโครไนซ์การเรนเดอร์กับอัตรารีเฟรชของจอแสดงผล CADisplayLink เรียกเมธอดในแต่ละเฟรมใหม่ โดยส่ง timestamp สำหรับคำนวณความล่าช้า Choreographer ใน Android ทำเช่นเดียวกันแต่รองรับการเรียกกลับสำหรับเฟสเฟรมต่าง ๆ: อินพุต แอนิเมชัน การท่องเว็บ การเรนเดอร์ นักพัฒนาสามารถสมัครรับ Choreographer.FrameCallback และวัดเวลาระหว่าง เฟรม
60fps ที่คงที่ หมายความว่าไม่มีเฟรมใดเกินงบประมาณ 16.7 มิลลิวินาที แม้แต่หนึ่งเฟรมยาวต่อวินาทีก็สร้างการสะดุดที่สังเกตได้ การปรับแต่งแบ่งออกเป็นสามระดับ: CPU, GPU และหน่วยความจำ แต่ละระดับอาจกลายเป็นคอขวด
Layout pass เป็นหนึ่งในผู้บริโภคเวลา CPU หลักบน Android และ iOS ลำดับชั้น View ที่ซับซ้อน ConstraintLayout ที่ซ้อนกัน และ drawable ที่หนักสร้างลูกโซ่ measure และ layout ที่ยาว สำหรับแอปพลิเคชัน UI ให้ใช้ ลำดับชั้น View แบบราบ (ความลึกไม่เกิน 3–4 ระดับ) แทนที่ RecyclerView ที่ซ้อนกันด้วย ConcatAdapter และสำหรับรายการใน iOS — ใช้ compositional layout พร้อม prefetching
| การดำเนินการ | เวลาโดยทั่วไป | ผลกระทบเมื่อเกิน |
|---|---|---|
| Layout | 1–3 มิลลิวินาที | การสะดุดบนหน้าจอซับซ้อน |
| Draw | 2–8 มิลลิวินาที | การวาดซ้ำ การตกเฟรม |
| GPU Render | 3–10 มิลลิวินาที | FPS ลดลงครึ่งหนึ่ง |
| GC (การเก็บขยะ) | 2–50 มิลลิวินาที | การสะดุดเล็กน้อยที่สังเกตได้ |
Overdraw คือการเรนเดอร์พิกเซลเดียวกันซ้ำ ๆ แต่ละชั้น View พื้นหลัง ภาพภายใต้องค์ประกอบโปร่งใสเพิ่มจำนวนการดำเนินการพิกเซล ใน Android ให้ใช้ Debug GPU Overdraw ในตัวเลือกนักพัฒนา ใน iOS — Xcode Debug View Hierarchy ลด overdraw โดยการลบพื้นหลังที่ไม่จำเป็นและใช้แฟล็กทึบแสง: ใน Android — @drawable กับ android:opaque ใน iOS — isOpaque = true สำหรับ UIKit.View
Draw calls คือจำนวนคำสั่งเรนเดอร์ที่ส่งไปยัง GPU GPU มือถือสมัยใหม่จัดการ 200–400 draw call ต่อเฟรมที่ 60fps การเกินจำนวนนี้ทำให้ประสิทธิภาพลดลง รวมสไปรต์เป็นเท็กซ์เจอร์แอตลาส ใช้การเรนเดอร์แบบกลุ่ม และหลีกเลี่ยง การเรนเดอร์ทีละรายการ ของแต่ละองค์ประกอบผ่าน draw call แยก
การค้างจาก GC เป็นหนึ่งในสาเหตุหลักของ FPS ที่ไม่เสถียรในแอปพลิเคชัน JVM และ Kotlin การเก็บขยะบน Android อาจใช้เวลาถึง 30–50 มิลลิวินาที ทำให้ข้าม 2–3 เฟรมติดต่อกัน หลีกเลี่ยงการจัดสรรในลูปแอนิเมชัน ใช้พูลออบเจกต์ และจัดสรรหน่วยความจำล่วงหน้า ใน iOS ปัญหารุนแรงน้อยกว่าเนื่องจาก ARC แต่วัฏจักรการรักษาและการล้นของ autorelease pool ก็สร้าง การสะดุดเล็กน้อย เช่นกัน
สำหรับ เกม 60fps ไม่ใช่แค่มาตรฐานแต่เป็นข้อได้เปรียบทางการแข่งขัน การศึกษาของ Newzoo (2024) แสดงว่าเกมที่มี FPS ไม่เสถียรต่ำกว่า 60 ได้รับรีวิวเชิงลบมากกว่า 40% บน Google Play Unity และ Unreal Engine มีโปรไฟเลอร์ในตัวสำหรับตรวจสอบเวลาเรนเดอร์: ใน Unity คือ Frame Debugger ใน Unreal — GPU Visualizer ซึ่งแสดงเวลาที่แน่นอนของแต่ละ draw call และ shader 60fps ที่คงที่มีความสำคัญเป็นพิเศษสำหรับเกมแอคชัน ซึ่งทุกเฟรมที่ตกอาจทำให้ผู้ใช้ไม่ผ่านด่าน
จอแสดงผล 90 Hz และ 120 Hz กำลังเปลี่ยนเกณฑ์ประสิทธิภาพเป้าหมาย สำหรับแอปพลิเคชันที่ทำงานบนอุปกรณ์ ProMotion FPS เป้าหมายอาจเป็น 120 และงบประมาณเฟรมลดลงเหลือ 8.3 มิลลิวินาที ซึ่งต้องใช้โค้ดที่มีประสิทธิภาพเป็นสองเท่า โดยเฉพาะใน draw call และการเรนเดอร์ GPU
ข้อดีของความถี่สูง ไม่ใช่แค่ความลื่นไหล: 120fps ลดความหน่วงอินพุตที่สังเกตได้ 8–10 มิลลิวินาที ซึ่งสำคัญสำหรับเกมและแอปพลิเคชันเชิงโต้ตอบ อย่างไรก็ตาม ความแตกต่างระหว่าง 60 และ 120fps ต้องใช้ แนวทางเฉพาะบุคคล สำหรับแอปพลิเคชัน UI (การเลื่อน แอนิเมชัน) 90fps อาจเป็นการประนีประนอมที่เหมาะสมที่สุดระหว่างความลื่นไหลและการใช้พลังงาน เนื่องจากการเรนเดอร์ 120 เฟรมต่อวินาทีใช้พลังงานมากกว่า 30–40% เมื่อเทียบกับ 60
Apple มี API สำหรับเลือกอัตราเฟรมที่ต้องการ: preferredFramesPerSecond ใน CADisplayLink Android ก่อน API 30 ไม่ได้ให้การควบคุมโดยตรงเหนืออัตรารีเฟรช แต่เริ่มจาก Android 12 นักพัฒนาสามารถตั้งค่า RefreshRate ผ่าน WindowManager โดยขอ 60, 90 หรือ 120 Hz ขึ้นอยู่กับประเภทเนื้อหา
คำถามที่พบบ่อย
30fps ถูกมองว่าเป็น การกระตุก ระหว่างการเลื่อนและแอนิเมชันเพราะแต่ละเฟรมค้างอยู่ 33.3 มิลลิวินาที และตาสามารถสังเกตเห็นความไม่ต่อเนื่องได้ 60fps ให้เฟรมทุก 16.7 มิลลิวินาที — ต่ำกว่าเกณฑ์การคงอยู่ของการมองเห็นสำหรับผู้ใช้ส่วนใหญ่
ใช้ โปรไฟเลอร์ (Android Profiler, Xcode Instruments) และดูฮิสโตแกรมเวลาเฟรม หาก 90%+ ของเฟรมอยู่ใน 16.7 มิลลิวินาทีโดยไม่มีสไปก์ — FPS คงที่ สไปก์เดี่ยว ๆ สูงถึง 30–50 มิลลิวินาทีสร้างการสะดุดที่สังเกตได้
ได้ แต่ต้องปรับแต่งเชิงรุก: ความละเอียดเรนเดอร์ต่ำ เชเดอร์ง่าย จำนวน draw call น้อยที่สุด หลีกเลี่ยงความโปร่งใสและเงาซับซ้อน ทดสอบบนอุปกรณ์ระดับล่าง — มันจะแสดงประสิทธิภาพจริง
เนื่องจากกลไก VSync: หาก GPU ไม่สามารถทำเฟรมให้เสร็จภายใน 16.7 มิลลิวินาที มันจะพลาด VBlank และค้างเฟรมปัจจุบันไว้อีก 16.7 มิลลิวินาที โดยประสิทธิภาพแล้ว หนึ่งเฟรมจะแสดงเป็นสองรอบรีเฟรช และ FPS ลดลงครึ่งหนึ่งพอดี
ใช่ แม้แต่การเลื่อนรายการธรรมดาและแอนิเมชันเปลี่ยนผ่านก็ต้องการ 60fps เพื่อประสบการณ์ที่สบายตา ผู้ใช้สังเกตเห็นการกระตุกทันทีเมื่อปัด และสิ่งนี้ลด คะแนน ของแอปพลิเคชันลง 2–3 เท่าในการทดสอบตามอัตนัย
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม