Aoideの開発が大分進んだ -低性能なマシンでソフトウェアを動かすの大変だなという話-

前回から5ヶ月以上放置してしまったけど、久しぶりに続きを書こうと思う。

ここ5ヶ月はコードを書いてただけ

こう書くとバリバリ書いてたように見えるかもしれないけど、そこまで書いてた訳じゃなくて、やっとヘッダとソース合わせて2500行くらいになったくらいなんだけどね。とにかくコードが書けない…LLMのお世話になってばっかりでね。

音楽再生用にlibVLCを使っていたのをやめて、miniaudio+taglibにした。メモリ512MBの機器に、音楽再生用途だけでlibVLCはさすがに贅沢すぎる。あと、libVLCは(もう前のことだから記憶が曖昧だけど)楽曲ファイルからアートワークを取得できなかったからやめた。全部libVLCでできると思っていたのに。仕方無いから、miniaudioで再生、taglibでメタデータの取得という構成にした。それでも普通に150MBくらい使うのは何?

とりあえずラズパイで動かしてみる

ラズパイで動かしてみようと思って前にやってみた。

まず、ラズパイzero2wに、AlpineLinux(GUI無しのRaspberry Pi OSだとしても、無駄が多すぎる)を入れて、他にもSDLとかminiaudio、taglibを入れてビルドしてみた。WaylandもX11すら無いし、フレームバッファコンソールはSDL3だともう使えないので、KMSDRM経由で直接画面に出力するようにした。

その時は普通に動いたんだけど、この前も、結構完成してきて機能も大分追加してきて、重くなってないかな?と思って実際やってみたら、すごーーーく重い。いくら性能が低いとは言っても、これじゃ誰も使えねーぞと思って、早速軽量化に取り組んだ。

まず原因特定が先だ

とりあえず、一番心当りがあるのはテキスト描画だ。テキストを描画する度、毎回毎回フレームを更新する度に新しくテキストの画像を生成しているから、ラズパイだと重いかなと思って、操作があった時だけフォントから〜ってのをやるようにしてみた。

そうすると大分早くなったはなったんた。長押しするとばばばばって連続でカーソルが移動する処理を入れてるんだけど、それが極端に遅い。押し始めてからばばばってなるのも、普通のPCなら1秒もせずになるんだけど、ラズパイだと何秒もかかる。それにCPUが100%に貼り付く。(マルチスレッドのソフトじゃないから一コアだけだけど)

さすがにおかしいな〜、フォント描画か?いや、長押しのばばばが遅いだけで、それ以外は普通だもんなぁ、なんて思いつつ、とりあえずこういう時は一旦処理を全部消してテストするのが手っ取り早いから、フォント描画も、操作もできなくさせて、SDLが立ち上がるだけにしてみたのだけれど、それでもCPUは100%になってあっちあちになる。

あとしている処理と言えば、SDLのイベント(キー入力とかそういうやつら)をポーリングで無いか調べて、あったらそれを処理するところだなぁ、って思って、一秒毎に実行するようにしてみたらほとんどCPUが働かなくなった。つまり、ポーリング処理が悪いと分かった。あとは簡単、もっと遅く処理をするようにすれば良い、と分かった。

ただ、単純に一秒待つだけだと1FPSの動きが1秒になるので、60FPSだった場合1秒で終わるはずのものが60秒で終わることになる。それは良くないので、操作してない時だけ0.5秒待つようにした。(1秒待つと、さすがに遅いかなって思って。)

SDL_WaitEventTimeout()という関数を使えば、イベントが起こるか、指定した時間立つまで処理を止めることができる。キー入力が来たらすぐに処理をすることができるし、全く操作していないときは0.5秒間ずつ処理をこなすようにできる。

んで、どのくらい早くなったの?

いや、他の人には伝わらないと思うけど、感動するくらい早くなった。遅いときはばばば状態になるまで5秒以上かかっていたのに、1秒で、そしてばばば自体もめちゃくちゃ早くなった。感動しちゃうよ、

あとgithubからforgejoに移行して思ったこと

前回の記事でforgejoに移行したって話を書いたけど、それでどうなったのか。

結論、別に変化無し。

いや、forgejoが凄くないって話じゃないんです。githubから移行して違和感とか無しで使えるのが本当に凄い。大人数で開発する人ならまた別の意見が出るかもしれないけど、私は1人でコードを書いているし、しかもgitで使う機能と言えば、コミットとプッシュとプル、フェッチ、マージ、ブランチくらいだし、githubライクなUIだし、で本当に文句が無い。本当に有り難い。

あと、Neogitが優秀すぎる。私はGithubを使ってたときはGithub for Desktopを使ってわざわざGUIのアプリを開いてコミットとか色々をやっていたんだけど、forgejoに移行してからはNeogitを使うようにした。Github for Desktopは、面倒臭いssh認証の設定をするのが嫌だったからってのもあって使ってたんだけど、いざsshで接続できるようにしたら本当に便利だね。Neogitも、わざわざ別ソフト使わずともコードを書いてるneovimから使えるから良い。コードをぱぱっと書いて、それですぐコミットできる。neovimを使っている人で、私みたいなgitのコマンド覚えたくない人は是非Neogit使ってみてほしい(neovimを使うような人でコマンド叩きたくないって人、大分マイノリティな気がするけど…)

おわりに

次回の記事はいつになるかも何を書くかも未定。その気になったら書くつもりです。

aoideにはあとポモドーロタイマー機能(勉強しているときとか、休憩がてら音楽をよく聞くので)と、プレイリストを作る機能を付けたいね。

じゃ、また次の投稿で。

コメントする