2016-04-02 23 views
1

Ich habe eine Direct2D native Anwendung in C++ geschrieben. Die Renderfunktion wird etwa 60 Mal pro Sekunde aufgerufen und soll etwa 1000 Grafikgeometrien (im Wesentlichen Ellipsen) anzeigen. Im Anschluss wird der Code der Rendering-Funktion:Direct2D Rendering CPU-Auslastung

void Render() 
{ 
    pRenderTarget->BeginDraw(); 
    pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::Black)); 

    const auto transform = D2D1::Matrix3x2F::Identity(); 
    pRenderTarget->SetTransform(transform); 

    // draw all entities 
    for (auto& e : entities) 
    { 
     if (e) 
      e->Draw(pRenderTarget, transform); 
    } 

    pRenderTarget->EndDraw(); 
} 


void Entity::Draw(ID2D1RenderTarget* pTarget, const D2D1_MATRIX_3X2_F& worldTransform) const 
{ 
    pTarget->SetTransform(transform * worldTransform); 
    pTarget->FillEllipse(ellipse, pBrush); 
    pTarget->SetTransform(worldTransform); 
} 

Bürsten, Ellipsen und Transformationen werden zu Beginn (entity construcor) erstellt.

Meine Frage ist, wenn es normal ist, dass mit diesen Parametern meine CPU immer um 8/9% ist. Ich hätte einen Wert nahe 0 erwartet (wenn ich die Renderfunktion kommentiere, sinkt die CPU-Auslastung auf 0, selbst wenn die Update-Funktion zum Beispiel immer aufgerufen wird).

Antwort

0

In meiner ähnlichen Testanwendung. Ich rufe alle 20 ms über den Timer neu an. In Paint-Ereignis zeichne ich 1000 Rechtecke mit linearem Farbverlauf Pinsel und Bitmap.

Im Ergebnis: jeder Frame Zeichnung über 20ms und CPU-Auslastung über 10-13%.

Antwort: Ich denke, dass es ganz normal ist.

1

Wenn Ihre Geometrie statisch ist (nicht jeden Frame ändert), sehen Sie sich geometry realizations an. Dies sollte die CPU-Kosten zum Rendern einer größeren Anzahl von Grundelementen dramatisch senken. Wenn Sie noch mehr Leistung benötigen, können Sie auch versuchen, eine sprite batch; Dies ist möglicherweise der schnellste Weg, um eine große Anzahl von Formen zu rendern, vorausgesetzt, Sie können die Form (en) in einer Bitmap speichern und benötigen kein primitives Anti-Aliasing.