คู่มือเกมแลค › ค้นหาตามอาการ
มองไม่เห็น/ตัวผี: 20 สาเหตุและทีมที่ต้องแก้
เรียกอีกอย่างว่า: NPC ไม่ขึ้น, ตัวละครล่องหน, มอนที่ตายแล้วยังยืนอยู่
เปิดพจนานุกรมอาการในฉบับหลักที่มีภาพ →
NPC มอนสเตอร์ หรือผู้เล่นที่ควรจะอยู่ กลับไม่มีบนจอของเราคนเดียว หรือสิ่งที่หายไปแล้วยังเหลืออยู่บนจอของเราคนเดียว
คนอื่นคุยกับ NPC ได้ แต่เราเห็นแค่พื้นว่าง ๆ มีแค่ป้ายชื่อแต่ไม่มีโมเดลตัวละคร หรือมีมอนสเตอร์ยืนอยู่ ตีแล้วไม่มีปฏิกิริยา
เป็นสภาพที่แพ็กเก็ตบางตัวหายไปหรือวาดไม่สำเร็จ มากกว่าจะเป็นเรื่องความเร็ว ให้ดูแชนแนลหรือเฟสที่ต่างกัน, ข้อความแจ้งการปรากฏตัว/ออกไปที่หล่นหาย, การทิ้งข้อมูลระหว่างโหลด และการโหลดแอสเซ็ตล้มเหลว เบาะแสชี้ขาดคือ ถ้าเดินออกนอกระยะมองเห็นแล้วกลับมา จะมองเห็นหรือไม่
สาเหตุที่ทำให้เกิดอาการนี้
L1 โปรเซสเกมฝั่งไคลเอนต์
- สตอเรจช้าจนสตรีมแอสเซ็ตไม่ทัน: บนสตอเรจช้าอย่าง HDD การอ่าน texture และโมเดลของโอเพนเวิลด์ตามการเคลื่อนที่ไม่ทัน เอนทิตีจึงโผล่ช้า หรือเกมกระตุกระหว่างรออ่านข้อมูล (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
L8 ซ็อกเก็ตและโปรโตคอล
- keepalive ค่าเริ่มต้น 2 ชั่วโมง: ถ้าอีกฝั่งหายไปโดยไม่ส่งสัญญาณปิด TCP จะรู้ตัวหลังผ่านไปนานมาก keepalive (ฟีเจอร์ของ TCP ที่ตรวจว่าการเชื่อมต่อที่ idle ยังอยู่หรือไม่) ปิดไว้เป็นค่าเริ่มต้น และต่อให้เปิด ก็ต้อง idle ครบ 2 ชั่วโมงก่อนจึงเริ่มตรวจ (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- slow start หลัง idle: เมื่อการเชื่อมต่อ idle ไปสักพัก TCP จะลด congestion window (ปริมาณที่ส่งได้ในครั้งเดียว) กลับลงมา พอต้องส่งข้อมูลก้อนใหญ่ขึ้นมากะทันหันจึงต้องแบ่งส่งหลายรอบ (อินฟราเซิร์ฟเวอร์ (ทีมอินฟรา))
ปัญหาที่เกิดกับบางคนเท่านั้น
- แชนแนล/อินสแตนซ์/phasing ต่างกัน: ถ้าตัวละครสองตัวอยู่คนละแชนแนลหรือคนละอินสแตนซ์ หรืออยู่คนละ “phase” ที่เห็น NPC ต่างกันตามความคืบหน้าของเควสต์ จะเห็นโลกคนละแบบ (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- ทิ้งข้อความแจ้งการปรากฏตัวที่มาถึงระหว่างโหลด: ทันทีที่เข้าโซน เซิร์ฟเวอร์ส่งข้อความแจ้งการปรากฏตัวของ NPC รอบตัวมา แต่ไคลเอนต์ยังโหลดแมพอยู่จึงทิ้งข้อความนั้น (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- ลำดับการลงทะเบียนระยะมองเห็นพันกัน: ถ้าจังหวะที่ตัวละครถูกลงทะเบียนในตาราง (grid) ระยะมองเห็นตรงกับจังหวะที่ NPC ย้ายช่องตาราง ข้อความแจ้งการปรากฏตัวของ NPC นั้นอาจตกหล่น (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- สแนปช็อตตั้งต้น (baseline) หาย: ในแบบที่เซิร์ฟเวอร์ส่ง “เฉพาะส่วนที่ต่างจากครั้งก่อน” ถ้าข้อมูลเต็ม (baseline) ที่ส่งครั้งแรกหายไป ก็จะใช้ส่วนเปลี่ยนแปลงที่ตามมาไม่ได้ (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- ข้อความแจ้งการออกไปหาย (ตัวผี): ในทางกลับกัน ถ้าพลาดข้อความแจ้งว่า “หายไปแล้ว” NPC หรือผู้เล่นที่ตายหรือออกไปแล้วจะยังอยู่บนจอเราคนเดียว (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- ข้อมูลการปรากฏตัวที่ทะลักมาหลังเข้าโซนหาย: วินาทีที่เข้าโซน เซิร์ฟเวอร์จะส่งข้อมูลการปรากฏตัวของเอนทิตีรอบตัวหลายสิบถึงหลายร้อยตัวมาพร้อมกัน ถ้าส่งผ่านช่องทางแบบ unreliable หรือ receive buffer ล้นในช่วงที่ยังโหลดอยู่จนอ่านซ็อกเก็ตไม่ได้ บางส่วนจะหายไปและไม่ถูกส่งมาอีก (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- สับสนจากการนำ entity ID กลับมาใช้ซ้ำ: ถ้าเซิร์ฟเวอร์ใช้ entity ID เดิมซ้ำเมื่อ NPC ที่ตายเกิดใหม่ ไคลเอนต์ที่พลาดข้อความแจ้งการออกไปในช่วงนั้นจะเข้าใจผิดว่า NPC ตัวใหม่คือตัวเก่า (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- พอร์ต UDP แบบตายตัวชนกัน: ถ้าไคลเอนต์ถูกออกแบบให้ใช้พอร์ตภายในเครื่องที่กำหนดตายตัว ไคลเอนต์ตัวที่สองบน PC เดียวกันจะใช้พอร์ตไม่ได้ หรือต้องแบ่งรับแพ็กเก็ตกับตัวแรก (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- บั๊กแยกเซสชันด้วย IP/ID เครื่อง: ถ้าเซิร์ฟเวอร์หรือเซิร์ฟเวอร์ตัวกลางแยกการเชื่อมต่อด้วย IP หรือ ID เครื่อง สองไคลเอนต์ใน PC เดียวกัน (public IP เดียวกัน) จะถูกมองเป็นคนเดียว (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- การจำกัดการเปิดหลายไคลเอนต์: ถ้าโมดูลความปลอดภัยหรือนโยบายของเซิร์ฟเวอร์จำกัดการเปิดหลายไคลเอนต์ใน PC เดียว ไคลเอนต์ตัวที่สองจะเปิดหรือเชื่อมต่อไม่ได้ หรือตัวที่เปิดก่อนจะหลุด บางเกมบล็อกแค่บางฟีเจอร์ของไคลเอนต์ที่เปิดเพิ่ม (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- จำกัดการประมวลผลของหน้าต่างเบื้องหลัง: สำหรับไคลเอนต์ที่เป็นหน้าต่างเบื้องหลัง ตัวเกม เอนจิน และ OS จะลดเฟรมและการประมวลผลลง แพ็กเก็ตที่ได้รับจึงประมวลผลไม่ทันจนกองรอหรือล้น (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- การเข้าถึงไฟล์แคช/แอสเซ็ตพร้อมกันจนชนกัน: ถ้าสองไคลเอนต์เขียนลงโฟลเดอร์แคชเดียวกันพร้อมกันหรือล็อกไฟล์ไว้ ฝั่งหนึ่งจะโหลดโมเดลหรือเท็กซ์เจอร์ของ NPC ไม่ได้ (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- หน่วยความจำ/VRAM ไม่พอจนสตรีมล้มเหลว: ถ้าสองไคลเอนต์แบ่งหน่วยความจำกราฟิกกันใช้ จะไม่มีที่ให้โหลดโมเดลหรือเท็กซ์เจอร์ที่ต้องใช้ใหม่ บางส่วนจึงไม่ถูกวาด (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- ตัวเลือกการแสดงผลต่างกัน: ถ้าตัวเลือกอย่างการจำกัดจำนวนตัวละครที่แสดง, การซ่อนป้ายชื่อหรือโมเดล NPC และโหมดสเปกต่ำ ตั้งไว้ต่างกันในสองไคลเอนต์ สิ่งที่มองเห็นก็จะต่างกัน (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- เวอร์ชันไคลเอนต์/ข้อมูลไม่ตรงกัน: ถ้าไคลเอนต์ตัวที่สองเป็นตัวติดตั้งอื่นหรือแพตช์ยังไม่ครบ จะไม่รู้จัก NPC ID ใหม่ที่เซิร์ฟเวอร์ส่งมา และข้ามไปเงียบ ๆ (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
- งบการส่ง/ลำดับความสำคัญต่อการเชื่อมต่อ: ถ้าเซิร์ฟเวอร์จำกัดปริมาณที่ส่งต่อการเชื่อมต่อและส่งสิ่งที่อยู่ใกล้ก่อน ฝั่งที่ถูกตั้งเพดานไว้ต่ำจะได้รับ NPC ที่อยู่ไกลช้าหรือไม่ได้รับเลย (พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม))
- เอนทิตีถูกพักไว้เพราะประมาณเวลาคลาดเคลื่อน: ถ้าเวลาเซิร์ฟเวอร์ที่ไคลเอนต์ประมาณไว้ผิด ข้อมูลเอนทิตีที่เพิ่งมาถึงจะถูกพักไว้เพราะ “ยังเป็นอนาคต” หรือถูกทิ้งเพราะ “เก่าเกินไป” (พัฒนาไคลเอนต์ (ทีมพัฒนาเกม))
ดูพจนานุกรมอาการในฉบับหลักที่มีภาพ