Aracılığıyla paylaş


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:

Pipeline timeline

Ç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, VideoFrameReusedCountve 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,TimeSinceLastPresentVideoFrameMinDelta 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:

ArrServiceStats string output

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, *Maxveya *Totalolan üyelere bakın. Üye FramesUsedForAverage , bu toplama için kaç çerçevenin kullanıldığını gösterir.

API belgeleri

Sonraki adımlar