FPS trung bình
Tốc độ khung hình mượt mà và ổn định là yếu tố quan trọng để mang lại trải nghiệm chơi trò chơi chất lượng cao trên thiết bị Android. Khi đo lường hiệu suất trò chơi, bạn nên đo lường FPS trung bình làm đường cơ sở để có được thông tin cơ bản về trải nghiệm. Bạn nên tối ưu hoá trò chơi để đạt tốc độ khung hình trung bình là 60 FPS nhằm đảm bảo trải nghiệm chơi game tuyệt vời.
FPS P90 và P99 để đảm bảo độ ổn định
Với tốc độ trung bình mượt mà là 60 khung hình/giây, trò chơi vẫn có thể gặp phải tình trạng giật cục không liên tục, hiện tượng giật hình và độ trễ đầu vào không thể đoán trước, dẫn đến trải nghiệm không tốt cho người chơi.
Vì vậy, độ ổn định của khung hình cũng quan trọng như việc theo dõi tốc độ khung hình trung bình. Đây là nơi bạn nên đo lường các chỉ số tốc độ khung hình P90 và P99 làm đường cơ sở nhất quán và chỉ báo giật hình tương ứng. Những chỉ số này ghi lại "phần cuối" của hiệu suất để bạn tối ưu hoá độ mượt của trải nghiệm người chơi.
Chỉ số
- Tốc độ khung hình trung bình (đường cơ sở): Chỉ số cơ bản này cung cấp đường cơ sở chung về hiệu suất của trò chơi. Mặc dù đây là điểm chuẩn tiêu chuẩn, nhưng phép tính trung bình có nghĩa là không thể phát hiện được tình trạng giảm khung hình không liên tục và hiện tượng giật hình nhỏ, khiến chỉ số này không đủ để thể hiện trải nghiệm của người chơi.
- P90 FPS (đường cơ sở nhất quán ở phân vị thứ 10): Chỉ số này cho biết 90% số khung hình của bạn vượt quá đường cơ sở nhất quán này và chỉ có 10% số khung hình chậm nhất mất nhiều thời gian hơn để kết xuất. Nếu tốc độ khung hình P90 cao và gần với tốc độ khung hình trung bình, thì trò chơi đang chạy ổn định cho phần lớn phiên.
- Tốc độ khung hình P99 (chỉ báo giật ở phân vị thứ 1): Chỉ số này cho biết 99% số khung hình của bạn vượt quá chỉ báo giật này, cụ thể là tách biệt 1% số khung hình chậm nhất. Chỉ số này rất cần thiết để phát hiện các hiện tượng giật hình, độ trễ khi tải tài sản và các đợt tăng đột biến khi kết xuất nhiều tài sản gây ra các lỗi có thể nhìn thấy.
Ví dụ
Bằng cách so sánh tốc độ khung hình trung bình với các chỉ số P90 và P99, bạn có thể chẩn đoán chính xác hành vi cơ bản của một trò chơi.
Trường hợp 1: Đường cong tối ưu (Trò chơi được tối ưu hoá)
- Trung bình: 60 FPS (16,6 mili giây)
- P90: 58 khung hình/giây (17,2 mili giây)
- P99: 52 khung hình/giây (19,2 mili giây)
- Phân tích: Các chỉ số được nhóm lại với nhau. Trò chơi mang lại cảm giác cực kỳ mượt mà và nhất quán. Không có hiện tượng giật hình và ngay cả 1% khung hình tệ nhất cũng khó nhận thấy bằng mắt thường.
Tình huống 2: Điểm nghẽn tải (CPU/GPU Bound)
- Trung bình: 45 FPS (22,2 mili giây)
- P90: 40 khung hình/giây (25,0 mili giây)
- P99: 38 khung hình/giây (26,3 mili giây)
- Phân tích: Tốc độ khung hình trung bình thấp hơn, nhưng vẫn ổn định. P99 không giảm đáng kể so với mức trung bình. Điều này cho thấy hệ thống về cơ bản bị quá tải do các chế độ cài đặt đồ hoạ hoặc hạn chế về độ phân giải. Người chơi sẽ không cảm thấy trò chơi bị kết xuất gián đoạn mà là chậm. Việc giảm các chế độ cài đặt đồ hoạ thường sẽ tăng các chỉ số này một cách đồng đều.
Tình huống 3: 60 FPS không ổn định (Trình biên dịch chương trình đổ bóng / Truyền phát trực tiếp nội dung bị giật)
- Trung bình: 60 FPS (16,6 mili giây)
- P90: 45 FPS (22,2 mili giây)
- P99: 15 khung hình/giây (66,6 mili giây)
- Phân tích: Đây là trường hợp xấu nhất. Mặc dù tốc độ khung hình trung bình có vẻ rất tốt, nhưng P99 cho thấy một vấn đề nghiêm trọng. P99 ở mức 66,6 mili giây có nghĩa là trò chơi hoàn toàn bị treo trong nhiều khung hình cùng một lúc. Điều này cho thấy các giá trị ngoại lệ nghiêm trọng – thường là do các nút thắt CPU, độ trễ khi truyền phát trực tiếp nội dung (ví dụ: RAM hoặc bộ nhớ chậm) hoặc các vấn đề do quá trình biên dịch chương trình đổ bóng gây ra.
Đo lường
Để đo lường hiệu quả FPS trung bình, P90 và P99 FPS, bạn có thể sử dụng 2 phương thức sau. Phương pháp đầu tiên là phân tích dấu vết hệ thống bằng Android Performance Analyzer (APA), một công cụ lập hồ sơ hiệu suất. Phương thức thứ hai là sử dụng lệnh adb dumpsys SurfaceFlinger --timestats hiện có.
1. Đo lường bằng APA
Bằng cách sử dụng APA, bạn có thể ghi lại dấu vết hệ thống và phân tích chính xác dữ liệu khung thông qua các truy vấn SQL. Hãy làm theo các bước sau để đo lường các chỉ số:
Ghi lại dấu vết bằng APA: Chạy trò chơi và sử dụng APA để ghi lại dấu vết hệ thống trong phân đoạn mà bạn muốn phân tích (ví dụ: một điểm trong quá trình chơi mà bạn nghi ngờ có hiện tượng giảm khung hình). Sau khi thiết bị được kết nối và quá trình ghi dấu vết hoàn tất, dữ liệu dấu vết sẽ tải trong giao diện APA.
Màn hình chụp dấu vết hoặc màn hình dấu vết đã tải Nhấp vào thẻ SQL trong APA: Sau khi màn hình phân tích dấu vết mở ra, hãy nhấp vào thẻ SQL trong vùng điều hướng trên cùng hoặc bên của giao diện người dùng để mở môi trường trình xử lý dấu vết, nơi bạn có thể truy vấn dữ liệu trực tiếp.
Dán truy vấn SQL vào thẻ APA SQL: Sao chép truy vấn SQL sau đây rồi dán vào trường nhập dữ liệu truy vấn. Truy vấn này xác định quy trình SurfaceFlinger, tính toán khoảng thời gian giữa các khung hình dựa trên dấu thời gian cập nhật màn hình thực tế và lấy ra tốc độ khung hình trung bình, tốc độ khung hình 10% dưới cùng (P90) và tốc độ khung hình 1% dưới cùng (P99).
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;Nhấp vào "Run Query" (Chạy truy vấn): Nhấp vào nút Run Query (Chạy truy vấn) (hoặc biểu tượng thực thi) gần trường nhập dữ liệu truy vấn. Sau khi quá trình thực thi truy vấn hoàn tất, tổng số khung hình được đo (
total_presented_frames), tốc độ khung hình trung bình (average_fps), 10% FPS thấp nhất (low_10_fps) và 1% FPS thấp nhất (low_1_fps) sẽ xuất hiện trong một bảng ở ngăn kết quả.
Màn hình cho thấy truy vấn SQL đã thực thi và 4 chỉ số thu được hiển thị trong một bảng
2. Đo lường bằng adb (dumpsys SurfaceFlinger)
Để đo lường hiệu quả FPS trung bình, P90 và P99, bạn có thể sử dụng lệnh timestats surfaceflinger dumpsys của Android. Công cụ này cung cấp FPS trung bình và biểu đồ thời gian presentToPresent cho tất cả các lớp đang được kết xuất. Thời gian presentToPresent của một khung hình là khoảng thời gian giữa khung hình hiện tại và khung hình trước đó đang được vẽ.
Sau đây là hướng dẫn từng bước để thu thập và tính toán các chỉ số này cho trò chơi của bạn:
Bắt đầu ghi lại: Chạy lệnh sau bằng các cờ enable và clear để bắt đầu ghi lại thông tin:
adb shell dumpsys SurfaceFlinger --timestats -clear -enableThông tin kết xuất: Khi trò chơi đã được chơi đủ lâu, hãy chạy lại lệnh bằng cờ kết xuất để xuất thông tin:
adb shell dumpsys SurfaceFlinger --timestats -dumpLọc theo lớp: Thông tin được kết xuất cung cấp dữ liệu cho tất cả các lớp do SurfaceFlinger kết xuất. Bạn phải tìm phần tương ứng với trò chơi của mình bằng cách lọc dựa trên
layerName(ví dụ: layerName = SurfaceView[com.example.yourgame...]).layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833Xác định FPS trung bình: FPS trung bình cho mỗi lớp được tính toán tự động và xuất hiện ngay trong đầu ra kết xuất (ví dụ: averageFPS = 30.179).
... averageFPS = 30.179 ...Tính tốc độ khung hình P90 và P99: Để tìm chỉ số P90 và P99, bạn cần phân tích totalFrames và biểu đồ tần suất
presentToPresentđược cung cấp trong tệp kết xuất.totalFrames = 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=0A. Ví dụ về khái niệm (Bảng phân phối tích luỹ) Giả sử phiên chơi trò chơi của bạn ghi nhận tổng số khung hình là 1.000. Để tìm P90 và P99, bạn tính toán các ngưỡng mili giây mà tại đó số lượng khung hình tích luỹ đạt đến 900 khung hình (90%) và 990 khung hình (99%) tương ứng, tính từ nhóm mili giây thấp nhất.
Thời gian kết xuất khung hình (mili giây) Số khung hình (Biểu đồ tần suất) Số khung hình tích luỹ Trạng thái / Cách tính phân vị 16 mili giây 850 850 85% 33 mili giây 100 950 95,0%
(Đạt mục tiêu P90 là 900! → 1000/33 = 30,3 khung hình trên giây)50 mili giây 35 985 98,5% 66 mili giây 10 995 99,5%
(Đạt mục tiêu P99 là 990! → 1000/66 = 15,1 khung hình trên giây)102 mili giây 5 1.000 100% B. Logic triển khai (Mã giả) Nếu bạn đang tự động hoá quy trình phân tích này bằng tập lệnh Python hoặc trình phân tích cú pháp nhật ký, thì bạn có thể triển khai logic để trích xuất các giá trị P90 và P99 từ biểu đồ như sau:
# 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 foundDừng ghi lại: Sau khi thu thập tất cả thông tin cần thiết, bạn nên tắt timestats bằng cách sử dụng cờ vô hiệu hoá:
adb shell dumpsys SurfaceFlinger --timestats -disable
Số phiên bị chậm
Phiên chậm xác định các vấn đề về hiệu suất trên diện rộng trong thực tế. Một phiên được xem là "chậm" nếu hơn 25% số khung hình giảm xuống dưới một ngưỡng (ví dụ: 20 khung hình/giây). Mặc dù hữu ích trong việc phát hiện các vấn đề quan trọng về bản dựng, nhưng chỉ số này không thể đảm bảo trải nghiệm chất lượng cao và bền vững. Một trò chơi có thể tránh được ngưỡng SlowSession nhưng vẫn gặp phải tình trạng giật hình nhỏ ảnh hưởng đến trải nghiệm mượt mà ở tốc độ 60 khung hình/giây.
Mặc dù cả hai đều bắt nguồn từ thời gian khung hình, nhưng "Phiên chậm" và "Tốc độ khung hình" đóng vai trò khác nhau. Các chỉ số FPS trung bình, P90 và P99 đo lường chất lượng và tính bền vững của hiệu suất, phát hiện các trường hợp giảm tốc độ tức thời và tốc độ không nhất quán mà chỉ số Phiên bị chậm có thể bỏ qua.
Kết luận
Để tối ưu hoá hiệu suất thành công, bạn cần có một chiến lược toàn diện. Nhà phát triển nên sử dụng Slow Sessions làm ra-đa chính để phát hiện tình trạng giảm hiệu suất nghiêm trọng, sau đó kiểm tra FPS trung bình, P90 và P99 để chẩn đoán các nguyên nhân cơ bản và xác minh độ mượt thực tế của lối chơi. Bằng cách tích hợp các chỉ số này, bạn có thể đảm bảo ứng dụng của mình mang lại trải nghiệm người dùng bền vững và đặc biệt một cách nhất quán.
Tài nguyên khác
Để tìm hiểu thêm về các kỹ thuật lập hồ sơ nâng cao, cách triển khai Frame Pacing API và các chiến lược tối ưu hoá dành riêng cho công cụ, hãy xem tài liệu chính thức dành cho nhà phát triển Android:
- Android vitals: Phiên bị chậm: Tìm hiểu cách Google Play đo lường và báo cáo các khoảng thời gian kết xuất chậm kéo dài, điều này ảnh hưởng trực tiếp đến trải nghiệm người dùng. "Phiên chậm" được xác định là một phiên của người dùng mà trong đó có hơn 25% số khung hình bị chậm (ví dụ: mất hơn 50 mili giây, tương đương với 20 khung hình/giây).
- Nhà phát triển Android: Tối ưu hoá hiệu suất trò chơi: Khám phá trung tâm chính để tối ưu hoá trò chơi trên Android. Hướng dẫn toàn diện này trình bày các phương pháp hay nhất, các công cụ lập hồ sơ (chẳng hạn như APA và Perfetto) để giúp bạn tối đa hoá hiệu suất tổng thể của trò chơi.