한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

คู่มือเกมแลค › L1 โปรเซสเกมฝั่งไคลเอนต์

โหลดแบบ synchronous และคอมไพล์ shader บนเมนเธรด Synchronous asset load, shader compile

ID สาเหตุ cg-sync-load · ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)

เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →

เกมหยุดเพราะต้องอ่านไฟล์และสร้าง shader ก่อนวาดพื้นที่, มอนสเตอร์ หรือเอฟเฟกต์ที่เพิ่งเห็นเป็นครั้งแรก

ทำไม เข้าพื้นที่ใหม่ หรือเจอสกิล, อุปกรณ์สวมใส่ และมอนสเตอร์ที่ไม่เคยเห็น → ผลคือ เมนเธรดรอการอ่านไฟล์และการคอมไพล์ shader → บนหน้าจอ ค้าง 0.1–1 วินาทีแค่ครั้งแรก ตั้งแต่ครั้งที่สองก็ปกติ

อาการ
ค้าง, กระตุก
ปัจจัย
การหยุดชะงัก
ใครเจอ
เราคนเดียว
เกิดเมื่อไร
ระหว่างเดินทาง/ย้ายแมพ, ตอนทำแอ็กชันบางอย่าง
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม
โหลดแบบ async, โหลดเตรียมไว้ล่วงหน้า (prewarming), คอมไพล์ shader ล่วงหน้าตอนหน้าโหลดหรือตอนเปิดเกมครั้งแรก, ใช้ประโยชน์จากหน้าโหลด
ตัวเลขที่ควรรู้
คอมไพล์ shader หนึ่งตัวใช้หลายสิบ ms ถ้านานอาจเกิน 100 ms ส่วนการโหลด texture ใช้หลายสิบถึงหลายร้อย ms ขึ้นกับความเร็วของสตอเรจ
บนกราฟ
พุ่งทันทีหลังเปิดเซิร์ฟ/ปิดปรับปรุง · จำนวนเฟรมที่พุ่ง (ทันทีหลังแพตช์หรืออัปเดตไดรเวอร์)
จุดที่ต้องดู
อัดด้วย PresentMon บนเส้นทางเดิมสองรอบ แล้วเทียบการไปครั้งแรกกับครั้งที่สอง ใน development build ของ Unreal เปิด r.PSOPrecache.Validation แล้วดู stat PSOPrecache และ “PSO PRECACHING MISS” ใน log ส่วน Unity ดูช่วงโหลดและ shader ของเฟรมที่พุ่งใน Timeline ของ Profiler
สัญญาณว่าใช่
พุ่ง 0.1–1 วินาทีเฉพาะที่ที่ไปครั้งแรกหรือสกิลที่ใช้ครั้งแรก และหายไปในครั้งที่สอง การแจ้งปัญหาพุ่งขึ้นทันทีหลังแพตช์หรืออัปเดตไดรเวอร์กราฟิก แล้วค่อย ๆ ลดลง
สัญญาณว่าไม่ใช่
พุ่งที่จุดเดิมทุกครั้ง: ไม่ใช่ปัญหา shader cache ถ้าเกิดซ้ำทุกครั้งที่เคลื่อนที่และเป็นเฉพาะ PC ที่สตอเรจช้า น่าจะเป็น “สตอเรจช้าจนสตรีมแอสเซ็ตไม่ทัน” ถ้าหน่วยความจำ GPU เฉพาะ (dedicated) เต็ม น่าจะเป็น “หน่วยความจำกราฟิก (VRAM) ไม่พอ”
วิธีตรวจ
ต้องมี log หรือเมตริกจากเซิร์ฟเวอร์/ไคลเอนต์เกม
รายละเอียดเพิ่มเติม
บน PC ไดรเวอร์กราฟิกจะเก็บ shader ที่สร้างแล้วไว้ใน shader cache เพื่อใช้ซ้ำ ดังนั้นหลังอัปเดตไดรเวอร์กราฟิกหรือหลังเกมลงแพตช์ใหม่ แคชนี้จะใช้ไม่ได้ คนที่เคยเล่นได้ลื่นก็จะกลับมากระตุกอยู่ช่วงหนึ่ง การแจ้งปัญหาแบบ “หลังแพตช์ ไปที่ไหนครั้งแรกก็หยุดแวบทุกที่” เป็นรูปแบบการแจ้งปัญหาที่เจอได้บ่อย

แหล่งอ้างอิง

  1. Shader loading Unity
    ครั้งแรกที่ใช้ shader variant ไดรเวอร์กราฟิกต้องสร้างเวอร์ชันสำหรับ GPU จึงอาจหยุดจนสังเกตได้ ส่วนที่สร้างแล้วจะถูกแคชไว้และไม่หยุดอีก
  2. Optimizing Rendering With PSO Caches in Unreal Engine Epic Games
    ถ้าสร้าง pipeline state (PSO) ในจังหวะที่ต้องใช้ อาจกินเวลาเกิน 100 ms จึงต้องสร้างเตรียมไว้ล่วงหน้า
  3. Direct3D 12 Return Codes Microsoft
    D3D12_ERROR_DRIVER_VERSION_MISMATCH: PSO cache ที่สร้างจากไดรเวอร์คนละเวอร์ชันใช้ซ้ำไม่ได้ (ต้องคอมไพล์ใหม่หลังอัปเดตไดรเวอร์)
  4. PresentMon Capture Application (README-CaptureApplication.md) Intel
    อัดเวลาของแต่ละเฟรมด้วย FrameTime (เวลา CPU ระหว่างเฟรม)
  5. PSO Precaching for Unreal Engine Epic Games
    เมื่อเปิด r.PSOPrecache.Validation จะดูสถิติ PSO ที่พลาดได้ด้วย stat PSOPrecache และมี “PSO PRECACHING MISS” ใน log ถ้าการสร้าง PSO ตอนรันเกินค่าเริ่มต้น 20 ms จะนับเป็น hitch

สาเหตุที่ควรดูประกอบ

ชั้นเดียวกัน: L1 โปรเซสเกมฝั่งไคลเอนต์

สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (ค้าง)

ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง