Delen via


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:

Pipeline timeline

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, VideoFrameReusedCounten 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.

TimeSinceLastPresentVideoFrameMinDeltaTen 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:

ArrServiceStats string output

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, *Maxof *Total. Het lid FramesUsedForAverage geeft aan hoeveel frames zijn gebruikt voor deze aggregatie.

API-documentatie

Volgende stappen