Tỷ lệ Khung hình

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ó hiểu biết 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.

Tốc độ khung hình 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, một 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 kém 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 (cơ sở): Chỉ số cơ bản này cung cấp cơ sở chung về hiệu suất của trò chơi. Mặc dù là một điểm chuẩn tiêu chuẩn, nhưng việc tính toán 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 siêu 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% khung hình của bạn vượt quá đường cơ sở nhất quán này và chỉ có 10% 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 hiện tượng giật hình 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 FPS (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: Tình trạng tắc nghẽn khi 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 luôn ở mức đó. 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 các hạn chế về độ phân giải. Trò chơi sẽ không bị giật mà sẽ chạy chậm. Việc giảm chế độ cài đặt đồ hoạ thường sẽ tăng các chỉ số này một cách đồng nhất.

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 tuyến 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. Phân vị thứ 99 ở 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 điểm ngoại lệ nghiêm trọng – thường là do các điểm tắc nghẽn CPU, độ trễ khi truyền phát thành phần (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, bạn có thể sử dụng lệnh timestats dumpsys surfaceflinger của Android. Công cụ này cung cấp FPS trung bình và biểu đồ tần suất 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 đó đượ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:

  1. 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 -enable
    
  2. Thô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 -dump
    
  3. Lọc theo lớp: Thông tin 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)#132833
    
  4. Xá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
    ...
    
  5. Tính toán FPS P90 và P99: Để tìm chỉ số P90 và P99, bạn cần phân tích totalFrames và biểu đồ thời gian presentToPresent có 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=0
    

    A. 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/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 found
    
  6. Dừ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 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 nhất quán, bền vững và đặc biệt.

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, ả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 đề cập đến các phương pháp hay nhất, các công cụ phân tích hiệu suất (như Android Performance Analyzer(APA)Perfetto) để giúp bạn tối đa hoá hiệu suất tổng thể của trò chơi.