最適化作業も今回はほぼ最後ですが、とりあえず見てわかる範囲の最適化を行ってみて「まあ使えるかな」のレベルになったのでよしとしましょう、というところです。
最後の方の最適化はこんな感じでした。
- メモリアクセスの単位がレジスタ幅未満(通常部は32bit/64bit、SSE2使用部は128bit)になっている部分を強制的にレジスタ幅になるようにしてみる
- メモリアクセスができる限りリニアになるようにコードを変えてみる(メモリのインタリーブ処理、ジグザグスキャン処理など)
- 関数呼び出しでインライン化できそうな関数はインライン化の指示を行う
- インライン化できるほど簡単ではないが呼び出し回数が多く、かつ引数が2つ以下の時は呼び出し規約をfastcallにしてスタックの使用を回避する
・・・こういうことを書き始めるとわかると思いますが、さすがに最適化作業を適当にやることもできないのでIntel VTuneの体験版を入れてみてどんな感じかな~と見てみることにしました。
英語版なので必要な機能しかわからないのですが、とりあえず時間がかかっている(CPU的にとメモリアクセス的に)コードがよくわかるようになったので
どうにかする方針を立ててコードを変更していくことで何とか解消していきました。
さすがに個人で使う分にはちょっと高いですが、Windowsでゲームプログラムをやるにはかなり必須となるものだな~と思いました。
将来的にはIntel C/C++ Compilerとともに購入することになるんでしょうね・・・。
符号化の処理の最適化はほぼ無視しています。今現在で処理が重いのが
- (A)YUV444=>(A)RGB888の変換処理
- Deblock Edge Filterの処理
- ビットストリームの読み込み、ハフマン復号処理
可逆圧縮をサポートするために中間フォーマットとして(A)RGB888と(A)YUV444があるので、それからの変換がちょっと厳しいみたいですね。
日常で思ったことを一つ。
この頃、体が妙にかゆいので医者に診てもらって、軟膏と飲み薬をもらったのですが、その説明で以下のような文章が。
効能:アレルギーによる・・・皮膚のかゆみなどをやわらげる作用が・・・
副作用:服用中、・・・・、皮膚がかゆいなどの症状が・・・
・・・どっちなんですか~。
ま、いいたい意味はわかるんですけどね。<別の用途で飲んでいたときにそうなったらの意味でしょうから