FPS เฉลี่ย
อัตราเฟรมที่ราบรื่นและเสถียรมีความสำคัญอย่างยิ่งต่อการมอบประสบการณ์การเล่นเกมคุณภาพสูงในอุปกรณ์ Android เมื่อวัดประสิทธิภาพของเกม คุณควรวัด FPS เฉลี่ยเป็น ข้อมูลพื้นฐาน เพื่อให้เข้าใจประสบการณ์การใช้งานเบื้องต้น คุณควรเพิ่มประสิทธิภาพเกมให้มีอัตราเฟรมเฉลี่ย 60 FPS เพื่อให้มั่นใจว่าจะได้รับประสบการณ์การเล่นเกมที่ยอดเยี่ยม
FPS เปอร์เซ็นไทล์ที่ 90 และ 99 เพื่อความเสถียร
แม้ว่าเกมจะมี FPS เฉลี่ย 60 ที่ราบรื่น แต่ก็อาจเกิดอาการสะดุดเป็นระยะๆ การกระตุกเล็กน้อย และความล่าช้าในการป้อนข้อมูลที่คาดเดาไม่ได้ ซึ่งส่งผลให้ผู้เล่นได้รับประสบการณ์การใช้งานที่ไม่ดี
ดังนั้น ความเสถียรของเฟรมจึงมีความสำคัญไม่แพ้การติดตามอัตราเฟรมเฉลี่ย คุณควรวัดเมตริกอัตราเฟรมเปอร์เซ็นไทล์ที่ 90 และ 99 เป็นข้อมูลพื้นฐานที่สอดคล้องกันและตัวบ่งชี้การกระตุกตามลำดับ เมตริกเหล่านี้จะบันทึก "ส่วนท้าย" ของประสิทธิภาพเพื่อให้คุณเพิ่มประสิทธิภาพประสบการณ์การใช้งานของผู้เล่นให้ราบรื่น
เมตริก
- FPS เฉลี่ย (ข้อมูลพื้นฐาน): เมตริกพื้นฐานนี้จะแสดงข้อมูลพื้นฐานทั่วไป เกี่ยวกับประสิทธิภาพของเกม แม้ว่าจะเป็นเกณฑ์มาตรฐาน แต่การคำนวณค่าเฉลี่ยหมายความว่าระบบจะไม่สามารถตรวจพบการลดลงของเฟรมและการกระตุกเล็กน้อยเป็นระยะๆ ซึ่งทำให้เมตริกนี้ไม่เพียงพอที่จะแสดงประสบการณ์การใช้งานของผู้เล่นเพียงอย่างเดียว
- FPS เปอร์เซ็นไทล์ที่ 90 (ข้อมูลพื้นฐานที่สอดคล้องกันที่เปอร์เซ็นไทล์ที่ 10): เมตริกนี้บ่งชี้ว่าเฟรม 90% มีค่าสูงกว่าข้อมูลพื้นฐานที่สอดคล้องกันนี้ และมีเพียงเฟรม 10% ที่ช้าที่สุดเท่านั้นที่ใช้เวลาในการแสดงผลนานขึ้น หากอัตราเฟรมเปอร์เซ็นไทล์ที่ 90 มีค่าสูงและใกล้เคียงกับค่าเฉลี่ย แสดงว่าเกมทำงานได้ดีอย่างสม่ำเสมอสำหรับเซสชันส่วนใหญ่
- FPS เปอร์เซ็นไทล์ที่ 99 (ตัวบ่งชี้การกระตุกที่เปอร์เซ็นไทล์ที่ 1): เมตริกนี้บ่งชี้ว่าเฟรม 99% ของ คุณมีค่าสูงกว่าตัวบ่งชี้การกระตุกนี้ โดยเฉพาะอย่างยิ่งการแยกเฟรม 1% ที่ช้าที่สุด เมตริกนี้มีความสำคัญอย่างยิ่งในการตรวจจับการกระตุกเล็กน้อย ความล่าช้าในการโหลดชิ้นงาน และการเพิ่มขึ้นอย่างฉับพลันของการแสดงผลชิ้นงานจำนวนมาก ซึ่งทำให้เกิดอาการสะดุดที่มองเห็นได้
ตัวอย่าง
การเปรียบเทียบ FPS เฉลี่ยกับเมตริกเปอร์เซ็นไทล์ที่ 90 และ 99 จะช่วยให้คุณวินิจฉัยพฤติกรรมพื้นฐานของเกมได้อย่างแม่นยำ
สถานการณ์ที่ 1: เส้นโค้งที่เหมาะสม (เกมที่เพิ่มประสิทธิภาพแล้ว)
- ค่าเฉลี่ย: 60 FPS (16.6 มิลลิวินาที)
- เปอร์เซ็นไทล์ที่ 90: 58 FPS (17.2 มิลลิวินาที)
- เปอร์เซ็นไทล์ที่ 99: 52 FPS (19.2 มิลลิวินาที)
- การวิเคราะห์: เมตริกมีค่าใกล้เคียงกัน เกมจึงดูราบรื่นและสม่ำเสมออย่างยิ่ง ไม่มีการกระตุกเล็กน้อย และแม้แต่เฟรม 1% ที่แย่ที่สุดก็แทบมองไม่เห็นด้วยตาเปล่า
สถานการณ์ที่ 2: คอขวดในการโหลด (CPU/GPU Bound)
- ค่าเฉลี่ย: 45 FPS (22.2 มิลลิวินาที)
- เปอร์เซ็นไทล์ที่ 90: 40 FPS (25.0 มิลลิวินาที)
- เปอร์เซ็นไทล์ที่ 99: 38 FPS (26.3 มิลลิวินาที)
- การวิเคราะห์: อัตราเฟรมเฉลี่ยต่ำกว่า แต่ต่ำกว่าอย่างสม่ำเสมอ เปอร์เซ็นไทล์ที่ 99 ไม่ลดลงอย่างมากเมื่อเทียบกับค่าเฉลี่ย ซึ่งบ่งชี้ว่าโดยพื้นฐานแล้วระบบถูกการตั้งค่ากราฟิกหรือข้อจำกัดด้านความละเอียดทำให้ทำงานหนักเกินไป เกมจะไม่รู้สึกกระตุก แต่จะรู้สึกหน่วงแทน โดยปกติแล้วการลดการตั้งค่ากราฟิกจะเพิ่มเมตริกเหล่านี้ขึ้นอย่างสม่ำเสมอ
สถานการณ์ที่ 3: 60 FPS ที่ไม่เสถียร (การคอมไพล์ Shader / การกระตุกในการสตรีมชิ้นงาน )
- ค่าเฉลี่ย: 60 FPS (16.6 มิลลิวินาที)
- เปอร์เซ็นไทล์ที่ 90: 45 FPS (22.2 มิลลิวินาที)
- เปอร์เซ็นไทล์ที่ 99: 15 FPS (66.6 มิลลิวินาที)
- การวิเคราะห์: นี่คือสถานการณ์ที่แย่ที่สุด แม้ว่าอัตราเฟรมเฉลี่ยจะดูดีเยี่ยม แต่เปอร์เซ็นไทล์ที่ 99 เผยให้เห็นปัญหาร้ายแรง เปอร์เซ็นไทล์ที่ 99 ที่ 66.6 มิลลิวินาทีหมายความว่าเกมหยุดทำงานโดยสมบูรณ์เป็นเวลาหลายเฟรมพร้อมกัน ซึ่งบ่งชี้ถึงค่าผิดปกติที่รุนแรง ซึ่งมักเกิดจากคอขวดของ CPU ความล่าช้าในการสตรีมชิ้นงาน (เช่น RAM หรือพื้นที่เก็บข้อมูลช้า) หรืออาการสะดุดที่เกิดจากการคอมไพล์ Shader
การวัดผล
คุณสามารถใช้ 2 วิธีต่อไปนี้เพื่อวัด FPS เฉลี่ย FPS เปอร์เซ็นไทล์ที่ 90 และ 99 ได้อย่างมีประสิทธิภาพ วิธีแรกคือการวิเคราะห์การติดตามระบบโดยใช้ Android
Performance Analyzer (APA) ซึ่งเป็นเครื่องมือสร้างโปรไฟล์ประสิทธิภาพ วิธีที่ 2 คือการใช้คำสั่ง adb dumpsys SurfaceFlinger --timestats ที่มีอยู่
1. วัดโดยใช้ APA
การใช้ APA ช่วยให้คุณบันทึกการติดตามระบบและวิเคราะห์ข้อมูลเฟรมได้อย่างแม่นยำผ่านการค้นหา SQL ทำตามขั้นตอนต่อไปนี้เพื่อวัดเมตริก
บันทึกการติดตามด้วย APA: เรียกใช้เกมและใช้ APA เพื่อบันทึก การติดตามระบบในระหว่างส่วนที่คุณต้องการวิเคราะห์ (เช่น จุดหนึ่ง ระหว่างการเล่นเกมที่คุณสงสัยว่าเฟรมลดลง) เมื่ออุปกรณ์เชื่อมต่อแล้วและบันทึกการติดตามเสร็จสมบูรณ์ ข้อมูลการติดตามจะโหลดในอินเทอร์เฟซ APA
หน้าจอบันทึกการติดตามหรือหน้าจอการติดตามที่โหลด คลิกแท็บ SQL ใน APA: เมื่อหน้าจอการวิเคราะห์การติดตามเปิดขึ้น ให้คลิก แท็บ SQL ในพื้นที่การนำทางด้านบนหรือด้านข้างของ UI เพื่อเปิด สภาพแวดล้อมตัวประมวลผลการติดตาม ซึ่งคุณสามารถค้นหาข้อมูลได้โดยตรง
วางการค้นหา SQL ในแท็บ SQL ของ APA: คัดลอกการค้นหา SQL ต่อไปนี้แล้ว วางลงในช่องป้อนข้อมูลการค้นหา การค้นหานี้จะระบุกระบวนการ SurfaceFlinger คำนวณช่วงเวลาเฟรมตามการประทับเวลาการอัปเดตการแสดงผลจริง และหา FPS เฉลี่ย FPS 10% ล่างสุด (เปอร์เซ็นไทล์ที่ 90) และ FPS 1% ล่างสุด (เปอร์เซ็นไทล์ที่ 99)
WITH target_process AS ( -- 1. Get SurfaceFlinger process ID where frames were identified in debugging step 3 SELECT upid FROM process WHERE name = '/system/bin/surfaceflinger' ), actual_present_times AS ( -- 2. Calculate the hardware display timestamps when SurfaceFlinger actually updated the screen SELECT (ts + dur) AS present_ts FROM actual_frame_timeline_slice WHERE upid IN (SELECT upid FROM target_process) AND dur > 0 ), present_intervals AS ( -- 3. Calculate intervals between physical screen refreshes SELECT (LEAD(present_ts) OVER (ORDER BY present_ts ASC) - present_ts) / 1000000.0 AS p2p_ms FROM actual_present_times ), valid_intervals AS ( -- 4. Filter for valid frame intervals SELECT p2p_ms FROM present_intervals WHERE p2p_ms IS NOT NULL AND p2p_ms > 0 ), ordered_frames AS ( -- 5. Sort in ascending order to calculate percentiles SELECT p2p_ms, ROW_NUMBER() OVER (ORDER BY p2p_ms ASC) AS row_num, COUNT(1) OVER () AS total_frames FROM valid_intervals ) -- 6. Output final metrics SELECT (SELECT COUNT(1) FROM valid_intervals) AS total_presented_frames, ROUND(1000.0 / NULLIF((SELECT AVG(p2p_ms) FROM valid_intervals), 0), 2) AS average_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.90 AS INT)), 0), 2) AS low_10_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.99 AS INT)), 0), 2) AS low_1_fps;คลิก "เรียกใช้การค้นหา": คลิกปุ่มเรียกใช้การค้นหา (หรือไอคอนเรียกใช้) ใกล้กับช่องป้อนข้อมูลการค้นหา เมื่อการเรียกใช้การค้นหาเสร็จสมบูรณ์ เฟรมทั้งหมดที่วัดได้ (
total_presented_frames), อัตราเฟรมเฉลี่ย (average_fps), FPS 10% ล่างสุด (low_10_fps) และ FPS 1% ล่างสุด (low_1_fps) จะแสดงในตารางในบานหน้าต่างผลลัพธ์
หน้าจอที่แสดงการค้นหา SQL ที่เรียกใช้และเมตริก 4 รายการที่ได้ซึ่งแสดงในตาราง
2. วัดโดยใช้ adb (dumpsys SurfaceFlinger)
คุณสามารถใช้คำสั่ง timestats dumpsys surfaceflinger ของ Android
dumpsys surfaceflinger เพื่อวัด FPS เฉลี่ย เปอร์เซ็นไทล์ที่ 90 และ 99 ได้อย่างมีประสิทธิภาพ เครื่องมือนี้จะแสดง FPS เฉลี่ยและฮิสโทแกรมการกำหนดเวลา presentToPresent สำหรับเลเยอร์ทั้งหมดที่กำลังแสดงผล เวลา presentToPresent ของเฟรมคือช่วงเวลาระหว่างเฟรมปัจจุบันกับเฟรมก่อนหน้าที่มีการวาด
ต่อไปนี้เป็นวิธีการทีละขั้นตอนในการรวบรวมและคำนวณเมตริกเหล่านี้สำหรับเกม
เริ่มบันทึก: เรียกใช้คำสั่งต่อไปนี้โดยใช้แฟล็ก enable และ clear เพื่อเริ่มบันทึกข้อมูล
adb shell dumpsys SurfaceFlinger --timestats -clear -enableแสดงข้อมูล: เมื่อเล่นเกมไปนานพอแล้ว ให้เรียกใช้ คำสั่งอีกครั้งโดยใช้แฟล็ก dump เพื่อแสดงข้อมูล
adb shell dumpsys SurfaceFlinger --timestats -dumpกรองตามเลเยอร์: ข้อมูลที่แสดงจะมีข้อมูลสำหรับเลเยอร์ทั้งหมด ที่ SurfaceFlinger แสดงผล คุณต้องค้นหาส่วนที่สอดคล้องกับเกมโดยกรองตาม
layerName(เช่น layerName = SurfaceView[com.example.yourgame...])layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833ระบุ FPS เฉลี่ย: ระบบจะคำนวณ FPS เฉลี่ยสำหรับแต่ละเลเยอร์ โดยอัตโนมัติและแสดงโดยตรงในเอาต์พุต dump (เช่น averageFPS = 30.179)
... averageFPS = 30.179 ...คำนวณ FPS เปอร์เซ็นไทล์ที่ 90 และ 99: หากต้องการค้นหาเมตริกเปอร์เซ็นไทล์ที่ 90 และ 99 คุณต้อง วิเคราะห์ totalFrames และฮิสโทแกรมการกำหนดเวลา
presentToPresentที่แสดงใน dumptotalFrames = 1000 ... presentToPresent histogram is as below: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=850 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=100 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0 66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0ก. ตัวอย่างแนวคิด (ตารางการแจกแจงสะสม) สมมติว่าเซสชันเกมของคุณบันทึก totalFrames ได้ 1,000 เฟรม หากต้องการค้นหาเปอร์เซ็นไทล์ที่ 90 และ 99 ให้คำนวณเกณฑ์มิลลิวินาทีที่จำนวนเฟรมสะสมถึง 900 เฟรม (90%) และ 990 เฟรม (99%) ตามลำดับ โดยนับจากบัคเก็ตมิลลิวินาทีที่ต่ำที่สุด
เวลาเฟรม (มิลลิวินาที) จำนวนเฟรม (ฮิสโทแกรม) จำนวนเฟรมสะสม สถานะ / การคำนวณเปอร์เซ็นไทล์ 16 มิลลิวินาที 850 850 85.0% 33 มิลลิวินาที 100 950 95.0%
(ถึงเป้าหมายเปอร์เซ็นไทล์ที่ 90 ที่ 900 แล้ว! → 1000/33 = 30.3 FPS)50 มิลลิวินาที 35 985 98.5% 66 มิลลิวินาที 10 995 99.5%
(ถึงเป้าหมายเปอร์เซ็นไทล์ที่ 99 ที่ 990 แล้ว! → 1000/66 = 15.1 FPS)102 มิลลิวินาที 5 1,000 100% ข. ตรรกะการติดตั้งใช้งาน (รหัสเทียม) หากคุณกำลังทำให้การวิเคราะห์นี้เป็นแบบอัตโนมัติโดยใช้สคริปต์ Python หรือตัวแยกวิเคราะห์บันทึก ตรรกะในการแยกค่าเปอร์เซ็นไทล์ที่ 90 และ 99 จากฮิสโทแกรมสามารถติดตั้งใช้งานได้ดังนี้
# Define target thresholds based on total frame count p90_target = totalFrames * 0.90 p99_target = totalFrames * 0.99 cumulative_frames = 0 p90_fps = None p99_fps = None # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond) for ms_bucket, frame_count in present_to_present_histogram: cumulative_frames += frame_count # Capture P90 when cumulative frames cross the 90% threshold if p90_fps is None and cumulative_frames >= p90_target: p90_fps = 1000 / ms_bucket # Capture P99 when cumulative frames cross the 99% threshold if p99_fps is None and cumulative_frames >= p99_target: p99_fps = 1000 / ms_bucket break # Optimization: stop iterating once both targets are foundหยุดบันทึก: หลังจากรวบรวมข้อมูลที่จำเป็นทั้งหมดแล้ว คุณควร ปิดใช้ timestats โดยใช้แฟล็ก disable
adb shell dumpsys SurfaceFlinger --timestats -disable
เซสชันที่ช้า
เซสชันที่ช้า จะระบุปัญหาด้านประสิทธิภาพที่แพร่หลายในโลกแห่งความเป็นจริง เซสชันจะ "ช้า" หากเฟรมมากกว่า 25% ลดลงต่ำกว่าเกณฑ์ (เช่น 20 FPS) แม้ว่าเมตริกนี้จะมีประโยชน์ในการตรวจหาปัญหาที่สำคัญในการสร้าง แต่เมตริกนี้เพียงอย่างเดียวไม่สามารถรับประกันประสบการณ์การใช้งานคุณภาพสูงและยั่งยืนได้ เกมอาจหลีกเลี่ยงเกณฑ์เซสชันที่ช้า แต่ยังคงประสบปัญหาการกระตุกเล็กน้อยซึ่งส่งผลต่อประสบการณ์การใช้งาน 60 FPS ที่ราบรื่น
แม้ว่า "เซสชันที่ช้า" และ "อัตราเฟรม" จะได้มาจากเวลาเฟรม แต่ก็มีบทบาทที่แตกต่างกัน เมตริก FPS เฉลี่ย เปอร์เซ็นไทล์ที่ 90 และ 99 จะวัดคุณภาพและความยั่งยืนของประสิทธิภาพ โดยตรวจหาการลดลงทันทีและการก้าวที่ไม่สอดคล้องกันซึ่งเมตริกเซสชันที่ช้าอาจมองข้ามไป
บทสรุป
การเพิ่มประสิทธิภาพที่ประสบความสำเร็จต้องใช้กลยุทธ์ที่ครอบคลุม นักพัฒนาแอปควรใช้เซสชันที่ช้าเป็นเรดาร์หลักในการตรวจหาประสิทธิภาพที่ลดลงอย่างรุนแรง จากนั้นตรวจสอบ FPS เฉลี่ย เปอร์เซ็นไทล์ที่ 90 และ 99 เพื่อวินิจฉัยสาเหตุพื้นฐานและยืนยันความราบรื่นที่แท้จริงของเกมเพลย์ การผสานรวมเมตริกเหล่านี้จะช่วยให้แอปพลิเคชันของคุณมอบประสบการณ์การใช้งานที่ยั่งยืนและยอดเยี่ยมอย่างสม่ำเสมอ
แหล่งข้อมูลเพิ่มเติม
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับเทคนิคการสร้างโปรไฟล์ขั้นสูง การติดตั้งใช้งาน Frame Pacing API และกลยุทธ์การเพิ่มประสิทธิภาพเฉพาะเอนจิน โปรดดูเอกสารสำหรับนักพัฒนาแอป Android อย่างเป็นทางการ
- Android Vitals: เซสชันที่ช้า: ทำความเข้าใจวิธีที่ Google Play วัดและรายงานระยะเวลาการแสดงผลช้าที่ต่อเนื่อง ซึ่งส่งผลกระทบต่อประสบการณ์การใช้งานของผู้ใช้โดยตรง "เซสชันที่ช้า" กำหนดไว้ว่าเป็นเซสชันของผู้ใช้ที่มีเฟรมมากกว่า 25% ช้า (เช่น ใช้เวลามากกว่า 50 มิลลิวินาที ซึ่งเทียบเท่ากับ 20 FPS)
- นักพัฒนาแอป Android: เพิ่มประสิทธิภาพเกม: สำรวจ ฮับกลางสำหรับการเพิ่มประสิทธิภาพเกม Android คู่มือที่ครอบคลุมนี้จะอธิบายแนวทางปฏิบัติแนะนำ และเครื่องมือสร้างโปรไฟล์ (เช่น APA และ Perfetto) เพื่อช่วยให้คุณ เพิ่มประสิทธิภาพโดยรวมของเกมได้สูงสุด