Article #1025

既に発行済みのブログであっても適宜修正・追加することがあります。
We may make changes and additions to blogs already published.

GameFSMの改良 (5)

posted by sakurai on September 19, 2025 #1025

調査の結果、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

Your email address will not be published.

You may use Markdown syntax. If you include an ad such as http://, it will be invalidated by our AI system.

Please enter the numbers as they are shown in the image above.