บทความทั้งหมด
บทเรียน · 7 min read

ทำให้เกมของคุณรันบนมันฝรั่ง: การเพิ่มประสิทธิภาพสภาพแวดล้อมสำหรับ PC สเปกต่ำและ Steam Deck

คู่มือปฏิบัติสำหรับการเข้าเป้างบเฟรมต่ำโดยไม่ควักไส้งานศิลป์ของคุณ: เวลาเฟรมไปไหนจริง ๆ, overdraw กับใบไม้, draw call กับ instancing, LOD กับระยะ cull, และวิธีกล้องคงที่เพื่อหา regression ที่แท้จริง

Slow tropical river between dense green banks, with clouds mirrored on the surface

สรุปสั้น ๆ: ผู้เล่นสัดส่วนมหาศาลอยู่บนฮาร์ดแวร์ต่ำต้อย (แล็ปท็อป เครื่องพกพาอย่าง Steam Deck GPU เก่ากว่า) และ สภาพแวดล้อมที่รันได้แค่บนเครื่องระดับสูงตัดพวกเขาออกไป ข่าวดี: ประสิทธิภาพสภาพแวดล้อมส่วนใหญ่สูญไปในไม่กี่ที่ที่คาดเดา ได้ (overdraw, draw call, ใบไม้หนาแน่น, เท็กซ์เจอร์ใหญ่เกิน) และทวงคืนด้วยไม่กี่นิสัยที่มีวินัย นี่คือคู่มือปฏิบัติเพื่อ เข้าเป้างบเฟรมต่ำโดยไม่ควักไส้งานศิลป์ของคุณ บวกกับวิธีกล้องคงที่เพื่อจับ regression ก่อนส่งออก

ป่าหนาแน่นอัดแน่นด้วยต้นไม้และพุ่มไม้ที่ทับซ้อน นี่คือประเภทฉากที่แพงที่สุดในการรัน ชั้นของใบโปร่งใส อินสแตนซ์หลายพัน overdraw หนัก มันยังเป็นที่ที่ชัยชนะที่ใหญ่ ที่สุด ง่ายที่สุดอาศัยอยู่เมื่อคุณรู้ว่าเวลาเฟรมไปไหน

ตั้งงบก่อน เป็นมิลลิวินาที

เลือกเวลาเฟรมเป้าหมายบนฮาร์ดแวร์ที่อ่อนที่สุดที่คุณรองรับ (16.6 ms สำหรับ 60 fps, 33.3 ms สำหรับ 30) และปฏิบัติต่อมันเป็นขีดจำกัดแข็ง "เพิ่มประสิทธิภาพทีหลัง" หมายถึง "สร้างใหม่ทีหลัง"; ตั้งงบล่วงหน้าถูกกว่ามาก

การเพิ่มประสิทธิภาพโดยไม่มีตัวเลขก็แค่ความรู้สึก ตัดสินเฟรมที่คุณเล็งบนฮาร์ดแวร์ พื้น ของคุณ (Steam Deck แล็ปท็อป ระดับกลาง สเปกต่ำสุดของคุณเป็นอะไรก็ตาม) และแปลงเป็นมิลลิวินาที เพราะมิลลิวินาทีสะสมและเปอร์เซ็นต์โกหก แล้วยึดทุกฉากไว้ กับมันขณะสร้าง ไม่ใช่ตอนจบ ทีมที่ส่งออกลื่นบนสเปกต่ำไม่ได้เพิ่มประสิทธิภาพหนักกว่า พวกเขาแค่ไม่เคยปล่อยให้ฉากทำงบระเบิด ตั้งแต่แรก ซึ่งเป็นเศษเสี้ยวของต้นทุนในการควักประสิทธิภาพกลับมาหลังจากงานศิลป์เสร็จและทุกอย่างขึ้นกับมัน

รู้ว่าเวลาไปไหน

เวลาเฟรมสภาพแวดล้อมมักถูกกินโดย overdraw (ใบไม้โปร่งใส) draw call มากไป (วัตถุที่ไม่ batch) เท็กซ์เจอร์ ใหญ่เกิน (แบนด์วิดท์หน่วยความจำ) และแสง/เงาที่แพง โปรไฟล์เพื่อหาคอขวด ของคุณ ก่อนเพิ่มประสิทธิภาพแบบตาบอด

การเดาการเพิ่มประสิทธิภาพเสียเวลาหลายวัน เปิดโปรไฟเลอร์ หาว่าคุณ CPU-bound (มักคือ draw call) หรือ GPU-bound (มักคือ overdraw, การเชด หรือแบนด์วิดท์) และโจมตีคอขวดจริง กระนั้น สภาพแวดล้อมล้มเหลวในทางที่คาดเดาได้ และเกือบเสมอเป็นหนึ่งใน: overdraw จากใบโปร่งใสเป็นชั้น; draw call จากวัตถุที่ไม่ instance หลายพัน; หน่วยความจำ/แบนด์วิดท์เท็กซ์เจอร์ จากเท็กซ์เจอร์ใหญ่เกินหรือมากเกิน; และต้นทุน แสง/เงา จากไฟไดนามิกมากไปหรือแผนที่เงาความละเอียดสูง ส่วนที่เหลือของคู่มือ นี้ไล่ผ่านสิ่งเหล่านั้นตามลำดับผลกระทบปกติ

ใบไม้และ overdraw: ตัวร้ายประจำ

การ์ดใบไม้โปร่งใสทับซ้อนและเชดพิกเซลเดิมซ้ำหลายครั้ง นั่นคือ overdraw และเป็นนักฆ่าอันดับหนึ่งของสเปกต่ำ ลดการทับซ้อนของการ์ดใบ ใช้ LOD ก้าวร้าว และ cull ใบไม้ไกลอย่างแรง

พืชหนาแน่นคือที่ที่งบเฟรมสเปกต่ำส่วนใหญ่ตาย เพราะการ์ดใบกึ่งโปร่งใสแต่ละใบบังคับ GPU ให้เชดพิกเซลที่มันจะวาดทับอีกที บางครั้งสิบครั้งขึ้นไปต่อพิกเซลในเรือนยอดหนา การแก้: ใช้การ์ดใบที่แน่นกว่าโดยมีพื้นที่โปร่งใสเสียเปล่าน้อยลง ตกลงสู่ LOD ที่ถูกกว่าอย่างรวดเร็วเมื่อใบไม้ถอยห่าง และตั้งระยะ cull แข็งเพื่อให้หญ้าและพุ่มไม้ไกลหยุดวาดเฉย ๆ บนเครื่องพกพา ความต่าง ระหว่าง "หญ้าถึงขอบฟ้า" กับ "หญ้าที่ cull ที่ระยะสมเหตุสมผล" อาจเป็นความต่างทั้งหมดระหว่าง 25 กับ 40 fps เบคใบไม้เป็นอินสแตนซ์ เนทีฟเพื่อให้ GPU batch มันได้ และให้ instancing ของเอนจินทำงานหนัก

Draw call และ instancing

วัตถุเฉพาะแต่ละชิ้นที่ส่งแยกกันคือ draw call หนึ่งครั้ง และหลายพันครั้งทำ CPU สะดุด instance เมชที่ซ้ำเพื่อ ให้สำเนาหลายร้อยชิ้นเสีย call เดียว; รวมเศษวัตถุสแตติกที่ที่สมเหตุสมผล

ถ้าคุณ CPU-bound draw call มักเป็นเหตุผล ทุกสิ่งที่ต่างกันที่คุณขอให้เอนจินเรนเดอร์แบกโอเวอร์เฮด และฉากที่วางด้วยมือด้วยหิน และพุ่มไม้แยกชิ้นหนึ่งพันจม CPU ในต้นทุนการส่ง instancing คือยารักษา: เมชที่ซ้ำที่วาดเป็นอินสแตนซ์ยุบสำเนาหลายร้อยชิ้นเป็น call เดียว ซึ่งเป็นเหตุผลที่แน่ชัดว่าเครื่องมือ scatter ที่ เบคเป็นอินสแตนซ์เนทีฟของเอนจิน สำคัญต่อประสิทธิภาพ (scatter ที่ดูเหมือนพืชหนึ่งพันต้นเสียเหมือนกำมือเดียวที่ instancing ไม่ใช้ การรวมเศษวัตถุสแตติกเล็กเป็นเมชรวมก็ตัดจำนวน call เช่นกัน) เวิร์กโฟลว์อย่างของ Numivo ที่เพนต์ความหนาแน่น แล้วเบคเป็นเมชอินสแตนซ์ธรรมดา จึงคุ้มค่าโดยตรงบนฮาร์ดแวร์อ่อน เพราะเอาต์พุตคือของถูกที่ GPU ต้องการ

ทะเลสาบสงบเรียบง่ายใต้ท้องฟ้าใส เรนเดอร์ถูก ไม่ใช่ทุกฉากต้องหนาแน่นสูงสุด พื้นที่เงียบเปิดโล่งเสียแทบไม่มีอะไรและให้ทั้งฮาร์ดแวร์และผู้เล่นพัก การจัดจังหวะความหนา แน่นของคุณเองก็เป็นการเพิ่มประสิทธิภาพ

LOD, ระยะ cull และขนาดเท็กซ์เจอร์

ให้ทุกเมชสำคัญมี LOD เพื่อให้สำเนาไกลถูก ตั้งระยะ cull เพื่อให้วัตถุจิ๋วบนจอหยุดวาด และจำกัดความละเอียดเท็กซ์ เจอร์ที่สิ่งที่กล้องแยกได้ที่ระยะ สามอย่างนี้ทวงคืนได้มากด้วยแรงน้อย

สามนิสัยไร้ความหรูหราแบกงบที่เหลือส่วนใหญ่ LOD: เมชไกลควรสลับเป็นเวอร์ชันโพลีต่ำกว่า เพราะรายละเอียดเต็มบนต้นไม้ 20 พิกเซลเสียเปล่า ระยะ cull: อะไรก็ตามที่เล็กบนจอเกินกว่าจะสังเกตควรหยุดเรนเดอร์โดยสิ้นเชิง (พร็อพเล็ก กรวด หญ้าละเอียด) ปรับตามประเภทวัตถุ ขนาดเท็กซ์เจอร์: จำกัดความละเอียดที่สิ่งที่แยกได้จริงที่ระยะผู้เล่น (ดูตรรกะความหนาแน่นเท็กเซล สิ่งไกลต้องการเท็กเซลน้อยกว่ามาก) เพราะเท็กซ์เจอร์ใหญ่เกินเผาแบนด์วิดท์หน่วยความจำที่ GPU สเปกต่ำเจียดไม่ได้ ไม่มีอันไหน ทำร้ายหน้าตาเมื่อปรับถูก; มันแค่หยุดคุณจากการจ่ายเพื่อรายละเอียดที่ไม่มีใครเห็น

หา regression ด้วยกล้องคงที่

กำหนด "กล้องงบ" ไม่กี่ตัว (วิวแย่ที่สุดของคุณ พื้นที่ต่อสู้หนาแน่นที่สุด ภายในวุ่นวายที่สุด) และเช็คเวลาเฟรม ของมันทุก build การบินผ่านสุ่มซ่อน regression; มุมมองโหด ๆ เดิมทุกครั้งเผยมันออกมา

ประสิทธิภาพเน่าเงียบ ๆ เมื่อเนื้อหาถูกเพิ่ม และคุณจะไม่จับมันด้วยการเดินเล่นในด่านแบบสบาย ๆ แทนที่ ปักหมุดมุมมอง แย่ที่สุด กำมือของคุณ (จุดชมป่าหนา ตลาดแออัด การต่อสู้หนักเอฟเฟกต์) และวัดพวกนั้นตรง ๆ ทุก build เทียบกับงบ เมื่อตัวเลขแดง คุณรู้ว่า การเปลี่ยนแปลงล่าสุดทำให้เกิด และคร่าว ๆ ตรงไหน นี่คือความต่างระหว่างทีมที่ค้นพบวิกฤตประสิทธิภาพตอนจบกับทีมที่แก้ regression 2 ms ในวันที่มันปรากฏ บนเป้าหมายสเปกต่ำ ให้กล้องหนึ่งในนั้นรันบน Steam Deck จริงหรือเครื่องสเปกต่ำสุด ไม่ใช่แค่การประมาณ ของเอดิเตอร์

ตัวเลขภาคสนามที่ควรขโมย

  • งบเฟรม: 16.6 ms (60 fps) / 33.3 ms (30 fps) ตั้งบนฮาร์ดแวร์ พื้น ของคุณ
  • นักฆ่าสเปกต่ำประจำ: overdraw ใบไม้ การ์ดแน่นกว่า LOD เร็ว cull แข็ง
  • เมชที่ซ้ำ → อินสแตนซ์: สำเนาหลายร้อยชิ้นต่อ draw call เดียว
  • จำกัดขนาดเท็กซ์เจอร์ที่ รายละเอียดที่กล้องแยกได้ สิ่งไกลต้องการเท็กเซลน้อยกว่ามาก
  • จับ regression ด้วย กล้องงบคงที่ วัดทุก build

คำถามพบบ่อยฉบับย่อ

ฉันต้องเลือกระหว่างดูดีกับสเปกต่ำไหม? น้อยกว่าที่คุณคิด ต้นทุนสเปกต่ำส่วนใหญ่คือความสูญเปล่า (overdraw, call ที่ไม่ batch, เท็กซ์เจอร์ใหญ่เกิน) ไม่ใช่คุณภาพที่มองเห็น ตัดความสูญเปล่าแล้วงานศิลป์รอด; ผู้เล่นบนฮาร์ดแวร์อ่อนแทบไม่คิดถึงราย ละเอียดที่คุณจ่ายแต่พวกเขามองไม่เห็น

แสงไดนามิกเป็นเขตห้ามบน Steam Deck ไหม? ไม่ห้าม แต่มีงบ จำกัดจำนวนไฟไดนามิกและตัวทอดเงา พึ่งแสงเบคที่ที่ฉากสแตติก และ สงวนต้นทุนไดนามิกไว้ที่ที่สำคัญ เป็นบรรทัดงบ ไม่ใช่คำสั่งห้าม

การเปลี่ยนแปลงเดี่ยวอะไรช่วยที่สุดบนเครื่องพกพา? มักคือการเชื่องใบไม้: การ์ดใบแน่นกว่า LOD ก้าวร้าว และระยะ cull แข็ง บนหญ้าและพุ่มไม้ overdraw คือคอขวดเครื่องพกพาที่พบบ่อยที่สุด และพืชคือที่ที่ overdraw อาศัยอยู่

ฉันควรทดสอบบนฮาร์ดแวร์เป้าหมายเร็วแค่ไหน? ตั้งแต่ vertical slice แรก การประมาณของเอดิเตอร์บนเครื่องพัฒนาทรงพลังซ่อนปัญหา ที่เครื่องพกพาจะมีพอดี เอา build ลงบนอุปกรณ์สเปกต่ำสุดจริงแต่เนิ่น ๆ และเก็บไว้ในลูป

การรันบนมันฝรั่งไม่ใช่เรื่องทำเกมของคุณให้น่าเกลียด (มันคือเรื่องไม่จ่ายเพื่อรายละเอียดที่ผู้เล่นมองไม่เห็น ตั้งงบเป็นมิลลิ วินาที ฆ่า overdraw instance สิ่งที่ซ้ำ cull สิ่งที่มองไม่เห็น และจับตากล้องแย่ที่สุดของคุณทุก build) แล้วสภาพแวดล้อมของ คุณจะดูเยี่ยม และ รันสำหรับผู้ชมมหาศาลที่ไม่ได้อยู่บนเครื่องระดับสูง