Ortalama FPS
Android cihazlarda yüksek kaliteli bir oyun deneyimi sunmak için sorunsuz ve sabit bir kare hızı çok önemlidir. Oyun performansını ölçerken deneyim hakkında temel bir fikir edinmek için ortalama FPS'yi temel değer olarak ölçmeniz gerekir. Harika bir oyun deneyimi sunmak için oyununuzu ortalama 60 FPS kare hızına ulaşacak şekilde optimize etmeniz gerekir.
Kararlılık için P90 ve P99 FPS
Ortalama 60 FPS ile akıcı bir oyun deneyimi sunulsa da oyun ara sıra takılabilir, mikro takılmalar yaşanabilir ve giriş gecikmesi tahmin edilemez hale gelebilir. Bu durum, oyuncu deneyiminin kötü olmasına neden olur.
Bu nedenle, kare kararlılığı, ortalama kare hızını izlemek kadar önemlidir. Tutarlı temel değer ve takılma göstergesi olarak sırasıyla P90 ve P99 kare hızı metriklerini burada ölçmeniz gerekir. Bu metrikler, oyuncu deneyiminin sorunsuzluğunu optimize etmeniz için performansın "son bölümünü" yakalar.
Metrikler
- Ortalama FPS (temel): Bu temel metrik, oyununuzun performansıyla ilgili genel bir temel sağlar. Standart bir kıyaslama ölçütü olsa da ortalama hesaplama, aralıklı kare düşmelerinin ve mikro takılmaların tespit edilemeyeceği anlamına gelir. Bu nedenle, oyuncu deneyimini tek başına temsil etmek için yeterli değildir.
- P90 FPS (10. yüzdelik dilimde tutarlı temel): Bu, karelerinizin %90'ının bu tutarlı temeli aştığını ve yalnızca en yavaş %10'luk dilimdeki karelerin oluşturulmasının daha uzun sürdüğünü gösterir. P90 kare hızınız yüksekse ve ortalamanıza yakınsa oyun, oturumun büyük bir bölümünde tutarlı bir şekilde iyi çalışıyor demektir.
- P99 FPS (1. yüzdelik dilimde takılma göstergesi): Bu metrik, karelerinizin %99'unun bu takılma göstergesini aştığını, özellikle de en yavaş %1'lik kareleri izole ettiğini gösterir. Bu metrik, mikro takılmaları, öğe yükleme gecikmelerini ve görünür takılmalara neden olan ani öğe yoğunluklu oluşturma artışlarını yakalamak için gereklidir.
Örnekler
Ortalama FPS'nizi P90 ve P99 metrikleriyle karşılaştırarak bir oyunun temel davranışını doğru bir şekilde teşhis edebilirsiniz.
1. Senaryo: Optimum Eğri (Optimum Oyun)
- Ortalama: 60 FPS (16,6 ms)
- P90: 58 FPS (17,2 ms)
- P99: 52 FPS (19,2 ms)
- Analiz: Metrikler birbirine çok yakın. Oyun inanılmaz derecede akıcı ve tutarlı. Mikro takılmalar yoktur ve karelerin en kötü% 1'lik kısmı bile insan gözüyle neredeyse fark edilmez.
2. Senaryo: Yük darboğazı (CPU/GPU sınırlı)
- Ortalama: 45 FPS (22,2 ms)
- P90: 40 FPS (25,0 ms)
- P99: 38 FPS (26,3 ms)
- Analiz: Ortalama kare hızı daha düşüktür ancak bu durum tutarlıdır. P99, ortalamaya kıyasla önemli ölçüde düşmez. Bu, sistemin esasen grafik ayarları veya çözünürlük kısıtlamaları nedeniyle aşırı yüklendiğini gösterir. Oyunun takılıyormuş gibi değil, yavaşlıyormuş gibi hissedilmesine neden olur. Grafik ayarlarını düşürmek genellikle bu metrikleri eşit şekilde ölçeği artırır.
3. senaryo: Kararsız 60 FPS (Shader Derleme / Öğe Akışı Takılmalar)
- Ortalama: 60 FPS (16,6 ms)
- P90: 45 FPS (22,2 ms)
- P99: 15 FPS (66,6 ms)
- Analiz: Bu, en kötü senaryodur. Ortalama kare hızı mükemmel görünse de P99, kritik bir sorunu ortaya çıkarıyor. 66,6 ms'lik P99, oyunun aynı anda birden fazla kare boyunca tamamen donduğu anlamına geliyor. Bu durum, genellikle CPU darboğazlarından, öğe akışı gecikmelerinden (örneğin, yavaş RAM veya depolama) ya da gölgelendirici derlemesinden kaynaklanan ciddi aykırı değerlere işaret ediyor.
Ölçüm
Ortalama FPS, P90 ve P99 FPS'yi etkili bir şekilde ölçmek için aşağıdaki iki yöntemi kullanabilirsiniz. İlk yöntem, performans profili oluşturma aracı olan Android Performance Analyzer (APA) ile sistem izlerini analiz etmektir. İkinci yöntem, mevcut adb dumpsys SurfaceFlinger --timestats komutunu kullanmaktır.
1. APA ile ölçüm yapma
APA'yı kullanarak sistem izi kaydedebilir ve SQL sorgularıyla kare verilerini hassas bir şekilde analiz edebilirsiniz. Metriklerinizi ölçmek için aşağıdaki adımları uygulayın:
İzlemeyi APA ile yakalama: Oyununuzu çalıştırın ve analiz etmek istediğiniz segment sırasında (ör. oyun sırasında kare düşüşü olduğundan şüphelendiğiniz bir nokta) sistem izlemesini yakalamak için APA'yı kullanın. Cihaz bağlandıktan ve izleme kaydı tamamlandıktan sonra izleme verileri APA arayüzüne yüklenir.
İz yakalama ekranı veya yüklenen iz ekranı APA'da SQL sekmesini tıklayın: İzleme analizi ekranı açıldıktan sonra, verileri doğrudan sorgulayabileceğiniz izleme işleme ortamını açmak için kullanıcı arayüzünün üst veya yan gezinme alanındaki SQL sekmesini tıklayın.
SQL sorgusunu APA SQL sekmesine yapıştırın: Aşağıdaki SQL sorgusunu kopyalayıp sorgu giriş alanına yapıştırın. Bu sorgu, SurfaceFlinger işlemini tanımlar, kare aralıklarını gerçek ekran güncelleme zaman damgalarına göre hesaplar ve ortalama FPS, en düşük %10 (P90) FPS ve en düşük %1 (P99) FPS değerlerini elde eder.
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;"Sorguyu Çalıştır"ı tıklayın: Sorgu giriş alanının yanındaki Sorguyu Çalıştır düğmesini (veya yürütme simgesini) tıklayın. Sorgu yürütme işlemi tamamlandıktan sonra, ölçülen toplam kare sayısı (
total_presented_frames), ortalama kare hızı (average_fps), en düşük% 10 kare hızı (low_10_fps) ve en düşük% 1 kare hızı (low_1_fps) sonuçlar bölmesindeki bir tabloda gösterilir.
Çalıştırılan SQL sorgusunu ve sonuç olarak elde edilen dört metriğin tabloda gösterildiği ekran
2. adb (dumpsys SurfaceFlinger) kullanarak ölçme
Ortalama FPS, P90 ve P99'u etkili bir şekilde ölçmek için Android dumpsys surfaceflinger timestats komutunu kullanabilirsiniz. Bu araç, oluşturulan tüm katmanlar için ortalama FPS ve presentToPresent zamanlama histogramı sağlar. Bir karenin presentToPresent süresi, mevcut kare ile çizilen önceki kare arasındaki aralıktır.
Oyununuz için bu metrikleri toplama ve hesaplama ile ilgili adım adım talimatları aşağıda bulabilirsiniz:
Bilgi yakalamaya başlama: Bilgi yakalamaya başlamak için aşağıdaki komutu enable ve clear işaretleriyle çalıştırın:
adb shell dumpsys SurfaceFlinger --timestats -clear -enableDöküm bilgileri: Oyun yeterince uzun süre oynandıktan sonra, bilgileri çıkarmak için komutu döküm işaretiyle tekrar çalıştırın:
adb shell dumpsys SurfaceFlinger --timestats -dumpKatmana göre filtreleme: Dökülen bilgiler, SurfaceFlinger tarafından oluşturulan tüm katmanların verilerini sağlar.
layerName'ye göre filtreleme yaparak oyununuza karşılık gelen bölümü bulmanız gerekir (örneğin, layerName = SurfaceView[com.example.yourgame...]).layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833Ortalama FPS'yi belirleme: Her katmanın ortalama FPS'si otomatik olarak hesaplanır ve doğrudan döküm çıktısında gösterilir (örneğin, averageFPS = 30.179).
... averageFPS = 30.179 ...P90 ve P99 FPS'yi hesaplama: P90 ve P99 metriklerini bulmak için toplam çerçeve sayısını ve dökümde sağlanan
presentToPresentzamanlama histogramını analiz etmeniz gerekir.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. Kavramsal örnek (kümülatif dağılım tablosu) Oyun oturumunuzun toplam 1.000 kare kaydettiğini varsayalım. %90 ve %99'luk dilimi bulmak için, en düşük milisaniye aralığından başlayarak saydığınızda toplam kare sayısının sırasıyla 900 kareye (%90) ve 990 kareye (%99) ulaştığı milisaniye eşiklerini hesaplarsınız.
Kare süresi (ms) Kare Sayısı (Histogram) Kümülatif Kare Sayısı Yüzdelik Durumu / Hesaplama 16ms 850 850 %85,0 33ms 100 950 %95,0
(900 hedefinin %90'ı tamamlandı → 1.000/33 = 30,3 FPS)50ms 35 985 %98,5 66ms 10 995 %99,5
(990 hedefinin %99'u tamamlandı! → 1000/66 = 15,1 FPS)102ms 5 1.000 %100 B. Uygulama Mantığı (Sözde Kod) Bu analizi bir Python komut dosyası veya günlük ayrıştırıcı kullanarak otomatikleştiriyorsanız histogramdan P90 ve P99 değerlerini ayıklama mantığı aşağıdaki gibi uygulanabilir:
# 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 foundYakalamayı durdurma: Gerekli tüm bilgileri topladıktan sonra devre dışı bırakma işaretini kullanarak zaman istatistiklerini devre dışı bırakmanız gerekir:
adb shell dumpsys SurfaceFlinger --timestats -disable
Yavaş oturumlar
Yavaş oturumlar, yaygın olarak görülen gerçek dünya performans sorunlarını tanımlar. Karelerin% 25'inden fazlası bir eşiğin (ör. 20 FPS) altına düşerse oturum "yavaş" olarak kabul edilir. Bu metrik, kritik derleme sorunlarını tespit etmek için yararlı olsa da tek başına yüksek kaliteli ve sürdürülebilir bir deneyimi garanti edemez. Bir oyun, yavaş oturum eşiğini aşmayabilir ancak yine de 60 FPS'lik akıcı bir deneyimi tehlikeye atan mikro takılma sorunları yaşayabilir.
Her ikisi de kare sürelerinden türetilse de "Yavaş Oturum" ve "Kare Hızı" farklı roller üstlenir. Ortalama, P90 ve P99 FPS metrikleri, performanstaki kaliteyi ve sürdürülebilirliği ölçer. Yavaş oturum metriğinin gözden kaçırabileceği anlık düşüşleri ve tutarsız hızı tespit eder.
Sonuç
Başarılı performans optimizasyonu için kapsamlı bir strateji gerekir. Geliştiriciler, ciddi performans düşüşlerini tespit etmek için birincil radar olarak Yavaş Oturumlar'ı kullanmalı, ardından temel nedenleri teşhis etmek ve oyunun gerçek akıcılığını doğrulamak için ortalama FPS, P90 ve P99 değerlerini incelemelidir. Bu metrikleri entegre ederek uygulamanızın sürekli olarak sürdürülebilir ve olağanüstü bir kullanıcı deneyimi sunduğundan emin olabilirsiniz.
Ek kaynaklar
Gelişmiş profil oluşturma teknikleri, Frame Pacing API'yi uygulama ve motora özel optimizasyon stratejileri hakkında daha fazla bilgi edinmek için resmi Android geliştirici belgelerine göz atın:
- Android Vitals: Yavaş oturumlar: Google Play'in, kullanıcı deneyimini doğrudan etkileyen uzun süreli yavaş oluşturma dönemlerini nasıl ölçtüğünü ve bildirdiğini anlayın. "Yavaş oturum", karelerin% 25'inden fazlasının yavaş olduğu (örneğin, 50 ms'den uzun sürdüğü, 20 FPS'ye eşdeğer) bir kullanıcı oturumu olarak tanımlanır.
- Android Developers: Optimize Game Performance: Android oyun optimizasyonu için merkezi hub'ı keşfedin. Bu kapsamlı rehberde, oyununuzun genel performansını en üst düzeye çıkarmanıza yardımcı olacak en iyi uygulamalar ve profil oluşturma araçları (ör. APA ve Perfetto) ele alınmaktadır.