実現したいこと
Godotにて、C++(GDExtension)を用いてChunk(チャンク)のロード処理(ファイルパース、座標配置、Collision作成、メッシュ作成)を実装しています。
プレイヤーの移動に伴うChunkロード時のフレームレート低下を抑え、快適に動作させたいです。
発生している問題・分からないこと
新規Chunkのロード処理(ファイルパース〜メッシュ・Collision作成)が走る際、フレームレートが一時的に 約15 FPS まで大幅に落ち込んでしまいます。
- 下記の処理フロー(ファイルパース → 座標配置 → Collision作成 → メッシュ作成)において、Godot + C++(GDExtension)の構成で特にボトルネックになりやすいポイント(Collision生成、メッシュ構築、Godot API呼出し等)はどこでしょうか?
- メインスレッドを止めずに
WorkerThreadPool等を使って非同期(バックグラウンド)でロード・生成処理を行うための推奨設計・アプローチがあればアドバイスをいただきたいです。
- 該当のソースコードURL: 規模が大きい為、Githubに貼ってある
【処理の順番(フロー)】
- ファイルパース: Chunkデータの読み込み・解析
- チャンク配置・座標配置: ワールド内での位置確定とブロックデータの配置
- あたり判定(Collision)作成: 物理判定(CollisionShape3D等)の生成
- メッシュ作成:
SurfaceToolやArrayMesh等を用いた描画用メッシュの構築・SceneTree追加
該当のソースコード
PlainText
1範囲が大きい為、GitHubにコードをまとめて公開しています。
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
-
処理時間の簡易計測:
Chunkの読み込み時のパフォーマンス低下を確認するためFPSの計測を行ったところ、一時的に約15 FPSまで低下していることが分かりました。 -
Godotでの非同期処理の調査:
Godot mono 4.7のWorkerThreadPoolやC++標準のマルチスレッドを利用し、パースやデータ計算、メッシュ/Collision構築をバックグラウンドスレッドで行う手法についてドキュメントや事例を調べました。
補足
動作環境
- Godot Engine: Godot mono 4.7 (GDExtension)
- OS: macOS Golden Gate
- 言語: C++ (C++17)
あなたの回答
tips
プレビュー