Open1
GodotEngineのGDScript上で、エンジンで確保しているデータを大量に整形する場合、時間がかかる。
やりたいこと
- オーディオファイルをメモリ上に展開して、自前関数のオーディオストリーム上で再生させたい
- Godotに移行したいのは、インゲームのテキストエディタがほしいから。(割と需要が限られる)
結果
- まずオーディオファイルの展開がすごい重い。1個のサンプルで動作が1秒程度止まるレベル。
- 次やるとすれば、audio.Play()をスケジュールで指定する等かな、とおもった。
想定される理由
専用クラスへのメモリアクセスがやたら遅い
これはプロパティやメソッドへアクセスするときに顕著。
メモリ最適化がガシガシ行われていて、専用メソッド以外からのアクセスが困難
試しにオーディオのデータを見てみると、byte列でのアクセスのみが可能。
これを整形してデータを復号化してオーディオを作成するということになる。
例えばfloat配列にビット演算で整形し、これを配列に格納するというわけですな。
1番目の理由とあわせるとかなりの時間がかかる。
よって、NG。
(そもそもわざわざEngine側でメモリ確保しているのをユーザ側で展開するという設計思想ではない模様)
対応案
事前にデータを整形しておく
これを行ったのだが、サンプル1個で1秒かかるという状況であった。
ちなみに複数持っているので結構時間かかるんじゃないかな。
スケジュールで再生秒数を計算する
Unityだと再生キューの秒数を計測すらできなかったので導入を見送ったけど、
Godotであれば再生キューも更新関数から導入が可能なので、タイミングの制御も容易になるものと考える。
データ格納処理をNativeで行う
時間があればやりたいね!ただ時間がかかる。
結論
- GDScript上でエンジン埋め込みからユーザデータを確保する等は基本的には重い
- よって、エンジンでのロードを踏まえて動作を確認するのがいい
- 途中で利用エンジンを切り替えるべきではないorz