19 |
GameFSMの改良 (5) |
調査の結果、copyAreaがstaticに31回呼ばれ(関連関数だと69回)、それが状態爆発を起こしていることが分かってきました。数年前に開発した時は同じソースで、bsvコンパイルが1時間もかかっていましたが、PCの更新と合わせてbscもアップデートされたことから、現在は16分程度になっています。かなり時間がかかるのはこの巨大なFSMの構築のためです。
これもChatGPT5に相談したところ、メインのStmtからcopyAreaのStmtを31回呼ぶと巨大なFSMのスケジューリングが必要になり時間がかかるとのことでした。対処法は画面アクセスする関数を小FSM化しておき、メインからは起動コマンドを発行するだけにします。
まず、blitEngine()が動作するコマンド種別を定義します。
typedef UInt#(8) U8;
typedef enum { BLIT_COPY, BLIT_OR, BLIT_ERASE, BLIT_ANDN }
BlitOp deriving (Bits, Eq);
typedef struct {
BlitOp op;
U8 sx; U8 sy; // ソース(prom)のx, yアドレス
U8 dx; U8 dy; // デスト(vram)のx, yアドレス
U8 w; U8 h; // 図形の幅と高さ
} Blit deriving (Bits, Eq);
Leave a Comment