半透明エフェクト完成
ラインがそろったら次のピースが落ちてくるまでに徐々に消えていくようなエフェクトを実装できましたー。今度は嬉しいです♪
60分の1秒ごとにぐるぐる実行するタスクの輪の中に、エフェクトを行うタスクを追加してやればいいだけなのであとはいろいろなエフェクトを作っていけば簡単に組み込めるのです。タスクシステムって便利です。
光のパーティクルとか作ってみればかっこよさそうですけど、DirectXは使っていないもんだからどんどん計算量は増えていきますね。
ああ、この前画像をいじくるクラスを作成しているときに、いろいろと処理時間を測って驚いたことがあるんですよ。抜き色転送(指定した色は転送しない)とただの矩形転送では抜き色転送の方が速いんですね。
よくif文での比較は遅くなる原因だっていうのを見かけますが、抜き色転送はビット演算でまとめてやらない限りif文を使うことになります。当然、1ピクセルごとにif文を使う抜き色転送の方が遅いと思っていたんですけど、抜き色転送は指定した色の場合はコピーしないんですよね。その結果、if文で比較する代わりにピクセルへの代入(メモリのコピー)がなくなります。
これは要するにif文での比較よりも代入の方がずっと時間がかかるってことですよね。僕がチェックした画像は1/3ぐらいが抜き色領域で、かかった時間は矩形転送の3/4くらいでした。
あと、CPUがいくら速くてもメインメモリからビデオメモリに転送する速度の限界もあるから、どれくらいのFPSが出せるかはCPUだけでは決まらないと。自分のメインマシンで5秒間に何回画面を更新できるかチェックしてみましょう。描画はGDI関数のBitBltです。
・・・5秒で110万回Σ(゜Д゜)
本当かいな。スレッドを作成してその中で更新命令(InvalidateRect)を出してWM_PAINTで描画してみましたけど、なんかおかしいです。640*480*4=約1MBを毎回転送しているのに1
秒間に20万回も更新できるわけがない(笑)
スレッド内でカウントしていたので上のはただ単に更新命令を出した回数ですね。更新命令だけいっぱい出したけど、更新されたのはもっと少ないと。まぁ、当たり前ですが。
測定しなおしたら5秒間で1600回。つまり、1秒あたり320回。
転送量は375MB/s。本当にあってるかわかりませんが妥当なところですね。描画の作業だけならは60FPSは余裕ですが、実際にはいろいろ処理をした上で描画するので結局CPUがボトルネックなのかな。ちなみに、一回一回画像をコピーしながら描画すると5秒で870回でした。
時間がかかりそうなエフェクトはちゃんと処理時間も測定しながら作っていかないといけませんね。