あなたが現在見ているのは Raspi Zero 2W ベアメタル開発 08 (VRAM描画解決 編)

Raspi Zero 2W ベアメタル開発 08 (VRAM描画解決 編)

先週は、VRAMイメージの描画で、VRAMの内容を一発表示する分には、まぁまぁ問題なかったのですが、描画Threadを回すと、画面がゴミだらけで、まともに表示されるまで何分も待つという不思議な現象に悩まされていました。

その原因が、いわゆる V-Sync (垂直同期) の問題と思っていて、どうやって Raspi Zero 2Wから V-Sync完了の情報をもらうか、そしてどれだけ速く書き込むか (次のV-Syncまでの間に画面生成完了させる。) 、Double Buffer にしてどうするとか。。

さんざんいじくりまわした挙句、元に戻すこともできなくなり、前回の投稿のように Z80エミュレート部分のスピードアップにいそしんだというわけです。

まぁしかし、怪我の功名。Z80のスピードは3.5倍になっただけでなく、新たなアプローチで原因を探すきっかけとなり、見事解決。

結果からいうと、CPUのL1 キャッシュの問題でした。

どういうことかというと、現代のCPU は、プログラムを先読みしてキャッシュしたり分岐の予測をしりして動作スピードをアップさせているわけなんですが、その先読み部分のデータについては、画面描画プログラムは高速で随時書き換えているわけです。

ですから、CPUが先走って読み込んだあとに対象の部分をプログラムが書き換えているので、データの不整合がおきるわけですね。

その結果画面はゴミが残ったような状態になったり、文字が欠けていたりしたわけです。

そこで、VRAM書き換え直後に キャッシュクリアしたら、あっさり解決。勉強になりました。


コメントを残す

CAPTCHA