M5StackでBad Apple!! [改!]

いやはや……前回更新したブログにいくつか見当違いや勘違いを記載してしまったので、急遽追加で書いている。

 

f:id:PocketGriffon:20210915002900j:plain

 

先に一番の原因を書いておくと、SDカードからの読み込みが全く間に合っていなかった。

計算上、ギリギリか無理かな…という線だったのだが、エラーもなく表示されていたので安心しきっていたのだが………

 

コマ落ちしてた!!

自分の中で一番許せなかったことがコレ(T-T)

あれだけ1/30秒描画にこだわっていたのに、まさか描画されていない絵があったなんて…。

 

データの読み込みが危うくなってくると、頑張ってSDカードからの読み込みを追いつこうとする処理を入れてあったのだが、そこのミスがあって1フレームまるごとではないが表示が欠けていた。

結果的にデータは読めていたのだが表示があかん…これは美しくない(T-T)

 

この部分を修正して表示の1/30秒を保証したところ、今度はデータ読み込みが間に合わなくなる状況に陥った!まさにあちらを立てればこちらが立たず!(T^T)/

 

余った時間の全てをSDカード読み込みに!

そもそも、SDカードからの読み込みはCore:0(描画を担当しているコア)が余った時間で行うようにしていた。しかしこうなってくるとCore:0だけに任せておけなくなったので、Core:1(圧縮データを展開しているコア)も時間が空いたらSDカードから読み込むようにした。

 

SDカード読み込み部分はリエントラントには出来ないので、どっちかのコアでしか実行が出来ない。先に処理を奪った側のコアで実行させるようにしたが、もう片方のコアも諦めずにリトライを繰り返すので、先のコアが処理を開放した瞬間にもう片方がSDの読み込みを始める。

 

それでも後半の複雑な絵柄を描画するタイミングではSDカードの読み込みに追いついてしまう。もはやこうなると圧倒的に読み込み速度が足りないのだ(T-T)

いわゆる初期段階の設計ミス的な…orz

 

メモリを活用せよ!

SDカードの読み込みが追いつけないのであれば、あらかじめ出来る限りのデータは読み込んでおき、実行時に追加読み込みする量を減らすしか無い!フルマラソン(42.195Km)の勝負で、スタートラインを40km地点にするようなもんだ(^^;;

 

そこで、PSRAMで確保出来る最大の領域を使う事にした。試しにフリーブロックを表示させてみると4194252バイトと出た。ほぼ4MBが使えるという事ですな…。

この容量は心強い!!(^-^)

 

……あれ??今気がついた。M5Stack Core2ってPSRAMが8MBあるんじゃなかったっけ?

f:id:PocketGriffon:20210915084237j:plain

ほら!8MBって書いてある!!

M5Stack(というかESP32?)は sizeof(void *)=4なので、アドレス空間的には余裕のよっちゃんなはずで、システムが専有!とかしていない限り、ふつーに使えそうな気がするんだけれども…。今は気持ち的に調べてる余裕がないけど、これは使いたいなぁ…。

 

そして確保出来た全メモリの93.75%にあらかじめデータを先読みしておく事にした。

f:id:PocketGriffon:20210915010131j:plain

起動するたびに約40秒の待ち時間が発生するが、これも30フレーム動作のため!(^^)

メモリ目一杯まで読み込むと、6565フレームあるうちの5378フレームまでを読み込んでおく事が出来た。なんというチート!(^-^;;

残りの1187枚分を実行中に読み込ませれば勝ちだ!

 

これのおかげで、大体2740フレーム前後を表示している頃には、SDカードから最後までのデータを読み込めて、ようやく安定した30フレーム動画を見れるようになった(T-T)

2740フレームを表示する期間で1187枚を読むって…完全な負け戦(^^;;

 

今回の失敗の敗因は、間違いなくSDカードからデータ読み込み速度の過信ですね…。SDカードの読み込みに専念した時は100KB/秒くらいの速度だったけど、実際に動いてる状態から数値を計算してみると、秒間11.8KBくらいしか出てない。圧縮データを展開するデータの単純さなどから20KB/sくらいは出ると思っていたが、甘かった(T-T)

 

こんな状態なので、サウンドもSDカードから…とか無理な気がする(T-T)

音声を諦めてMIDIにしちゃうとか…もっと手軽にMMLにしちゃうとか…汗

まぁでも音は遠のいちゃったかもな…と残念(T^T)

 

グレイスケールでの表示を検討していたけれども、データ量が白黒2値よりも遥かに多い。展開速度も時間がかかりそうなので実現無理かも(でも最初だけみたいからやってみるw

 

出来上がった30フレーム動作の動画だけど、再度Twitterにアップしたところで違いがはっきり分かるわけでは無さそうだったので、公開は控えてる。どこかで何かのタイミングがあったらお披露目していきたい。実物を見てもらうのが一番なのだけれども…うむむ(^^;

 

ではまた次回!(^-^)ノ