コンソールから文字を読み込み、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は真になります。
同色の文字の集まりを一度に描画することで、効率よく書こうとしています。
ソース見てませんが、
ループ処理中のCPU時間の消費量はスレッド優先度の問題です。
処理内容はあまり重要ではありません。
速度を気にするなら必要な部分だけ更新するものですが
まあどういうきっかけで描画しているかにもよります。
というか、そもそもDelphiのコードに見えないのは気のせいでしょうか。
失礼、上のコードはC++Builderのコードです。
アドバイスありがとうございました。
試しに、必要な部分だけ更新するようにしてみます。
それなりに速くなりました。
一応、解決ということにします。
ツイート | ![]() |