🧩 はじめに
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」で安定したとき、
「この組み合わせを知らずにハマっている人いそうだな」と思いました。
同じ症状に悩んでいる方の助けになれば幸いです。