Bicubic(バイキュービック法)~3.さらに高速化編~Tweetまた前回の投稿から間が空いてしまいました。前回のアンセーフコードとマルチスレッドを用いた劇的な高速化に引き続き、今回は『ループの書き方を変える』というコロンブスの卵的な手法を用いたさらなる高速化について紹介します。ソースコードではいきなりですが、前回のものに新たな手法を導入したコードを御覧ください。dst;}このコードを前回と同条件の下で動かしてみると、大体85ms前後をキープできるようになりました。85.38これはなかなかの改善だと思いませんか?どこが変わった?コードを見て気づくとは思いますが、以前よりも長くなっています。速くなったのか?それは横方向と縦方向の処理を別々のループで処理するようにしたことにあります。見て分かるようにParallel.Forのループが二つになっています。ここがミソなんですよね。最初のループでは横方向の拡大だけを行い、結果をxBufという配列にRGB値を格納します。(この時点では中間結果なので小数で保存しておきます)次のループでは縦方向の拡大を行って、先のループの計算結果に掛けあわせて最終的なピクセル値を計算します。いう至って簡単な事です。それがなぜ速くなったのか...もう「そらそうよ」って声が聞こえてきそうですが、バイキュービックは3×3ピクセル分という範囲のデータを使って1ピクセルのRGB値を計算します。その為、ループ中で何度も同じピクセルが参照され、同じ計算結果が幾度も利用されることになります。今回は横方向の計算結果を配列に保存して、縦方向を計算する時にそこからデータを取り出す形にしたことで、横方向において同じ計算をしなくて良くなったことが高速化の要因となります。以前も似たようなことをした気がしますが。原理が分かればなんてことない実に簡単なことだということが分かると思います。補間アルゴリズムSNSでもご購読できます。TwitterでフォローするFeedlyでフォローするたかおファン(surface0)1983年生まれ。趣味はエレキギターなど。最近やってるゲームはWoWs、プリコネ、デレステ。