文字をCanvasに高速に描画するには?

解決


doloop  URL  2008-09-19 03:07:29  No: 31993

コンソールから文字を読み込み、Canvasに書こうとしていますが、
どうにも遅いというか、CPUを消費するので困っています。
どこか、悪い部分があるのでしょうか?
下が、現在のプログラムの描画部分です。

for (int r=0;r<Rows;++r) {
  int slen = 0;
  WORD a0 = ConsChars[r*Cols].Attributes;
  int prevFg = FgColorTable[a0&0xF];
  int prevBg = BgColorTable[(a0>>4)&0xF];
  int x = 0;
  int y = r*FontHeight;
  
  for (int c=0;c<Cols;++c) {
    //表示されている画面でのインデックスー>バッファ全体のインデックス
    int i = c + r*Cols;
    WORD a = ConsChars[i].Attributes;
    int fg = FgColorTable[a&0xF];
    int bg = BgColorTable[(a>>4)&0xF];

    if(fg != prevFg || bg!=prevBg){
      SetTextColor(hDC, prevFg);
      SetBkColor(hDC, prevBg);
      TextOutA(hDC, x, y, ss, slen);

      prevFg = fg;
      prevBg = bg;
      slen = 0;
      x = c*FontWidth;
    }

    if (a&COMMON_LVB_TRAILING_BYTE) {
      //not draw text
    } else if (
      (a & COMMON_LVB_LEADING_BYTE) &&
      (i+1 < ConsCharsSize)
    ) {
      ss[slen++] = ConsChars[i].Char.AsciiChar;
      ss[slen++] = ConsChars[i+1].Char.AsciiChar;
    } else {
      ss[slen++] = ConsChars[i].Char.AsciiChar;
    }
  }

  SetTextColor(hDC, prevFg);
  SetBkColor(hDC, prevBg);
  TextOutA(hDC, x, y, ss, slen);
}

ConsCharsはCHAR_INFO型の配列で、文字と色の情報を格納しています。
ConsCharsのサイズがConsCharsSizeで、ConsCharSize==Rows*Colsです。
2バイト文字の1文字目の時、a & COMMON_LVB_LEADING_BYTEは真になります。
同色の文字の集まりを一度に描画することで、効率よく書こうとしています。


monaa  2008-09-19 04:56:28  No: 31994

ソース見てませんが、
ループ処理中のCPU時間の消費量はスレッド優先度の問題です。
処理内容はあまり重要ではありません。


{}?  2008-09-19 06:15:30  No: 31995

速度を気にするなら必要な部分だけ更新するものですが
まあどういうきっかけで描画しているかにもよります。

というか、そもそもDelphiのコードに見えないのは気のせいでしょうか。


doloop  2008-09-22 04:56:50  No: 31996

失礼、上のコードはC++Builderのコードです。
アドバイスありがとうございました。

試しに、必要な部分だけ更新するようにしてみます。


doloop  2008-09-25 02:30:27  No: 31997

それなりに速くなりました。
一応、解決ということにします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加