強化画面にて、想戦のかけら プラスマイナス連打で、BGM停止する対策
Description
実機 強化画面 ボタン連打検証
BGMが停止された瞬間以下エラー
AVHapticClient.mm:1335 -[AVHapticClient handleServerConnectionInterruption]: [xpc] Entered (due to connection interruption) for client ID 0x2000cfeCHHapticEngine.mm:646 -[CHHapticEngine finishInit:]_block_invoke: ERROR: Server connection broke with error '操作を完了できませんでした。(com.apple.CoreHapticsエラー-4811)'AVAudioSession_iOS.mm:1493 Creating proxy session failed, session ID = 0x681a6, error = Error Domain=NSOSStatusErrorDomain Code=-50 "Session lookup failed" UserInfo={NSLocalizedDescription=Session lookup failed}AVAudioSession_iOS.mm:1493 Creating proxy session failed, session ID = 0x681a5, error = Error Domain=NSOSStatusErrorDomain Code=-50 "Session lookup failed" UserInfo={NSLocalizedDescription=Session lookup failed}
##以下が対策になるのか?確認した方がよさそう
MemoryItemSelector.tsx の + ボタン(line 93)と - ボタン(line 174)は、どちらも PushButton を使っており、毎タップ soundManager.playSE("se/click.m4a", { system: true }) が呼ばれます。
前回の INS-732 修正(singleInstance: true)で「同時に複数インスタンスが鳴る」問題は解決されましたが、連打ごとに pixi-sound が play → stop → play を繰り返すのは止まっていません。iOS の AudioSession は XPC 経由でハプティクスエンジンとオーディオデコーダを共有しており、この高頻度な AudioContext 操作が:
CHHapticEngine server connection broke → AVAudioSession proxy session lookup failed → BGM 停止
という連鎖を引き起こしています。
提案する修正
SoundManager.playSE() に エイリアスごとのスロットル を追加します(apps/client/src/lib/sound.ts:104)。
// クラスフィールドに追加
private _seLastPlayedAt = new Map<string, number>();
private readonly _seThrottleMs = 50; // 同一 SE の最短発火間隔
playSE() 冒頭(_ensureContext の前)に:
const now = Date.now();
if ((now - (this._seLastPlayedAt.get(alias) ?? 0)) < this._seThrottleMs) return;
this._seLastPlayedAt.set(alias, now);
50ms スロットルで最大 20 回/秒に制限されるため、連打の操作感を損なわずに AudioSession への過負荷を防げます。click.m4a 以外の SE(長い SE など)にも適用されますが、50ms は十分短いため体感への影響はほぼありません。
もし SE 種別ごとにスロットル閾値を変えたい場合は、playSE() の options に throttleMs?: number を追加する方法もあります。
ーーーー
Comments (1)
実機にて完璧ではないのものの 一旦、ある程度の改善がみられたので、commit 9e7759f81370d6b999e1c627ca83f0a1fa5664aa にてクローズ。 もしこれよりパフォーマンスを向上した方がいい場合にはあらためて起票する