คู่มือเกมแลค › L2 OS และอุปกรณ์ฝั่งไคลเอนต์
สลับแอปมือถือไปเบื้องหลัง App suspended in background
ID สาเหตุ co-mobile-bg · ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ถ้าย่อแอปลงไปแป๊บเดียวเพื่อดูแจ้งเตือน OS จะพักการทำงาน (suspend) ของแอปภายในไม่กี่วินาที และระหว่างนั้นเซิร์ฟเวอร์จะตัดการเชื่อมต่อของเรา
ทำไม ย่อเกมลงเพื่อเช็กข้อความหรือรับสาย → ผลคือ เอนจินเกมหยุดการทำงานของเกม และอีกไม่นาน OS ก็หยุดแอปและเครือข่ายด้วย → บนหน้าจอ กลับมาก็หลุดไปแล้ว ต้องเชื่อมต่อใหม่
- อาการ
- หลุด
- ปัจจัย
- การหยุดชะงัก, แพ็กเก็ตหาย
- ใครเจอ
- เราคนเดียว
- เกิดเมื่อไร
- หลังอยู่เฉย ๆ สักพัก, ตอนทำแอ็กชันบางอย่าง
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- ไคลเอนต์: เมื่อกลับมาให้เชื่อมต่อใหม่อัตโนมัติด้วย session token ทันทีโดยไม่ต้องรอการเชื่อมต่อที่ขาดไป (ต่อเซสชันเดิมโดยไม่ต้องล็อกอินใหม่), รับสถานะล่าสุดครั้งเดียวแล้วปรับให้ตรงกัน เซิร์ฟเวอร์: เมื่อ heartbeat ขาด ให้ปิดการเชื่อมต่อแต่เก็บเซสชันของตัวละครไว้ในช่วงผ่อนผันสั้น ๆ (ไม่เตะออกทันที), ถ้าเชื่อมต่อใหม่ภายในช่วงนั้นให้รับช่วงต่อด้วย session token
- ตัวเลขที่ควรรู้
- ปกติเอนจินเกมจะหยุดทันทีที่ย่อแอป iOS จะพักการทำงานของแอปภายในไม่กี่วินาที แม้ขอเวลาเพิ่มได้ก็มักไม่เกินหลายสิบวินาที ส่วน Android 14 ขึ้นไปจะแช่แข็ง (freeze) แอปที่ออกจากหน้าจอหลังผ่านไปราว 10 วินาที
- บนกราฟ
- การเชื่อมต่อหลุดพร้อมกัน · จำนวนครั้งที่หลุด (heartbeat timeout), บันทึกการพักแอป
- จุดที่ต้องดู
- จับคู่เวลาที่แอปพักและกลับมาใน log ของไคลเอนต์ (Unity คือ OnApplicationPause) กับสาเหตุและเวลาที่หลุดฝั่งเซิร์ฟเวอร์ด้วย session ID บน Android ดูสาเหตุการปิดโปรเซสที่บันทึกใน ApplicationExitInfo (REASON_LOW_MEMORY ฯลฯ) ประกอบด้วย
- สัญญาณว่าใช่
- ก่อนเซิร์ฟเวอร์ตัดการเชื่อมต่อเพราะ heartbeat timeout ไคลเอนต์เข้าสู่การพักการทำงาน และเชื่อมต่อใหม่ทันทีหลังกลับมา
- สัญญาณว่าไม่ใช่
- หลุดระหว่างที่แอปเปิดอยู่บนหน้าจอ: น่าจะเป็น “NAT mapping หมดอายุ”, “IP ที่ ISP ให้ใช้ร่วมกัน (CGNAT)” หรือ “สลับ Wi-Fi ↔ LTE/5G”
- วิธีตรวจ
- ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม
- รายละเอียดเพิ่มเติม
- ถ้าหน่วยความจำไม่พอ มือถือบางครั้งก็ปิดเกมที่ย่อไว้ไปเลย นี่คือเหตุผลที่สลับไปแอปกล้องหรือแอปชำระเงิน/ยืนยันตัวตนแล้วกลับมา เกมต้องเริ่มใหม่ตั้งแต่ต้น เครื่องสเปกต่ำยิ่งเจอบ่อย
แหล่งอ้างอิง
- Extending your app’s background execution time Apple
เมื่อแอปไปอยู่เบื้องหลังจะได้เวลา 5 วินาทีใน applicationDidEnterBackground แล้วถูกพักการทำงานในไม่ช้า ถ้าต้องการเวลาเพิ่มให้ขอด้วย beginBackgroundTask (เวลาที่เหลือดูได้จาก backgroundTimeRemaining) - Cached apps freezer Android (Google)
Android 14 ขึ้นไปจะแช่แข็งโปรเซสของแอปที่เข้าสู่สถานะ cached หลังผ่านไป 10 วินาที เมื่อถูกแช่แข็ง ทุกเธรดจะหยุด - Application.runInBackground Unity
ค่าเริ่มต้นเป็น false จึงหยุดเมื่ออยู่เบื้องหลัง Android จะหยุดเมื่ออยู่เบื้องหลังไม่ว่าจะตั้งค่าอย่างไร ส่วน iOS ไม่สนใจการตั้งค่านี้ - MonoBehaviour.OnApplicationPause(bool) Unity
เมื่อแอปถูกพักหรือกลับมาทำงาน จะส่ง OnApplicationPause(true/false) ไปยัง MonoBehaviour ทุกตัว - ApplicationExitInfo Android (Google)
REASON_LOW_MEMORY: low memory killer ของระบบปิดโปรเซสของแอป (เครื่องที่ไม่รองรับจะรายงานเป็น REASON_SIGNALED/SIGKILL)
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L2 OS และอุปกรณ์ฝั่งไคลเอนต์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (หลุด)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง