Sunucu tarafı performans sorguları
Sunucuda iyi işleme performansı, kararlı kare hızları ve iyi bir kullanıcı deneyimi için kritik öneme sahiptir. Sunucudaki performans özelliklerini dikkatle izlemek ve gerektiğinde iyileştirmek önemlidir. Performans verileri ayrılmış API işlevleri aracılığıyla sorgulanabilir.
İşleme performansı için en etkili olan model giriş verileridir. Giriş verilerini Model dönüştürmeyi yapılandırma bölümünde açıklandığı gibi değiştirebilirsiniz.
İstemci tarafı uygulama performansı da bir performans sorunu olabilir. İstemci tarafı performansına ilişkin ayrıntılı bir analiz için bir alınması performance traceönerilir.
İstemci/sunucu zaman çizelgesi
Çeşitli gecikme süresi değerleriyle ilgili ayrıntılı bilgi vermeden önce zaman çizelgesinde istemci ile sunucu arasındaki eşitleme noktalarına göz atabilirsiniz:
Çizimde aşağıdakiler gösterilmektedir:
- Bir Pose tahmini , istemci tarafından sabit 60-Hz kare hızında (her 16,6 ms) başlatılır
- ardından sunucu, poza göre işlemeye başlar
- sunucu kodlanmış video görüntüsünü geri gönderir
- istemci görüntünün kodunu çözer, üzerinde CPU ve GPU çalışması yapar ve ardından görüntüyü görüntüler
Kare istatistik sorguları
Çerçeve istatistikleri, son kare için gecikme süresi gibi bazı üst düzey bilgiler sağlar. Yapıda FrameStatistics
sağlanan veriler istemci tarafında ölçülür, dolayısıyla API zaman uyumlu bir çağrıdır:
void QueryFrameData(RenderingSession session)
{
FrameStatistics frameStatistics;
if (session.GraphicsBinding.GetLastFrameStatistics(out frameStatistics) == Result.Success)
{
// do something with the result
}
}
void QueryFrameData(ApiHandle<RenderingSession> session)
{
FrameStatistics frameStatistics;
if (session->GetGraphicsBinding()->GetLastFrameStatistics(&frameStatistics) == Result::Success)
{
// do something with the result
}
}
Alınan FrameStatistics
nesne aşağıdaki üyeleri barındırıyor:
Üye | Açıklama |
---|---|
LatencyPoseToReceive | Bu poz için bir sunucu çerçevesi istemci uygulaması tarafından tamamen kullanılabilir olana kadar istemci cihazında kamera poz tahmini gecikmesi. Bu değer ağ gidiş dönüşlerini, sunucu işleme süresini, video kodunu çözmeyi ve değişim telafisini içerir. Yukarıdaki çizimde aralık 1'e bakın . |
LatencyReceiveToPresent | İstemci uygulaması CPU'da PresentFrame'i çağırana kadar alınan uzak çerçevenin kullanılabilirlik süresi. Yukarıdaki çizimde aralık 2'ye bakın . |
LatencyPresentToDisplay | Ekran ışığı yanana kadar CPU'da bir çerçeve sunma gecikmesi. Bu değer istemci GPU süresini, işletim sistemi tarafından gerçekleştirilen çerçeve arabelleği almayı, donanım yeniden üretmeyi ve cihaza bağlı ekran tarama süresini içerir. Yukarıdaki çizimde yer alan aralık 3'e bakın . |
TimeSinceLastPresent | CPU üzerinde PresentFrame'e yapılan sonraki çağrılar arasındaki süre. Görüntüleme süresinden büyük değerler (örneğin, 60 Hz istemci cihazında 16,6 ms), istemci uygulamasının CPU iş yükünü zamanında bitirmemesinden kaynaklanan sorunları gösterir. |
VideoFramesReceived | Son saniyede sunucudan alınan çerçeve sayısı. |
VideoFrameReusedCount | Cihazda birden çok kez kullanılan son saniyedeki alınan çerçevelerin sayısı. Sıfır olmayan değerler, ağ değişimlerinden veya aşırı sunucu işleme süresinden dolayı çerçevelerin yeniden kullanılması ve yeniden üretilmesi gerektiğini gösterir. |
VideoFramesSkipped | Son saniyedeki kodu çözülen ancak daha yeni bir çerçeve geldiğinden görüntülenmeyen alınan çerçevelerin sayısı. Sıfır olmayan değerler, ağ titremesinin birden çok çerçevenin geciktirilmesine ve ardından istemci cihazına bir seri halinde birlikte ulaşmasına neden olduğunu gösterir. |
VideoFramesDiscarded | VideoFramesSkipped'a çok benzer, ancak atılmasının nedeni, bir çerçevenin o kadar geç gelmesidir ki artık bekleyen herhangi bir pozla bile ilişkilendirilemiyor. Bu atma işlemi gerçekleşirse bazı ciddi ağ çekişmesi söz konusu olur. |
VideoFrameMinDelta | Son saniye boyunca gelen ardışık iki çerçeve arasındaki en düşük süre. VideoFrameMaxDelta ile birlikte bu aralık, ağ veya video codec bileşeninden kaynaklanan bir değişim göstergesi sağlar. |
VideoFrameMaxDelta | Son saniye boyunca gelen ardışık iki çerçeve arasındaki maksimum süre. VideoFrameMinDelta ile birlikte bu aralık, ağ veya video codec bileşeninden kaynaklanan bir değişim göstergesi sağlar. |
Tüm gecikme süresi değerlerinin toplamı genellikle 60 Hz'deki kullanılabilir kare süresinden çok daha büyüktür. Birden çok çerçeve paralel olarak hareket ettiğinden ve çizimde gösterildiği gibi yeni çerçeve istekleri istenen kare hızından atıldığından bu sorun olmaz. Ancak gecikme süresi çok fazla büyürse, geç aşama yeniden oluşturmanın kalitesini etkiler ve genel deneyimi tehlikeye atabilir.
VideoFramesReceived
, VideoFrameReusedCount
ve VideoFramesDiscarded
ağ ve sunucu performansını ölçmek için kullanılabilir. Düşük VideoFramesReceived
bir değerle yüksek VideoFrameReusedCount
değerin birleşimi, ağ tıkanıklığını veya düşük sunucu performansını gösterebilir. Yüksek VideoFramesDiscarded
değer, ağ tıkanıklığını da gösterir.
Son olarak,TimeSinceLastPresent
VideoFrameMinDelta
ve VideoFrameMaxDelta
gelen video çerçevelerinin ve yerel sunum çağrılarının varyansı hakkında bir fikir verin. Yüksek varyans, kararsız kare hızı anlamına gelir.
Yukarıdaki değerlerden hiçbiri saf ağ gecikme süresini net bir şekilde belirtmiyor (çizimdeki kırmızı oklar), çünkü sunucunun işlenmekle meşgul olduğu sürenin gidiş dönüş değerinden LatencyPoseToReceive
çıkarılması gerekiyor. Genel gecikme süresinin sunucu tarafı kısmı, istemci tarafından kullanılamayan bilgilerdir. Ancak sonraki paragrafta bu değerin sunucudan ek girişle yaklaşık olarak nasıl ayarlanıp değer üzerinden NetworkLatency
kullanıma sunulduğu açıklanmaktadır.
Performans değerlendirme sorguları
Performans değerlendirme sorguları , sunucudaki CPU ve GPU iş yükü hakkında daha ayrıntılı bilgi sağlar. Veriler sunucudan istendiğinden, performans anlık görüntüsünü sorgulamak normal zaman uyumsuz deseni izler:
async void QueryPerformanceAssessment(RenderingSession session)
{
try
{
PerformanceAssessment result = await session.Connection.QueryServerPerformanceAssessmentAsync();
// do something with result...
}
catch (RRException ex)
{
}
}
void QueryPerformanceAssessment(ApiHandle<RenderingSession> session)
{
session->Connection()->QueryServerPerformanceAssessmentAsync([](Status status, PerformanceAssessment result) {
if (status == Status::OK)
{
// do something with result...
}
});
}
Nesnenin FrameStatistics
aksine, PerformanceAssessment
nesne sunucu tarafı bilgileri içerir:
Üye | Açıklama |
---|---|
TimeCPU | Milisaniye cinsinden kare başına ortalama sunucu CPU süresi |
TimeGPU | Milisaniye cinsinden kare başına ortalama sunucu GPU süresi |
KullanımCPU | Yüzde cinsinden toplam sunucu CPU kullanımı |
KullanımGPU'su | Yüzde cinsinden toplam sunucu GPU kullanımı |
MemoryCPU | Yüzde cinsinden toplam sunucu ana bellek kullanımı |
MemoryGPU | Sunucu GPU'sunun yüzdesinde toplam ayrılmış video belleği kullanımı |
Ağ Gecikme Süresi | Milisaniye cinsinden yaklaşık ortalama gidiş dönüş ağ gecikmesi. Yukarıdaki çizimde, bu değer kırmızı okların toplamına karşılık gelir. Değeri, gerçek sunucu işleme süresi değerinden LatencyPoseToReceive FrameStatistics çıkarılarak hesaplanır. Bu yaklaşık değer doğru olmasa da, istemcide hesaplanan gecikme süresi değerlerinden yalıtılmış ağ gecikme süresine ilişkin bazı göstergeler verir. |
PolygonsRendered | Tek bir çerçevede işlenen üçgenlerin sayısı. Bu sayı, daha sonra işleme sırasında doruk noktası oluşturulan üçgenleri de içerir. Başka bir deyişle, bu sayı farklı kamera konumlarında çok fazla değişiklik göstermez, ancak performans üçgen kümeleme oranına bağlı olarak önemli ölçüde değişebilir. |
PointsRendered | Nokta bulutlarında tek bir çerçevede işlenen nokta sayısı. Yukarıda PolygonsRendered bahsedilen aynı sonuçlandırma ölçütleri burada geçerlidir. |
Değerleri değerlendirmenize yardımcı olmak için her bölüm Büyük, İyi, Vasat veya Kötü gibi bir kalite sınıflandırmasıyla birlikte gelir. Bu değerlendirme ölçümü sunucunun durumunun kabaca bir göstergesini sağlar, ancak mutlak olarak görülmemelidir. Örneğin, GPU süresi için 'vasat' bir puan gördüğünüzi varsayalım. Genel çerçeve süresi bütçesi sınırına yaklaştığından bu durum vasat olarak kabul edilir. Ancak sizin durumunuzda, karmaşık bir modeli işlediğiniz için yine de iyi bir değer olabilir.
İstatistik hata ayıklama çıkışı
sınıfı ServiceStatistics
, hem çerçeve istatistiklerini hem de performans değerlendirme sorgularını saran ve istatistikleri toplanmış değerler veya önceden oluşturulmuş bir dize olarak döndürmek için kullanışlı işlevler sağlayan bir C# sınıfıdır. Aşağıdaki kod, istemci uygulamanızda sunucu tarafı istatistiklerini göstermenin en kolay yoludur.
ServiceStatistics _stats = null;
void OnConnect()
{
_stats = new ServiceStatistics();
}
void OnDisconnect()
{
_stats = null;
}
void Update()
{
if (_stats != null)
{
// update once a frame to retrieve new information and build average values
_stats.Update(Service.CurrentActiveSession);
// retrieve a string with relevant stats information
InfoLabel.text = _stats.GetStatsString();
}
}
Yukarıdaki kod, metin etiketini aşağıdaki metinle doldurur:
GetStatsString
API tüm değerlerin bir dizesini biçimlendirse de her bir değer örnekten ServiceStatistics
program aracılığıyla sorgulanabilir.
Ayrıca üyelerin zaman içindeki değerleri toplayan çeşitleri de vardır. Son eki *Avg
, *Max
veya *Total
olan üyelere bakın. Üye FramesUsedForAverage
, bu toplama için kaç çerçevenin kullanıldığını gösterir.
API belgeleri
- C# İşleme Bağlan ion. QueryServerPerformanceAssessmentAsync()
- C++ Rendering Bağlan ion::QueryServerPerformanceAssessmentAsync()