2009-07-20 8 views
1

この線画作成ルーチンを最適化する方法は? memcpyはより速く動作するでしょうか?線画作成ルーチン

void ScreenDriver::HorizontalLine(int wXStart, int wXEnd, int wYPos, 
    COLORVAL Color, int wWidth) 
{ 
    int iLen = wXEnd - wXStart + 1; 

    if (iLen <= 0) 
    { 
     return; 
    } 
    while(wWidth-- > 0) 
    { 
     COLORVAL *Put = mpScanPointers[wYPos] + wXStart; 
     int iLen1 = iLen; 

     while(iLen1--) 
     { 
      *Put++ = Color; 
     } 
     wYPos++; 
    } 
} 
+0

いくつかの追加情報: - COLORVAL - > uint16_t - プラットフォーム - > IMX31 ARM – tommyk

答えて

4

「memcpy」の代わりに「memset」と言っていると思います。コードのこのビットの交換:速い可能性があり

memset(Put, Color, iLen); 

while (iLen--) 
{ 
    *Put++ = Color; 
} 

のが、ことはそんなにあなたのターゲットCPU、メモリアーキテクチャに依存し、ILENの典型的な値が検出されました。大きな勝利にはなりそうもありませんが、時間があれば、その種の運動が最適化を実際に理解する唯一の方法であるため、代替案を測定することをお勧めします。

もちろん、このmemset()の使用は、COLORVALが文字サイズの場合にのみ有効です。

1

いいえ、実際はありません。 memcpyはメモリをコピーします。これは読み書きです。読み込みは必要ありません。 memsetは書き込みのみを行い、バイトを書き込むため、COLORVALもバイトでない限り、どちらも動作しません。いいえ、それをそのままにしておくと、コンパイラはかなり良いコードを生成するはずです。おそらくメモリ帯域幅によって制限されていることを忘れないでください。

0

私はmemcpyが直接のポインタアクセスよりも少し速いことを個人的な経験から知っています...しかし、それは通常は基本的な最適化ではありません。

0

アセンブリーでは、水平線を描画する最速の方法の1つに値を指定して配列を塗りつぶします。stosb, stosw, stosd命令を使用します。 memsetはstosbを使用するように最適化されています。 DWORD値を使用するには、以下の1行を描画するように我々は

__asm { 
     cld 
     mov eax, color 
     mov ecx, screen_width 
     mov edi, video_buffer 
     rep stosd 
} 

、コードを書くことができますしかし、私はあなたの内側のwhileループはとにかくstosdを使用するようにコンパイラによって最適化されることをかなり確信しています。

1

他に何かをする前に、利用可能な低レベルプロファイリングツールを使用するのが最善でしょう。少なくとも、大量のテストケースや3の全体的なタイミングを取得してください。ベースライン測定がなければ、暗闇の中で撮影しています。 (私が知っておくべき、私は他の誰とこのよう有罪だ!)

私は(memsetを

  1. 、それはピクセルごとのオーバーヘッドの公平なビットを持っているようなあなたのコードが見えることに注意して言ったことは、 )コールが勝利する可能性があります(COLORVALがsizeof(char)の場合)。

  2. 代わりに、役立つ可能性ループをアンロール - これはあなたの入力データに大きく依存して、マシンアーキテクチャなど

  3. あなたILEN値は合理的には、各ILEN値のためのカスタム関数を書いて検討するかもしれない制限されている場合は、その完全にアンロールされ(スイッチの最初の数少ないケースをインライン化して)、関数ポインタの配列を通じて大きなケースを呼び出します。

  4. 最も速いオプションは、通常、組み立てに頼ることです。

0

内側のループをアンロールすることはできますが、実際には水平に近いラインの場合のみ問題になります。

水平に近いラインでは、スキャンポインタのテーブルを設定する時間が長くなります。

色、幅、線種、終端スタイルだけでなく、XORやエイリアシングなどの描画モードについても、現実的な状況では、

  1. 各「行」とするために(あなたのアルゴリズムが何であるか実際にある)非常に高速なアルゴリズムが存在し、実際にポリゴンフィルである、および/または

  2. 特殊用途の機械語ルーチン(スタックに格納されている)オンザフライで生成されます。オプション固有の特殊ルーチンを持つオプションが多すぎるためです。アルゴリズムは必要ありませんオプションごとにピクセル単位で継続的に質問しています。

関連する問題