micropython
M5stack
ILI9341

ili934xnew.pyの研究

ili934xnewは良い。

すごくネイキッドな感じで良い。
直接いじれる感があるのに、でも必要最低限は備えてる。

前のポストでblitがやけに遅い。でもfill_rectangleは速い。と書いた。
そのまんまなんだけど、何が原因なのかと思って探ってみた。

要するにメモリを節約する為につくられている。

ili934xnewは普通に使うと文字を表示する、縦か横の線を描く。ドットを打つ、モノクロの画像データを表示する。カラーを変更する。という機能しかないんですが。
そのかわりprintで画面がスクロールするとか、かゆいところには手が届いてる感じ。

そもそもモノクロの画像しか扱えないのもメモリを配慮してのことだと思う。
ILI9341はRGB565形式のカラーを扱うので1ピクセルあたり2byteのデータを使う。
だから、フル画面で320x240x2 byte必要なわけで。

んで、まあ。ili934xnewのblitの構造としては前景色・背景色を考慮しながらモノクロのピクセルデータを展開してバッファを作って、それを画面に転送するという二段階の処理をしていた。これで遅いのかな?
メモリを配慮したんだなとか、文字でピクセルごとに色を変えるとかあんまりないしそういうのも考慮したのかな。何気に文字の大きさも自由になるようにつくられているしね。

とりあえず事情はわかった。

だがカラーも使いたいしやっぱり速度はほしい

そういうことです。
んじゃあ、速度の速いfill_rectangleはどうなってんの。
ってことで探ってみた。

#RGB565でmemoryviewをつくる。バイト配列で必要な分のデータをつくる。
mv = memoryview(bytes([0b11111000,0b00011111]))
#x0,y0,x1,y1を指定してー
display._writeblock(0,0,0,0) 
display._data(mv)
#データ転送。データ転送はまとめてやらなくても、ループで1byte毎でもOK。

#或いは座標指定してそのままデータ転送。
display._writeblock(100,100,100,100,mv)

#こんな風にしてやれば縦にずいずい描画される。
display._writeblock(100,100,100,105,mv)

と言う感じでした。
_writeblockで範囲指定して_dataで送り込むか、_writeblockで範囲指定しつつデータ送り込むか。
意外と単純じゃん? って、これがILI9341の本質なんすよ。
ネイキッドだっていうのはここらへん。
がっちり作られちゃったライブラリに比べると自分でどうにか出来るし、必要最低限ひととおり備わってるから参考にも出来るし! だから良い!

まー、これを試してもらうと解るとおりカラーでイケてますよね。
RGB565(R 5bit、G 6bit B 5bitの計16bit、つまり2byte)を1ピクセルのデータとして_dataで送りこんでやれば良い、メモリに保持出来る大きさならどうにかできるからそこら辺考慮しつつ。やればキャラグラくらいならなんとかなりそうです。マップチップみたいにして使ってやれば全画面に描画も出来るしね。SDカードあるから容量にはこまらないしね。

といったところでとりあえず研究は続行するとして記事はここまで。
ではまたー。