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:
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
, VideoFrameReusedCount
a 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ě.
TimeSinceLastPresent
Nakonec, VideoFrameMinDelta
a 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 LatencyPoseToReceive
odezvy . Čá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:
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
, *Max
nebo *Total
. FramesUsedForAverage
Člen určuje, kolik snímků bylo použito pro tuto agregaci.
Dokumentace k rozhraní API
- Vykreslování jazyka C#Připojení ion QueryServerPerformanceAssessmentAsync()
- Vykreslování C++Připojení ion::QueryServerPerformanceAssessmentAsync()