Raspberry Pi PicoでAT-Xを作る⑮ マルチコアにする

raspberry pi pico

マルチコアにしたらリソースが倍になるらしいね。

役割分担

core0
・LCDへの描画
・音声出力 ※未実装

core1
・microSDからフレームデータの読み込み
・フレームデータの展開

流れ

準備(電源つけたら1回だけする処理)

core0:sdカードマウント
core0:ランダム再生の準備
core0:core1起動

こっから無限ループ

core0:ランダムにファイルを1つ選択
core1:選択されたファイルをオープン

1ファイル分ループ

core0

バッファが全部空なら待機

バッファを1つ選択

前フレームとの間隔調整のために待機

LCDに描画

今使ったバッファを空にする

core1

microSDから1フレーム分読み出し

DXT1→RGB565に展開してバッファに詰める

バッファ3つ分いっぱいになったらお休み

1ファイル分再生が終わったら、
core0:ランダムにファイルを1つ選択
まで戻る

各セクションの時間を計測

実装の中身は省略しまして。

core0
LCDに描画:10ms
音声再生:これから実装

core1
SDから1フレーム分読み出し:21ms
DXT1 → RGB565の展開:15ms
計:36ms

24fps ≒ 41.7ms/f には届いてるね~
結構ギリだけど

総再生時間を計測

元の動画ファイルが約89.94秒のbinファイルを再生した

約89.89秒
0.05秒の差は計測誤差で片付けちゃってもいいのかな・・・

もっと長い動画で確認してみた

元の動画ファイルが約24分0秒94の長さのbinファイルを再生した

秒に直すと1440.94秒

約1439.56秒
1秒以上短い。ヤバいじゃん。

フレームレートを見直し

「テレビアニメ フレームレート」で検索したら「24fpsです」って書いてあるページが多かったらそれに倣って1/24=0.0416666….としてヘッダファイルにフレーム間隔を宣言してる

でも実際に動画ファイルのプロパティを確認したらもう少しだけ遅かった。微差だけど。

フレーム間隔の値を1/23.976=0.0417083….に変更してみる

概算してみる

長いほうの動画ファイルのフレーム数をmoviepyで取得した

それぞれのfpsで計算してみた

状況fpsフレーム間総再生時間
修正前24.00041,667us1439.5秒
修正後23.97641,708us1440.9秒

ドンピシャじゃん。

再度実測

約1440.98秒

元の動画ファイルが1440.94秒だから
0.04秒くらいのズレ

これなら最後まで音声とのズレも気にならなそう

再生してるとこ

なめらかで大変よい。

タイトルとURLをコピーしました