Prestatiequery's aan serverzijde
Goede renderingprestaties op de server zijn essentieel voor stabiele framesnelheden en een goede gebruikerservaring. Het is belangrijk om prestatiekenmerken op de server zorgvuldig te bewaken en waar nodig te optimaliseren. Prestatiegegevens kunnen worden opgevraagd via toegewezen API-functies.
De renderingprestaties zijn het meest van invloed op de invoergegevens van het model. U kunt de invoergegevens aanpassen zoals beschreven in Het configureren van de modelconversie.
De prestaties van toepassingen aan de clientzijde kunnen ook een knelpunt zijn. Voor een diepgaande analyse van prestaties aan de clientzijde is het raadzaam om een performance trace.
Tijdlijn van client/server
Voordat u dieper ingaat op de verschillende latentiewaarden, is het de moeite waard om de synchronisatiepunten tussen client en server op de tijdlijn te bekijken:
In de afbeelding ziet u hoe:
- een pose-schatting wordt gestart door de client met een constante framesnelheid van 60 Hz (elke 16,6 ms)
- de server vervolgens begint met renderen, op basis van de pose
- de server stuurt de gecodeerde video-afbeelding terug
- de client ontsleutelt de installatiekopieën, voert een aantal CPU- en GPU-werkzaamheden uit en geeft vervolgens de afbeelding weer
Query's voor framestatistieken
Framestatistieken bieden enkele informatie op hoog niveau voor het laatste frame, zoals latentie. De gegevens in de FrameStatistics
structuur worden gemeten aan de clientzijde, dus de API is een synchrone aanroep:
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
}
}
Het opgehaalde FrameStatistics
object bevat de volgende leden:
Lid | Uitleg |
---|---|
LatencyPoseToReceive | Latentie van camerahoudingsraming op het clientapparaat totdat een serverframe voor deze pose volledig beschikbaar is voor de clienttoepassing. Deze waarde omvat netwerkronde, serverweergavetijd, videodecode en jittercompensatie. Zie interval 1 in de bovenstaande afbeelding. |
LatencyReceiveToPresent | Latentie van de beschikbaarheid van een ontvangen extern frame totdat de client-app PresentFrame aanroept op de CPU. Zie interval 2 in de bovenstaande afbeelding. |
LatencyPresentToDisplay | Latentie van het presenteren van een frame op de CPU totdat het beeldscherm oplicht. Deze waarde omvat client GPU-tijd, eventuele framebuffering die wordt uitgevoerd door het besturingssysteem, hardwareherprojectie en scantijd van apparaatafhankelijke weergave. Zie interval 3 in de bovenstaande afbeelding. |
TimeSinceLastPresent | De tijd tussen volgende aanroepen naar PresentFrame op de CPU. Waarden die groter zijn dan de weergaveduur (bijvoorbeeld 16,6 ms op een clientapparaat van 60 Hz) geven problemen aan die worden veroorzaakt doordat de clienttoepassing de CPU-workload niet op tijd voltooit. |
VideoFramesReceived | Het aantal frames dat is ontvangen van de server in de laatste seconde. |
VideoFrameReusedCount | Het aantal ontvangen frames in de laatste seconde dat meer dan één keer op het apparaat is gebruikt. Niet-nulwaarden geven aan dat frames opnieuw moeten worden gebruikt en opnieuw moeten worden geprojecteerd vanwege netwerk-jitter of overmatige serverrenderingstijd. |
VideoFramesSkipped | Het aantal ontvangen frames in de laatste seconde dat is gedecodeerd, maar niet weergegeven omdat er een nieuwer frame is aangekomen. Niet-nulwaarden geven aan dat netwerkjittering ervoor heeft gezorgd dat meerdere frames vertraagd zijn en vervolgens in een burst op het clientapparaat aankomen. |
VideoFramesDiscarded | Zeer vergelijkbaar met VideoFramesSkipped, maar de reden om te worden verwijderd, is dat een frame zo laat kwam dat het niet eens kan worden gecorreleerd met een openstaande houding. Als deze verwijdering plaatsvindt, is er sprake van ernstige netwerkconflicten. |
VideoFrameMinDelta | Minimale tijd tussen twee opeenvolgende frames die tijdens de laatste seconde binnenkomen. Samen met VideoFrameMaxDelta geeft dit bereik een indicatie van jitter die wordt veroorzaakt door de netwerk- of videocodec. |
VideoFrameMaxDelta | Maximale tijd tussen twee opeenvolgende frames die tijdens de laatste seconde binnenkomen. Samen met VideoFrameMinDelta geeft dit bereik een indicatie van jitter die wordt veroorzaakt door de netwerk- of videocodec. |
De som van alle latentiewaarden is doorgaans veel groter dan de beschikbare tijdsbestek op 60 Hz. Dit is ok, omdat meerdere frames parallel worden uitgevoerd en nieuwe frameaanvragen worden gestart op de gewenste framesnelheid, zoals wordt weergegeven in de afbeelding. Als de latentie echter te groot wordt, is dit van invloed op de kwaliteit van de latere faseherprojectie en kan de algehele ervaring in gevaar komen.
VideoFramesReceived
, VideoFrameReusedCount
en VideoFramesDiscarded
kan worden gebruikt om netwerk- en serverprestaties te meten. Een combinatie van een lage VideoFramesReceived
waarde en een hoge VideoFrameReusedCount
waarde kan duiden op netwerkcongestie of slechte serverprestaties. Een hoge VideoFramesDiscarded
waarde geeft ook netwerkcongestie aan.
TimeSinceLastPresent
VideoFrameMinDelta
Ten slotte, en VideoFrameMaxDelta
geef een idee van de variantie van binnenkomende videoframes en lokale huidige oproepen. Hoge variantie betekent instabiele framesnelheid.
Geen van de bovenstaande waarden geeft duidelijke indicatie van pure netwerklatentie (de rode pijlen in de afbeelding), omdat de exacte tijd waarop de server bezet is, moet worden afgetrokken van de retourwaarde LatencyPoseToReceive
. Het gedeelte aan de serverzijde van de algehele latentie is informatie die niet beschikbaar is voor de client. In de volgende alinea wordt echter uitgelegd hoe deze waarde wordt geschat via extra invoer van de server en wordt weergegeven via de NetworkLatency
waarde.
Query's voor prestatiebeoordeling
Query's voor prestatiebeoordeling bieden uitgebreidere informatie over de CPU- en GPU-workload op de server. Omdat de gegevens van de server worden aangevraagd, volgt het uitvoeren van een query op een momentopname van de prestaties het gebruikelijke asynchrone patroon:
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...
}
});
}
In tegenstelling tot het FrameStatistics
object bevat het PerformanceAssessment
object informatie aan de serverzijde:
Lid | Uitleg |
---|---|
TimeCPU | Gemiddelde CPU-tijd van de server per frame in milliseconden |
TimeGPU | Gemiddelde GPU-tijd per frame van de server in milliseconden |
UtilizationCPU | Totaal CPU-gebruik van de server in procent |
UtilizationGPU | Totaal GPU-gebruik van de server in procent |
MemoryCPU | Totaal geheugengebruik van de server in procent |
MemoryGPU | Totaal toegewezen videogeheugengebruik in procent van de GPU van de server |
NetworkLatency | De geschatte gemiddelde retournetwerklatentie in milliseconden. In de bovenstaande afbeelding komt deze waarde overeen met de som van de rode pijlen. De waarde wordt berekend door de werkelijke serverweergavetijd af te trekken van de LatencyPoseToReceive waarde van FrameStatistics . Hoewel deze benadering niet nauwkeurig is, geeft deze een indicatie van de netwerklatentie, geïsoleerd van de latentiewaarden die op de client worden berekend. |
PolygonsRendered | Het aantal driehoeken dat in één frame wordt weergegeven. Dit getal bevat ook de driehoeken die later tijdens het weergeven worden afgeruimd. Dat betekent dat dit aantal niet veel varieert over verschillende cameraposities, maar de prestaties kunnen drastisch variëren, afhankelijk van de driehoekssnelheid. |
PointsRendered | Het aantal punten in puntwolken dat in één frame wordt weergegeven. Dezelfde ruimingscriteria zoals hierboven vermeld voor PolygonsRendered toepassing hier. |
Om u te helpen de waarden te beoordelen, wordt elk gedeelte geleverd met een kwaliteitsclassificatie zoals Geweldig, Goed, Mediocre of Slecht. Deze evaluatiemetriek geeft een ruwe indicatie van de status van de server, maar deze mag niet als absoluut worden gezien. Stel dat u een 'middelmatige' score ziet voor de GPU-tijd. Het wordt als middelmatig beschouwd, omdat het dicht bij de limiet komt voor het totale tijdsbestekbudget. In uw geval is het echter een goede waarde, omdat u een complex model weergeeft.
Uitvoer van statistieken voor foutopsporing
De klasse is een C#-klasse ServiceStatistics
die wordt verpakt rond zowel de framestatistieken als query's voor prestatiebeoordeling en biedt handige functionaliteit voor het retourneren van statistieken als geaggregeerde waarden of als een vooraf gebouwde tekenreeks. De volgende code is de eenvoudigste manier om statistieken aan de serverzijde weer te geven in uw clienttoepassing.
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();
}
}
Met de bovenstaande code wordt het tekstlabel gevuld met de volgende tekst:
Met GetStatsString
de API wordt een tekenreeks van alle waarden opgemaakt, maar elke enkele waarde kan ook programmatisch worden opgevraagd vanuit het ServiceStatistics
exemplaar.
Er zijn ook varianten van de leden, die de waarden in de loop van de tijd aggregeren. Zie leden met achtervoegsel *Avg
, *Max
of *Total
. Het lid FramesUsedForAverage
geeft aan hoeveel frames zijn gebruikt voor deze aggregatie.
API-documentatie
- C# Rendering Verbinding maken ion. QueryServerPerformanceAssessmentAsync()
- C++ Rendering Verbinding maken ion::QueryServerPerformanceAssessmentAsync()