gprofを使って一番遅いメソッドを調べ
高速化させた。結果としてはそのメソッドでは 4 倍早くなった。具体的にどんな処理で、何を講じたかを書いておこう。
まずメソッドは、CMLcdPixDefault::updatePixel 。残映の処理を行なう処理なので、ピクセルを全てなめている。それが遅い原因みたいだった。処理の一部は以下のとおり。


for( y = start_y; y < end_y; y++ )
for( x = start_x; x < end_x; x++ )
{
switch(LcdBlRvMgr::getPixelStatus(x / expansion, y / expansion))
{
case ON:
fgPixelData[y - start_y][x - start_x] = ((int)pixelData[y][x] + (int)fgPixelData[y - start_y][x - start_x] * ( ai_value - 1 ) ) / ai_value;
(中略)
}
}

この縦横を舐める二重ループと条件判定、残映のための乗算と除算が重い。
結果からいうと以下のように修正した。


for( y = start_y; y < end_y; y++ )
for( x = start_x; x < end_x; x++ )
{
switch(LcdBlRvMgr::getPixelStatus( convertFromReal( x ), convertFromReal( y )))
{
case ON:
fgPixelData[y - start_y][x - start_x] = aiTransientTable[ fgPixelData[y - start_y][x - start_x] ][ pixelData[y][x]];
(中略)
}
}
  • LcdBlRvMgr::getPixelStatus をインライン関数にした
  • x / expansion (expansion は拡大)を、convertFromReal というインラインメソッドにした。このメソッド中ではテーブルにより、x / expansion を返すようにした。
  • aiTransientTable[ ピクセル現在値 ][ ピクセル最新値 ] という残映のための 256x256 のテーブルを作り、それで次の値を計算させるようにした

つまり「メモリを使って高速化」ということです。

コメントを残す

メールアドレスが公開されることはありません。