คู่มือเกมแลค › L1 โปรเซสเกมฝั่งไคลเอนต์
สตอเรจช้าจนสตรีมแอสเซ็ตไม่ทัน Slow storage stalls asset streaming
ID สาเหตุ cg-asset-stream · ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ ภายนอก (ภายนอก)
เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →
บนสตอเรจช้าอย่าง HDD การอ่าน texture และโมเดลของโอเพนเวิลด์ตามการเคลื่อนที่ไม่ทัน เอนทิตีจึงโผล่ช้า หรือเกมกระตุกระหว่างรออ่านข้อมูล
ทำไม เคลื่อนที่เร็วด้วยพาหนะหรือเทเลพอร์ต หรือเข้าไปในที่ที่คนเยอะ จนต้องใช้ texture และโมเดลใหม่จำนวนมากพร้อมกัน → ผลคือ สตอเรจช้าอย่าง HDD อ่านได้ไม่ทันความเร็วที่ต้องการ คำขออ่านจึงกองรอ และการโหลดบางส่วนทำให้เมนเธรดต้องรอจนเสร็จ → บนหน้าจอ texture เบลออยู่พักหนึ่ง อาคารและตัวละครโผล่ช้า และกระตุกหรือค้างตอนที่รออ่าน
- อาการ
- มองไม่เห็น/ตัวผี, กระตุก, ค้าง
- ปัจจัย
- การหยุดชะงัก
- ใครเจอ
- เราคนเดียว
- เกิดเมื่อไร
- ระหว่างเดินทาง/ย้ายแมพ, ตอนคนแห่มารวมกัน
- ผู้รับผิดชอบ
- ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม) · ร่วมกับ ภายนอก (ภายนอก)
- งานฝั่งทีมพัฒนาเกม
- สตรีมแบบ async ที่ไม่ให้เมนเธรดรอการอ่าน, อ่านล่วงหน้าตามทิศทางและความเร็วการเคลื่อนที่, แสดงความละเอียดต่ำ (mipmap) หรือโมเดลอย่างง่ายก่อนแล้วค่อยเปลี่ยน, ถ้าสตรีมไม่ทันระหว่างเคลื่อนที่เร็วให้จำกัดความเร็วการเคลื่อนที่ชั่วคราวหรือใช้หน้าโหลด, ระบุในสเปกขั้นต่ำและสเปกแนะนำว่าต้องใช้ SSD หรือไม่
- งานฝั่งภายนอก
- แนะนำให้ผู้เล่นติดตั้งเกมบน SSD, แนะนำให้ผู้เล่นตรวจว่ามีการดาวน์โหลดหรือการสแกนของแอนตี้ไวรัสทำงานอยู่บนดิสก์เดียวกันหรือไม่
- ตัวเลขที่ควรรู้
- ตามคำอธิบายของ Microsoft ฮาร์ดดิสก์รุ่นเก่าอ่านได้หลายสิบ MB ใน 1 วินาที NVMe SSD อ่านได้หลาย GB ใน 1 วินาที และเกมยุคก่อนใช้แบนด์วิดท์สำหรับการสตรีมราว 50 MB ใน 1 วินาที ถ้าเอาเกมที่ออกแบบโดยถือว่ามีความเร็วระดับ SSD และอ่านมากกว่านี้มากไปเล่นบน HDD การอ่านก็มักตามการเคลื่อนที่ไม่ทัน
- บนกราฟ
- สูงเฉพาะบางกลุ่ม · จำนวนเฟรมที่พุ่ง (แยกตามชนิดสตอเรจ), ดีเลย์การอ่านดิสก์
- จุดที่ต้องดู
- บันทึก PhysicalDisk\Avg. Disk sec/Read (เวลาเฉลี่ยต่อการอ่านหนึ่งครั้ง) และ Current Disk Queue Length จาก Performance Monitor ของ Windows คู่กับเฟรมไทม์จาก PresentMon ขณะเคลื่อนที่เร็ว ใน development build ดู stat Streaming และ stat AsyncLoad ของ Unreal หรือคำเตือน AssetBundle.asset/allAssets ใน Unity Profiler (ขอผลลัพธ์ก่อนโหลดเสร็จ เมนเธรดจึงต้องรอ)
- สัญญาณว่าใช่
- ตอนเคลื่อนที่เร็ว ดีเลย์การอ่านดิสก์และคิวพุ่งสูง และในเวลาเดียวกันเฟรมพุ่งหรือ texture และเอนทิตีโผล่ช้า เล่นฉากเดียวกันบน SSD แล้วหายไป
- สัญญาณว่าไม่ใช่
- ดิสก์ว่างแต่ texture เบลอ: น่าจะเป็น “หน่วยความจำกราฟิก (VRAM) ไม่พอ” ถ้าไปที่เดิมครั้งที่สองแล้วปกติ น่าจะเป็น “โหลดแบบ synchronous และคอมไพล์ shader บนเมนเธรด”
- วิธีตรวจ
- ตรวจที่สภาพแวดล้อมฝั่งผู้เล่น
- รายละเอียดเพิ่มเติม
- ถ้าหยุดแค่ครั้งแรกแล้วครั้งต่อไปปกติ จะใกล้กับ “โหลดแบบ synchronous และคอมไพล์ shader บนเมนเธรด” แต่ถ้าเกิดซ้ำทุกครั้งที่เคลื่อนที่และเป็นเฉพาะ PC ที่สตอเรจช้า ก็คือสาเหตุนี้ ส่วน “หน่วยความจำกราฟิก (VRAM) ไม่พอ” ซึ่งต้องปลด texture ออกแล้วโหลดกลับเข้ามาเพราะหน่วยความจำกราฟิกไม่พอ ก็ทำให้ texture เบลอได้เหมือนกัน จึงควรดูการรออ่านดิสก์คู่กับปริมาณการใช้หน่วยความจำกราฟิก การสแกนแบบเรียลไทม์ของแอนตี้ไวรัสที่เข้ามาแทรกทุกครั้งที่เปิดไฟล์เกม ก็อาจทำให้อ่านช้าลงไปอีก
แหล่งอ้างอิง
- DirectStorage is coming to PC Microsoft
ฮาร์ดดิสก์รุ่นเก่าอ่านได้หลายสิบ MB ต่อวินาที, NVMe SSD หลาย GB ต่อวินาที, งบการสตรีมแอสเซ็ตของเกมยุคก่อนราว 50 MB ต่อวินาที, เกมโอเพนเวิลด์อ่านและทิ้งฉากที่อยู่ไกลแบบเรียลไทม์ขณะเคลื่อนที่ - Texture and mesh loading Unity
การอัปโหลดแบบ synchronous จะอ่านและอัปโหลดในเฟรมเดียวบนเมนเธรด ทำให้หยุดจนสังเกตได้ ส่วนการอัปโหลดแบบ async จะสตรีมกระจายไปหลายเฟรม - Texture Streaming Overview for Unreal Engine Epic Games
ตัวสตรีมจะเพิ่มหรือลดความละเอียดของ texture (mip) ตามมุมมอง การคำนวณส่วนใหญ่ทำใน worker thread แบบ async และโหลด mip ที่เห็นบนจอก่อน - Profiler markers reference Unity
คำเตือน AssetBundle.asset/allAssets: ขอผลลัพธ์ก่อนโหลดเสร็จ เมนเธรดจึงหยุดรอ - Stat Commands in Unreal Engine Epic Games
stat Streaming (หน่วยความจำและจำนวนของ texture ที่สตรีม), stat AsyncLoad (สถิติการโหลดแบบ async) - Windows Performance Monitor Disk Counters Explained Microsoft
Avg. Disk sec/Read คือเวลาเฉลี่ยที่การอ่านหนึ่งครั้งใช้จนเสร็จ (ดีเลย์ของ I/O), Current Disk Queue Length คือความยาวคิวดิสก์ ณ ขณะที่วัด - PresentMon Capture Application (README-CaptureApplication.md) Intel
อัดเวลาของแต่ละเฟรมด้วย FrameTime (เวลา CPU ระหว่างเฟรม) - About regular quick and full scans with Microsoft Defender Antivirus Microsoft
การป้องกันแบบเรียลไทม์จะสแกนทุกครั้งที่เปิดและปิดไฟล์
สาเหตุที่ควรดูประกอบ
ชั้นเดียวกัน: L1 โปรเซสเกมฝั่งไคลเอนต์
สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (มองไม่เห็น/ตัวผี)
ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง