7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】VideoPlayerで発生するメモリリークを徹底検証してみた

7
Posted at

🧩 はじめに

Unityの VideoPlayer を使って動画再生機能を実装した際、
メモリリーク(JobTempAlloc警告) が頻発しました。

特に、

  • 動画の再生速度を変更したとき
  • HD動画を再生したとき

に再現率が高く、長時間再生ではアプリが強制終了することも。

本記事では、実際に条件を変えながら再生テストを行い、
「リークが発生する条件」と「安定して動く条件」 を突き止めたので共有します。

公式の情報を確認したのではなく、あくまでも私の個人的な検証による確認結果です。


⚙️ 開発環境

項目 内容
Unity 6.0 (2025)
OS macOS / iOS(iPhone実機)
VideoPlayer設定 RenderTexture出力(2D再生)
動画形式 H.264 / H.265
解像度 HD (1920x1080) / 4K (3840x2160) / 5.7K
フレームレート 30fps / 60fps

🧪 現象の概要

Unity Editor/実機いずれでも、
以下のようなワーニングが一定周期で発生しました。

JobTempAlloc has allocations that are more than 4 frames old
Invalid memory pointer was detected in ThreadsafeLinearAllocator::Deallocate!

短時間では問題ありませんが、
長時間の動画再生やVRモードで連続再生すると、
徐々にメモリ使用量が増加して最終的にアプリがクラッシュします。

🔍 検証①:HDと4Kで挙動が違う?

同じシーン・同じスクリプトで、
動画ファイルだけを差し替えて比較しました。

動画 結果 備考
HD (1920×1080, H.264) ❌ 頻繁にメモリリーク警告 CPUデコード
4K (3840×2160, H.265) ⚠️ 稀に警告 GPUデコード(HW経路)
5.7K (H.265) ✅ 安定、警告なし 完全にHWデコード

🔸 結論:UnityのVideoPlayerは、解像度によって内部デコーダが切り替わる。
HDではCPU側ジョブが使われ、一部バッファが破棄されず残る模様。
4K以上ではGPUハードウェアデコーダが使われ、リークがほぼ発生しない。

🧩 検証②:fps(フレームレート)でも挙動が変わる?

同じ4K動画でfpsを30→60に変えてテスト。

fps 結果 考察
30fps ⚠️ 稀にリーク警告あり Unity描画(60fps)と非同期、補間ジョブが走る
60fps ✅ 安定、警告ほぼ消滅 補間不要、TempAlloc未使用

🎯 VideoPlayer内部のタイム補間ジョブが、リーク経路の一因。
レンダリングループ(60fps)と同一フレームレートにすると安定します。

🧠 検証③:コーデック(H.264 vs H.265)

コーデック 結果 理由
H.264 ⚠️ リーク多め CPUデコード経路を通りやすい
H.265 (HEVC) ✅ 安定 各OSのGPUデコーダで処理されるため、Unity内部ジョブを通らない

✅ 最終結論:安全な動画フォーマット条件

Unity VideoPlayerでメモリリークを起こさず安定動作する構成はこれ👇

項目 推奨値 理由
解像度 4K以上 HWデコードが有効化される
コーデック H.265(HEVC) CPUデコード経路を回避
フレームレート 60fps固定(CFR) 補間ジョブが不要になる
ビットレート 20〜30Mbps 画質と通信のバランス良好
音声 AAC 128kbps以上 標準互換

この構成で、実際に警告が完全に消滅(または極端に減少) しました。

🎥 ffmpegでの変換例

ffmpeg -i input.mp4 \
  -vf "scale=3840:2160:flags=lanczos,fps=60" \
  -c:v libx265 -crf 22 -tag:v hvc1 \
  -c:a aac -b:a 128k \
  output_4k60_h265.mp4

※ -tag:v hvc1 はiOS/macOSでHEVCを正しく認識させる重要オプションです。


📊 まとめ

条件 リーク発生傾向
HD + H.264 + 30fps ❌ 頻発
4K + H.264 + 30fps ⚠️ 時々
4K + H.265 + 60fps ✅ ほぼゼロ

🗣️ 所感

最初は単なる「リーク警告」だと思っていましたが、
UnityのVideoPlayerは想像以上に内部のデコーダ経路が複雑でした。

最終的に「4K/60fps/H.265」で安定したとき、
「この組み合わせを知らずにハマっている人いそうだな」と思いました。

同じ症状に悩んでいる方の助けになれば幸いです。

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?