MicroPythonでLCDにダブルバッファによる描画を行うには


以前公開したMicroPython用のST7735ドライバのリポジトリで、以下のような質問がありました
「ゲームを作りたいのですが、update相当の機能はないのでしょうか?」
このupdateというのは、おそらくオフスクリーンのフレームバッファの画像をLCDに転送するような機能だと思われます。

MicroPythonのOLED(SSD1306)ドライバには同様の機能を持つshow()というメソッドがあります。
このドライバでは全ての画像はオフスクリーンフレームバッファーに描画し、それをshow()メソッドでOLEDへ転送するような構成になっています。

ST7735は比較的大きな(128 x 160 x 2 byte = 40,960 bytes)メモリー空間が必要になるため、ST7735ドライバではオフスクリーンフレームバッファは使っていません。しかし画像データをバルク転送すること自体は可能なので、フレームバッファを用意することができれば、show()と同様の機能は実現できます。

というわけで、RaspberryPi Picoで作ってみたのが以下のコードです。PicoとLCDとの結線はこちらの記事と同じです。

ST7735は1ピクセル16ビットですので、FrameBufferクラスでRGB565形式のフレームバッファを生成して(11行目)、そのバッファのデータをそのままLCDに転送しています。
転送を行う前に転送先の領域の矩形の座標を設定する必要があります(13行目)。
あとはデータをまとめて転送するだけです(29行目)。
以下のビデオが実行時の様子です。毎回、画面を消去して円を描いて全画面をLCDに転送しています。

コメント