ゲームラグ白書 › 症状から探す
表示されない・ゴースト:原因20件と担当
別名:NPCが見えない、透明なキャラ、倒したはずのモンスターが立っている
図のあるメインページの症状辞典で開く →
いるはずのNPC・モンスター・プレイヤーが自分の画面にだけいない、またはすでに消えたオブジェクトが自分の画面にだけ残っています。
ほかの人はNPCと会話しているのに、自分には何もない地面が見えます。名前だけ表示されてキャラクターモデルがない、または攻撃しても反応しないモンスターが立っています。
速度の問題というより、パケットが一つ抜けたか描画に失敗した状態です。チャンネル・フェーズの違い、出現・消滅通知の欠落、ロード中の破棄、アセットのロード失敗を確認します。視界から外れて戻ってきたときに表示されるかどうかが、決定的な手がかりです。
この症状を引き起こす原因
L1 クライアントのゲームプロセス
- ストレージが遅くアセットストリーミングが間に合わない: HDDのような遅いストレージでは、オープンワールドのテクスチャ・モデルを読み込む速度が移動に追いつかず、オブジェクトの表示が遅れたり、ゲームが読み込みを待ってカクついたりします。 (ゲーム開発チーム・クライアント開発)
L8 ソケットとプロトコル
- keepaliveのデフォルト2時間: 相手が終了の合図なしに消えると、TCPはかなり時間がたってから検知します。keepalive(アイドル接続が生きているかを確認するTCPの機能)はデフォルトで無効で、有効にしても2時間アイドル状態が続かないと確認を始めません。 (ゲーム開発チーム・サーバー開発)
- アイドル後のスロースタート: TCPはしばらくアイドル状態が続くと輻輳ウィンドウ(一度に送れる量)を再び縮めるため、急に大きなデータを送るときに何回かに分けて送ります。 (インフラチーム・サーバーインフラ)
一部のユーザーだけに起きる問題
- チャンネル・インスタンス・フェーズの違い: 2つのキャラクターが別のチャンネルやインスタンスにいたり、クエストの進行度によって見えるNPCが変わる別の「フェーズ」にいたりすると、互いに違う世界を見ることになります。 (ゲーム開発チーム・サーバー開発)
- ロード中に届いた出現通知の破棄: ゾーンに入るとすぐにサーバーが周囲のNPCの出現通知を送りますが、クライアントがまだマップを読み込んでいる最中なので、その通知を破棄してしまいます。 (ゲーム開発チーム・クライアント開発)
- 視界登録の順序の乱れ: キャラクターが視界グリッドに登録される瞬間と、NPCがグリッドのセルを移る瞬間が重なると、そのNPCの出現通知が漏れることがあります。 (ゲーム開発チーム・サーバー開発)
- 基準スナップショットの欠落: サーバーが「前回から変わったものだけ」を送る方式では、最初に1回送る全体の情報(基準)を失うと、その後の差分を適用できません。 (ゲーム開発チーム・サーバー開発)
- 消滅通知の欠落(ゴースト): 逆に「消えた」という通知を取りこぼすと、すでに死んだか去ったNPC・プレイヤーが自分の画面にだけ残ります。 (ゲーム開発チーム・サーバー開発)
- 入場直後に集中する出現情報の欠落: ゾーンに入った瞬間、サーバーは周囲の数十〜数百個のオブジェクトの出現情報を一気に送ります。これを非信頼(unreliable)チャネルで送ったり、ロード中でソケットを読めない間に受信バッファがあふれたりすると、一部が消えて二度と届きません。 (ゲーム開発チーム・サーバー開発)
- オブジェクトIDの再利用による混同: 倒されたNPCが再び出現するときにサーバーが同じオブジェクトIDを使い回すと、その間に消滅通知を取りこぼしたクライアントは、新しいNPCを古いNPCと誤認します。 (ゲーム開発チーム・サーバー開発)
- 固定UDPポートの衝突: クライアントが決まったローカルポートを使うように作られていると、同じPCの2つ目のクライアントはそのポートを使えないか、1つ目とパケットを分け合って受け取ることになります。 (ゲーム開発チーム・クライアント開発)
- IP・端末基準のセッション識別バグ: サーバーや中継サーバーが接続をIPや端末IDで区別していると、同じPC(同じグローバルIP)の2つのクライアントを1人として認識します。 (ゲーム開発チーム・サーバー開発)
- 多重起動の制限: セキュリティモジュールやサーバーのポリシーが1台のPCでの複数クライアントを制限していると、2つ目のクライアントは起動・接続ができないか、先に起動した側が切断されます。一部のゲームは追加のクライアントの機能だけを制限します。 (ゲーム開発チーム・クライアント開発)
- バックグラウンドウィンドウの処理制限: バックグラウンドウィンドウのクライアントでは、ゲーム・エンジン・OSがフレームと処理を減らします。受け取ったパケットを時間内に処理できず、詰まったりあふれたりします。 (ゲーム開発チーム・クライアント開発)
- キャッシュ・アセットファイルへの同時アクセスの競合: 2つのクライアントが同じキャッシュフォルダーに同時に書き込んだりファイルをロックしたりすると、片方がNPCのモデル・テクスチャを読み込めなくなります。 (ゲーム開発チーム・クライアント開発)
- メモリ・VRAM不足によるストリーミングの失敗: 2つのクライアントがビデオメモリを分け合うと、新たに必要なモデル・テクスチャを載せる場所がなく、一部が描画されません。 (ゲーム開発チーム・クライアント開発)
- 表示オプションの違い: 表示人数の制限、NPCのネームプレート・モデルの非表示、低スペックモードなどのオプションが2つのクライアントで違うと、見えるものが変わります。 (ゲーム開発チーム・クライアント開発)
- クライアントのバージョン・データの不一致: 2つ目のクライアントが別のインストール版だったりアップデートが済んでいなかったりすると、サーバーが送った新しいNPCのIDを知らないため、黙って無視します。 (ゲーム開発チーム・クライアント開発)
- 接続ごとの送信バジェット・優先度: サーバーが接続ごとに送る量に上限を設けて近いものから送ると、上限が低く設定された側は、遠くにいるNPCを遅れて受け取るか、受け取れません。 (ゲーム開発チーム・サーバー開発)
- 時刻推定の誤差によるオブジェクトの保留: クライアントが推定したサーバー時刻がずれていると、届いたばかりのオブジェクト情報を「まだ未来」として保留したり、「古すぎる」として破棄したりします。 (ゲーム開発チーム・クライアント開発)
図のあるメインページの症状辞典を見る