もっと最適化

PPUはまだまだ最適化できる部分だらけですねぇ。

今日思いついたのをメモしておきます。

CHR-ROMには、2bit per pixelのフォーマットでデータをもっています。
1つのキャラクタは8×8pixelなので、16byteのデータです。
前半8byteは、pixelの下位bit、後半8byteは、pixelの上位bitが入ってます。要するに、インターリーブされています。

書いてて訳わかんなくなりますね。これがまた、ソフトウェアで処理するには非常に扱いづらいフォーマットなんです。

そこで、あらかじめビットの並びを都合がいいように並び替えておけばいいじゃん!っていうことになりました。
具体的には、インターリーブしないように変換するのと、byteの下位から順にpixelデータをつめていくように変換します。
これにより、プログラム中でもかなりクリティカルな部類のループが簡単化されるので、けっこう効くはずです。

また、CHR-ROMのデータをint配列に入れるようにして、16pixel分の描画をまとめて処理するようにしようかと思います。
これでループアンローリングすると、1つのキャラクタがたった4回のループで描画できるようになります。
それだったら、完全にループアンローリングしちゃって、ループ無しにしてしまうのもアリかもしれません。