คำจำกัดความทางเทคนิคของ“ การสไปรต์แบทช์คืออะไร”


17

แพลตฟอร์มและภาษา agnostically, ชุดสไปรท์แบทช์ถูกกำหนดอย่างไร? ดูเหมือนว่ามีเทคนิคที่แตกต่างกันมากมายในการลดปริมาณงานเมื่อวาดภาพและพวกเขามักจะใช้ก้อน "แบตช์" มันเกิดขึ้นกับฉันว่าอาจไม่มีคำตอบที่แท้จริง แต่อาจมีบางคนที่นี่พบสิ่งที่ฉันไม่มี

คำตอบ:


14

ในทางเทคนิค "การแบทช์" กำลังวางการกระทำหลายอย่างและข้อมูลลงในโครงสร้างข้อมูลเดียวเพื่อให้สามารถดำเนินการได้พร้อมกันมากกว่าทีละรายการ

คอขวดที่ใหญ่ที่สุดของ GPU สมัยใหม่ไม่ใช่พลังในการทำงาน แต่เป็นการสื่อสารระหว่างเกมของคุณที่ทำงานบน CPU และ GPU แต่ละแพ็คเกจของข้อมูลที่ส่งไปยัง GPU นั้นมีค่าใช้จ่าย แต่ค่าใช้จ่ายของแพคเกจขนาดเล็กนั้นใหญ่พอ ๆ กับแพ็กเกจขนาดใหญ่ดังนั้นมันจึงเป็นประโยชน์อย่างมากเมื่อคุณส่งแพ็กเกจขนาดใหญ่หนึ่งชุด และนั่นคือสิ่งที่แบทช์คือ; ทำหนึ่งแพคเกจใหญ่จากทั้งหมดที่เล็กกว่า

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


1
+1 สำหรับการกล่าวถึงปัญหาความล่าช้า นี่เป็นหลักการเดียวกันกับที่ใช้กับเครือข่ายทราฟฟิกและดิสก์ I / O - ในกรณีทั่วไปมีแบตช์ขนาดใหญ่น้อยมากเมื่อเทียบกับแบทช์ขนาดเล็กจำนวนมาก
Maximus Minimus

9

Sprite batching เป็นวิธีการส่งสไปรต์หลาย ๆ ตัวไปยัง GPU ด้วยการดึงสายเดี่ยว

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

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

หากคุณใช้แผนที่เทพดาจากนั้นสร้าง VBO เดี่ยวด้วยสไปรต์ของคุณทั้งหมดที่กรอกไว้ในนั้นทำการร้องขอการดึงครั้งเดียวกับข้อมูลนั้นคุณรับประกันได้ว่าฮาร์ดแวร์จะถูกใช้อย่างเต็มที่และ Sprite ทั้งหมดของคุณจะแสดงผลแบบขนาน

Sprite batching นั้นกำลังทำสิ่งนั้น: วาง sprite ของคุณให้มากที่สุดเท่าที่จะเป็นไปได้ใน VBO เดียวโดยใช้ Atlas เดี่ยวที่ถูกส่งไปยัง GPU ด้วยการดึงสายเดียวเพิ่มการใช้ GPU ให้มากที่สุด

มีวิธีอื่นในการทำ Sprite batching (เช่นการติดตั้งฮาร์ดแวร์, การใช้รูปทรงเรขาคณิต, ฯลฯ ) และผลประโยชน์อื่น ๆ ในการทำเช่นนั้น แต่ส่วนสำคัญของมันคือการแบทช์หมายถึงการวาดวัตถุหลายรายการต่อการดึงสาย


-1: การลดการเปลี่ยนแปลงสถานะไม่ใช่ "จุด" ของการแบทช์ เป็นเพียงข้อกำหนดที่มาจากวิธีการที่โครงสร้างของ OpenGL (มันเป็นจุดที่พื้นผิวของแผนที่ แต่ผู้ที่ไม่ได้ถาม) คำถามที่ถามเป็นพิเศษสำหรับคำจำกัดความ "แพลตฟอร์มและภาษา agnostically"
API-Beast

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

4
Mr. Beast: ไม่มีส่วนเกี่ยวข้องกับ OpenGL หรือแพลตฟอร์มหรือภาษาใด ๆ มันเป็นวิธีที่ฮาร์ดแวร์ตัวเองใช้งานได้จริงในทุกแพลตฟอร์มและ API กราฟิกทั้งหมดโดยใช้ภาษาใด ๆ
Sean Middleditch

6

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.