自作ゲームを起動すると「ヘッドホンがブーン…」原因は“GPUの挙動”だった🎧⚡

自作ゲームを起動すると「ヘッドホンがブーン…」原因は“GPUの挙動”だった🎧⚡ #news
自作ゲーム実行時だけヘッドホンがブーンと鳴る原因を究明。GPU→CPUのピッキングテクスチャ転送(readback)による同期と電力ノイズが引き金だった。再発防止の実装テクニック(必要ピクセルだけ転送、FPS制限等)とハード対策(別電源、USB変更)を開発者向けに解説。

たった1つの処理が、音響ノイズを呼び込むまでのデバッグ記録

「自作ゲームを動かすときだけ、ヘッドホンからブーンというノイズが出る」
しかも、フォートナイトやオーバーウォッチのような“重いゲーム”では起きない——。

そんな奇妙な現象に悩まされたゲーム開発者が、原因を切り分けて突き止めた話が話題になっています。
結論から言うと、犯人はGPUとCPU間の“テクスチャ転送(readback)”。そして本質は、**電力・グラウンド(接地)・EMI(電磁ノイズ)**という「PC周辺の現実世界」にありました。


どんな症状?「自作ゲームのときだけ鳴る」違和感😵‍💫

開発者の環境はざっくり次の通り。

  • GPU:RTX 3090
  • メモリ:32GB
  • オーディオ:外付けDAC(USB接続)経由
  • 現象:自作のクォータービューゲーム実行時だけ“ブーン”
  • 他のゲーム:同じPCで遊んでも鳴らない

「電源(PSU)が古い?」「負荷が高いと鳴る?」と疑いたくなりますが、ここで矛盾が出ます。
重いゲームほど鳴りそうなのに、軽いはずの自作ゲームだけ鳴るからです。

切り分けの第一歩:「レンダリングを止める」と音が消えた🔍

開発者がまず気づいたのがこれ。

何も描画しない(レンダリング無効)状態だとノイズが出ない

つまり、CPU処理やオーディオ処理だけが原因ではなく、GPUで何かをしている瞬間にノイズが関連している可能性が濃くなります。

原因は“ピッキング用テクスチャのGPU→CPU転送”だった🎯

ゲーム内の「クリックした対象を判定する」ために、ピッキング用テクスチャを使う実装があります。

ピッキングの典型例(わかりやすく)

  • 画面とは別に「当たり判定専用の画像」をGPUで描く
  • そこには色ではなく「EntityID(オブジェクトID)」を書き込む
  • クリック時に、マウス位置のピクセルを読み取って対象を特定する

ここで問題になったのが、フレームごとに

📌 ピッキングテクスチャ全体をGPUメモリ→RAMへコピー(readback)
という処理を入れていた点でした。

実際に、レンダリングパイプラインの処理を1つずつ無効化していくと……

ピッキングテクスチャの転送を止めた瞬間、ノイズが完全に消える
転送頻度を下げる(例:250msごと)と、ノイズがほぼ消失
頻度を上げると、ノイズが増大

つまり、ノイズは「音の処理」ではなく、GPU↔CPU転送のタイミングと強度に同期していました。

なぜ“転送”で音が鳴る?ポイントはGPUの「止まる→全力」の脈動⚡

ここがこの話の核心です。

GPU→CPUへデータを戻す処理(readback)は、実装次第で

  • GPU側のキューが詰まる
  • 同期(待ち)が発生する
  • フレームごとに「一時停止」→次の瞬間「100%稼働」に戻る

といった“脈動”を作りやすいです。

その結果、何が起きる?

  • GPUの消費電力が「ドンッ」と変動(瞬間的な電力ピーク)
  • 同じ電源ライン/グラウンドを共有する機器(DACやアンプ)にノイズが回り込む
  • USB経由やアナログ経由で、耳に聞こえる“ブーン”として出ることがある

実際に開発者は、オーディオ機器の電源をPCとは別の電源から取るようにしたところ、ノイズが消えたと報告しています。
つまり、現象はソフトのバグというより、ソフトの挙動が電気的ノイズを誘発し、音響系が拾ってしまったタイプのトラブルでした。

解決策:読むべきは“全部”じゃない。必要な1ピクセルだけ読め🧠✨

最終的な解決は、力技ではありません。

❌ 毎フレーム、ピッキングテクスチャ全体をreadback

✅ クリックに必要な「マウス直下のごく一部」だけをreadback

これで、GPU↔CPU転送が激減し、ノイズが完全に消えたとのこと。

ここから学べる「開発者向け」再発防止チェックリスト🧰

同じ罠にハマらないために、実務で効くポイントをまとめます。

A. 実装面(ソフト側)🧑‍💻

  • 🟦 readback(GPU→CPU転送)は“最後の手段”
  • 🎯 ピッキングは「必要なピクセルだけ読む」「クリック時だけ読む」に寄せる
  • 🧵 非同期readbackやダブルバッファで“待ち”を隠す(同期点を減らす)
  • 🎮 FPS制限/VSyncでGPU稼働の脈動を抑える(無制限FPSは悪化要因になりがち)
  • 🧠 可能なら「GPU内でピッキング完結」(ComputeやIDバッファ参照)を検討

B. 環境面(ハード側)🔌

  • 🔌 DAC/アンプを別系統の電源へ(同一タップ共有を避ける)
  • 🧲 電源タップをノイズフィルタ付きにする(効果は環境差あり)
  • 🧩 USBの挿し口を変える(背面→前面、別コントローラ配下など)
  • 🧯 USBアイソレータ/光デジタル(TOSLINK)等で“電気的に切る”選択肢
  • 🧵 ケーブル取り回し(電源・LAN・USBが束になってると拾うことがある)

※Hacker Newsなどでも「同じ電源から供給していたのをやめたら直った」「FPS上限を設けないゲームはノイズを誘発しがち」といった体験談が多数出ています。


「ゲームが軽いのに起きる」現象が示す、意外な落とし穴🕳️

この話が面白いのは、負荷そのものよりも

負荷の“かけ方”(止める→全力を繰り返す)
同期ポイント(readbackが作る待ち)
電力変動とグラウンド共有

が支配的だった点です。

つまり、あなたのゲームが“軽い”としても、GPUの使い方次第では
**電気的には“荒い動き”**になり、音響に影響が出ることがあります。


まとめ:原因は「GPU readback」+「電源/グラウンド共有」📌

  • ノイズはオーディオ処理の問題ではなく、GPU↔CPU転送が引き金
  • フレームごとのreadbackが、GPUの稼働を脈動させて電力ノイズを誘発
  • オーディオ機器を別電源にするreadbackを最小化するで解決しやすい
  • 開発では「ピッキングの設計」が、思わぬ形でハードへ波及することがある

“バグを直したら、現実世界のノイズまで消えた”という、かなり学びの多い事例です🎧✨


参考・出典 🧾(リンクまとめ)

タイトルとURLをコピーしました