2016-04-02 46 views
1

私はDirect2DネイティブアプリケーションC++で書かれています。レンダー機能は1秒間に約60回呼び出され、約1,000の図形(基本的に楕円形)を表示することを目的としています。レンダリング機能のコードを以下に示します。Direct2DレンダリングのCPU使用率

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

ブラシは、楕円と変換が始まり(エンティティconstrucor)で作成されます。

私の質問は、これらのパラメータで私のCPUが常に約8/9%であることが正常である場合です。私は0に近い値を期待していたでしょう(たとえUpdate関数が常に呼び出されたとしても、CPU使用率が0になるレンダリング関数にコメントすると)。

答えて

0

私の同様のテストアプリケーションです。私はタイマを介して20 msごとに再描画を呼び出します。ペイントイベントでは、線形のグラデーションブラシとビットマップで1000個の長方形を描画します。

結果として、各フレームは20msを超え、CPU使用率は10-13%を超えます。

回答:これはかなり正常だと思います。

1

ジオメトリが静的(すべてのフレームを変更するわけではありません)の場合は、geometry realizationsをご覧ください。これにより、より多くの数のプリミティブをレンダリングするCPUコストを劇的に下げることができます。さらにパフォーマンスが必要な場合は、sprite batchを試してみてください。シェイプをビットマップに保存し、プリミティブごとのアンチエイリアス処理を必要としない限り、多数のシェイプをレンダリングする最速の方法です。