คู่มือเกมแลค › L1 โปรเซสเกมฝั่งไคลเอนต์
หน่วยความจำรั่วฝั่งไคลเอนต์ Client memory leak
ID สาเหตุ cg-leak · ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
ยิ่งเปิดไว้นาน หน่วยความจำยิ่งเพิ่ม เกมช้าลงเรื่อย ๆ แล้วสุดท้ายก็ถูกบังคับปิด
ทำไม texture, UI และเอฟเฟกต์ไม่ถูกปล่อยคืนเมื่อย้ายแมพไปมา → ผลคือ GC ทำงานถี่ขึ้น และหน่วยความจำของ OS ไม่พอจนเกิด swap → บนหน้าจอ เล่นไปหลายชั่วโมงแล้วกระตุกขึ้นเรื่อย ๆ จนถูกบังคับปิด (ผู้เล่นเห็นเหมือนหลุด)
- อาการ
- กระตุก, หลุด
- ปัจจัย
- การหยุดชะงัก
- ใครเจอ
- เราคนเดียว
- เกิดเมื่อไร
- ยิ่งเปิดไว้นานยิ่งเป็น
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
- งานฝั่งทีมพัฒนาเกม
- วัดปริมาณการใช้หน่วยความจำตอนย้ายแมพ, หาและแก้ texture, UI และเอฟเฟกต์ที่ไม่ถูกปล่อยคืน, ทดสอบอัตโนมัติแบบรันยาว (soak test)
- บนกราฟ
- ค่อย ๆ สูงขึ้น · หน่วยความจำของโปรเซสเกม
- จุดที่ต้องดู
- บันทึก Process(เกม)\Private Bytes ด้วย Performance Monitor หลายชั่วโมง บนมือถือดูสาเหตุการปิด (REASON_LOW_MEMORY) จาก ApplicationExitInfo ของ Android และรายงาน jetsam ของ iOS
- สัญญาณว่าใช่
- หน่วยความจำเพิ่มขึ้นทุกครั้งที่ย้ายแมพและไม่ลดลง ยิ่งเปิดไว้นาน อาการกระตุกและการถูกบังคับปิดยิ่งเพิ่ม
- สัญญาณว่าไม่ใช่
- หน่วยความจำคงที่ แต่ยิ่งเปิดนานยิ่งสั่นอย่างเดียว: น่าจะเป็น “เวลาแบบ float สูญเสียความแม่นยำ”
- วิธีตรวจ
- ตรวจที่สภาพแวดล้อมฝั่งผู้เล่น
- รายละเอียดเพิ่มเติม
- มือถือส่วนใหญ่ประคองไว้ด้วยการบีบอัดหน่วยความจำ ถ้ายังไม่พออีก OS จะปิดเกมทันที (เด้ง) เครื่องที่ RAM น้อยยิ่งโดนปิดก่อน
แหล่งอ้างอิง
- Memory allocation among processes Android (Google)
Android ประคองไว้ด้วยการบีบอัดหน่วยความจำลง zRAM ถ้าไม่พอ low memory killer จะปิดโปรเซส ถ้าแอปที่เปิดอยู่บนหน้าจอถูกปิดจะดูเหมือนแครช - Identifying high-memory use with jetsam event reports Apple
ถ้าแรงกดดันด้านหน่วยความจำไม่ลดลง iOS จะบังคับปิดแอป (jetsam) และแอปที่ใช้หน่วยความจำเกินขีดจำกัดของตัวเองจะตกเป็นเป้าให้ถูกปิด - Find user-mode memory leaks with Performance Monitor (PerfMon) Microsoft
บันทึก Process > Private Bytes (หน่วยความจำเฉพาะที่โปรเซสจัดสรร) และ Virtual Bytes เป็นเวลานาน ถ้าเพิ่มขึ้นอย่างเดียวคือหน่วยความจำรั่ว - ApplicationExitInfo Android (Google)
REASON_LOW_MEMORY: low memory killer ของระบบปิดโปรเซสของแอป (เครื่องที่ไม่รองรับจะรายงานเป็น REASON_SIGNALED/SIGKILL)
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L1 โปรเซสเกมฝั่งไคลเอนต์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (กระตุก)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง