Sdílet prostřednictvím


Dotazy na výkon na straně serveru

Dobrý výkon vykreslování na serveru je kritický pro stabilní frekvence snímků a dobré uživatelské prostředí. Je důležité pečlivě monitorovat charakteristiky výkonu na serveru a v případě potřeby optimalizovat. Data o výkonu je možné dotazovat prostřednictvím vyhrazených funkcí rozhraní API.

Nejvýraznější pro výkon vykreslování je vstupní data modelu. Vstupní data můžete upravit podle popisu při konfiguraci převodu modelu.

Výkon aplikace na straně klienta může být také kritickým bodem. Pro podrobnou analýzu výkonu na straně klienta se doporučuje provést performance trace.

Časová osa klienta nebo serveru

Než začnete podrobně popisovat různé hodnoty latence, je vhodné se podívat na body synchronizace mezi klientem a serverem na časové ose:

Pipeline timeline

Obrázek ukazuje, jak:

  • Odhad pozice spustí klient s konstantní frekvencí 60-Hz (každých 16,6 ms).
  • server pak začne vykreslovat na základě pozice.
  • server odešle zpět zakódovaný obrázek videa.
  • klient tuto image dekóduje, provede nad ním určitou práci s procesorem a GPU a pak obrázek zobrazí.

Dotazy na statistiky rámců

Statistiky rámců poskytují některé základní informace o posledním snímku, například latenci. Data poskytnutá ve FrameStatistics struktuře se měří na straně klienta, takže rozhraní API je synchronní volání:

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
    }
}

Načtený FrameStatistics objekt obsahuje následující členy:

Člen Vysvětlení
LatencyPoseToReceive Latence z fotoaparátu představuje odhad na klientském zařízení, dokud nebude plně dostupný rámec serveru pro tuto pozici klientské aplikace. Tato hodnota zahrnuje odezvu sítě, dobu vykreslování serveru, dekódování videa a kompenzaci zadržování. Viz interval 1 na obrázku výše.
LatenceReceiveToPresent Latence z dostupnosti přijatého vzdáleného rámce, dokud klientská aplikace nevolá PresentFrame na procesoru. Viz interval 2 na obrázku výše.
LatencePresentToDisplay Latence od prezentování rámce na procesoru, dokud se nezsvítí displej. Tato hodnota zahrnuje čas klienta GPU, veškeré ukládání snímků do vyrovnávací paměti prováděné operačním systémem, obnovení hardwaru a vypršení časového limitu zobrazení závislého na zařízení. Viz interval 3 na obrázku výše.
TimeSinceLastPresent Doba mezi následnými voláními PresentFrame na procesoru. Hodnoty větší než doba trvání zobrazení (například 16,6 ms na klientském zařízení 60–Hz) značí problémy způsobené tím, že klientská aplikace nedokončí úlohu procesoru včas.
VideoFramesReceived Počet snímků přijatých ze serveru za poslední sekundu
VideoFrameReusedCount Počet přijatých snímků za poslední sekundu, které byly použity na zařízení více než jednou. Nenulové hodnoty označují, že rámce se musely opakovaně používat a znovu projektovat z důvodu zpoždění sítě nebo nadměrné doby vykreslování serveru.
VideoFramesSkipped Počet přijatých snímků v poslední sekundě, které byly dekódovány, ale nezobrazují se na displeji, protože přišel novější rámec. Nenulové hodnoty označují, že zpoždění sítě způsobilo zpoždění více snímků a následné doručení do klientského zařízení v nárazovém nárůstu.
VideoFramesDiscarded Velmi podobně jako VideoFramesSkipped, ale důvodem zahození je, že snímek přišel tak pozdě, že už nemůže být korelován s žádnou nevyřízenou pozicí. Pokud k tomuto zahození dojde, dojde k závažnému kolizí sítě.
VideoFrameMinDelta Minimální doba mezi dvěma po sobě jdoucími snímky přicházejícími během poslední sekundy. Společně s VideoFrameMaxDelta poskytuje tento rozsah signál o zpoždění způsobeném kodekem sítě nebo videa.
VideoFrameMaxDelta Maximální doba mezi dvěma po sobě jdoucími snímky přicházejícími během poslední sekundy. Společně s VideoFrameMinDelta poskytuje tento rozsah informace o zadržování způsobené kodekem sítě nebo videa.

Součet všech hodnot latence je obvykle mnohem větší než dostupný čas rámce při 60 Hz. To je v pořádku, protože se paralelně spouští více snímků a nové požadavky na snímky se spustí s požadovanou frekvencí snímků, jak je znázorněno na obrázku. Pokud se ale latence změní na příliš velký, ovlivní kvalitu opětovného projektu v pozdní fázi a může ohrozit celkové prostředí.

VideoFramesReceived, VideoFrameReusedCounta VideoFramesDiscarded lze použít k měření výkonu sítě a serveru. Kombinace nízké VideoFramesReceived hodnoty a vysoké VideoFrameReusedCount hodnoty může značit zahlcení sítě nebo nízký výkon serveru. Vysoká VideoFramesDiscarded hodnota také označuje zahlcení sítě.

TimeSinceLastPresentNakonec, VideoFrameMinDeltaa VideoFrameMaxDelta dát představu o rozptylu příchozích snímků videa a místních prezentovaných volání. Vysoká odchylka znamená netable frame rate.

Žádná z výše uvedených hodnot neposkytuje jasné označení čisté latence sítě (červené šipky na obrázku), protože přesný čas, kdy je server zaneprázdněn vykreslováním, je potřeba odečíst od hodnoty LatencyPoseToReceiveodezvy . Část celkové latence na straně serveru je informace, které nejsou pro klienta dostupné. Následující odstavec však vysvětluje, jak je tato hodnota přibližná prostřednictvím dodatečného vstupu ze serveru a vystavena prostřednictvím NetworkLatency hodnoty.

Dotazy posouzení výkonu

Dotazy na posouzení výkonu poskytují podrobnější informace o úloze procesoru a GPU na serveru. Vzhledem k tomu, že se data požadují ze serveru, dotazování snímku výkonu se řídí obvyklým asynchronním vzorem:

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...
        }
    });
}

Na rozdíl od objektu FrameStatistics PerformanceAssessment objekt obsahuje informace na straně serveru:

Člen Vysvětlení
Časový procesor Průměrná doba procesoru serveru na rámec v milisekundách
TimeGPU Průměrná doba GPU serveru na rámec v milisekundách
Procesor využití Celkové využití procesoru serveru v procentech
UtilizationGPU Celkové využití GPU serveru v procentech
Procesor paměti Celkové využití hlavní paměti serveru v procentech
MemoryGPU Celkové využití vyhrazené paměti videa v procentech procesoru GPU serveru
Latence sítě Přibližná průměrná latence sítě zaokrouhlení v milisekundách. Na obrázku výše odpovídá tato hodnota součtu červených šipek. Hodnota se vypočítá odečtením skutečné doby vykreslování serveru od LatencyPoseToReceive hodnoty .FrameStatistics I když tato aproximace není přesná, udává latenci sítě izolovanou od hodnot latence vypočítaných v klientovi.
PolygonsRendered Počet trojúhelníků vykreslených v jednom rámečku. Toto číslo také zahrnuje trojúhelníky, které se při vykreslování vykreslují později. To znamená, že toto číslo se v různých pozicích fotoaparátu moc neliší, ale výkon se může výrazně lišit v závislosti na rychlosti odpočítávání trojúhelníku.
PointsRendered Počet bodů v bodových cloudech vykreslených v jednom rámci. Stejná kritéria pro odpočítání, jak je uvedeno výše, platí PolygonsRendered zde.

Aby bylo možné vyhodnotit hodnoty, každá část má klasifikaci kvality, jako je Great, Good, Mediocre nebo Bad. Tato metrika hodnocení poskytuje přibližnou indikaci stavu serveru, ale nemělo by se považovat za absolutní. Předpokládejme například, že se pro čas GPU zobrazí průměrné skóre. Považuje se za mediokreční, protože se blíží limitu celkového časového rámce. V takovém případě ale může být dobrá hodnota, protože vykreslujete složitý model.

Výstup ladění statistiky

Třída ServiceStatistics je třída jazyka C#, která se zabalí kolem dotazů na statistiku rámce i hodnocení výkonu a poskytuje praktické funkce pro vrácení statistik jako agregovaných hodnot nebo jako předem sestaveného řetězce. Následující kód představuje nejjednodušší způsob zobrazení statistik na straně serveru v klientské aplikaci.

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();
    }
}

Výše uvedený kód naplní textový popisek následujícím textem:

ArrServiceStats string output

Rozhraní GetStatsString API formátuje řetězec všech hodnot, ale každá jedna hodnota se dá dotazovat také programově z ServiceStatistics instance.

Existují také varianty členů, které agregují hodnoty v průběhu času. Viz členy s příponou *Avg, *Maxnebo *Total. FramesUsedForAverage Člen určuje, kolik snímků bylo použito pro tuto agregaci.

Dokumentace k rozhraní API

Další kroky