คำตอบที่ถูกต้องที่สุดคือขึ้นอยู่กับว่าคุณตั้งโปรแกรมอย่างไร แต่นี่เป็นเรื่องดีที่คุณต้องกังวล ในขณะที่ GPU มีความรวดเร็วเหลือเชื่อแบนด์วิดท์ไปและกลับจาก GPU RAM ไม่ได้และจะเป็นคอขวดที่น่าผิดหวังที่สุดของคุณ
ข้อมูลส่งไปยังหน่วยความจำ GPU เพียงครั้งเดียวและนั่งอยู่ที่นั่นตลอดไปหรือไม่?
หวังว่าใช่ สำหรับความเร็วในการเรนเดอร์คุณต้องการให้มีข้อมูลมากพอที่จะนั่งบน GPU เท่าที่จะทำได้แทนที่จะส่งไปทุกเฟรม VBO ใช้เพื่อจุดประสงค์ที่แน่นอนนี้ มีทั้งแบบคงที่และแบบไดนามิก VBO's แบบดั้งเดิมเป็นแบบที่ดีที่สุดสำหรับแบบคงที่และแบบหลังเป็นแบบที่ดีที่สุดสำหรับแบบจำลองที่จุดยอดจะเปลี่ยนทุกเฟรม (พูดระบบอนุภาค) แม้ว่ามันจะเป็น VBO แบบไดนามิก แต่คุณไม่ต้องการส่งจุดยอดทั้งหมดใหม่ทุกเฟรม คนที่กำลังเปลี่ยนแปลง
ในกรณีของสิ่งปลูกสร้างของคุณข้อมูลจุดยอดจะนั่งอยู่ตรงนั้นและสิ่งเดียวที่เปลี่ยนแปลงคือเมทริกซ์ของคุณ (โมเดล / โลก, การฉายภาพและมุมมอง)
ในกรณีของระบบอนุภาคฉันสร้าง VBO แบบไดนามิกให้ใหญ่พอที่จะเก็บจำนวนอนุภาคสูงสุดที่เคยมีอยู่สำหรับระบบนั้น แต่ละเฟรมที่ฉันส่งข้อมูลสำหรับอนุภาคที่ปล่อยออกมาเฟรมนั้นพร้อมกับชุดเครื่องแบบคู่และนั่นคือทั้งหมด เมื่อฉันวาดฉันสามารถระบุจุดเริ่มต้นและจุดสิ้นสุดใน VBO นั้นดังนั้นฉันไม่ต้องลบข้อมูลอนุภาค ฉันสามารถพูดได้ว่าอย่าวาดมัน
เมื่อแบบจำลองแสดงผลแต่ละเฟรมตัวประมวลผล GPU ต้องดึงข้อมูลทุกครั้งจากหน่วยความจำ GPU หรือไม่ สิ่งที่ฉันหมายถึงคือ - ถ้าฉันมี 2 แบบจำลองที่แสดงหลายครั้งในแต่ละครั้ง - มันจะสำคัญไหมถ้าฉันแสดงครั้งแรกทีละหลายครั้งและอีกอันที่สองหลายครั้งหรือถ้าฉันแสดงครั้งแรกเพียงครั้งเดียว interleaving มันแบบนั้นเหรอ?
การส่งการเรียกหลายครั้งแทนที่จะเป็นเพียงครั้งเดียวนั้นเป็นขีด จำกัด ที่ใหญ่กว่ามาก ลองใช้การเรนเดอร์แบบอินสแตนซ์ มันอาจช่วยคุณได้มากและทำให้คำตอบสำหรับคำถามนี้ไร้ประโยชน์ ฉันมีปัญหาบางอย่างเกี่ยวกับไดรเวอร์ซึ่งฉันยังไม่ได้ผล แต่ถ้าคุณสามารถทำให้มันใช้งานได้
เห็นได้ชัดว่าการ์ดกราฟิกมี RAM จำกัด - เมื่อมันไม่สามารถเก็บข้อมูลโมเดลทั้งหมดที่จำเป็นสำหรับการเรนเดอร์ 1 เฟรมฉันคิดว่ามันดึงข้อมูล (บางส่วน) จาก CPU RAM แต่ละเฟรมมาถูกต้องหรือไม่
คุณไม่ต้องการที่จะใช้ GPU RAM หมด ถ้าคุณทำแล้วเปลี่ยนสิ่งต่าง ๆ เพื่อให้คุณทำไม่ได้ ในสถานการณ์สมมติที่คุณหมดไปมันอาจจะผิดพลาดอย่างใดอย่างหนึ่ง แต่ฉันไม่เคยเห็นมันเกิดขึ้นดังนั้นฉันจึงไม่รู้
ฉันลืมที่จะแยกความแตกต่าง: มีการส่งข้อมูลไปยัง GPU และมีการตั้งค่า / ผูกบัฟเฟอร์เป็นปัจจุบัน หลังทำให้เกิดการไหลของข้อมูลใด ๆ ?
ไม่มีการไหลของข้อมูลที่มีนัยสำคัญไม่ใช่ มีค่าใช้จ่ายบางส่วน แต่จริงสำหรับรหัสบรรทัดทุกบรรทัดที่คุณเขียน ค้นหาว่าคุณต้องเสียค่าใช้จ่ายเท่าใดและทำโปรไฟล์อะไรอีก
การสร้างบัฟเฟอร์ด้วยการเริ่มต้น
คำตอบของ Raxvan ฟังดูดี แต่มันไม่ค่อยแม่นยำ ใน OpenGL การสร้างบัฟเฟอร์ไม่ได้สำรองพื้นที่ใด ๆ หากคุณต้องการจองพื้นที่โดยไม่ผ่านข้อมูลใด ๆ คุณสามารถโทร glBufferData และส่งผ่านค่าว่าง (ดูส่วนบันทึกย่อที่นี่ )
การอัพเดตข้อมูลบัฟเฟอร์
ฉันเดาว่าคุณหมายถึง glBufferData หรือฟังก์ชั่นอื่น ๆ เช่นนั้นใช่ไหม นี่คือจุดที่การถ่ายโอนข้อมูลจริงเกิดขึ้น (ยกเว้นว่าคุณผ่านโมฆะอย่างที่ฉันเพิ่งพูดไปในย่อหน้าสุดท้าย)
ผูกบัฟเฟอร์เป็น active (เป็นเพียงวิธีบอก API ว่าฉันต้องการบัฟเฟอร์นี้ให้เรนเดอร์ในการเรียกใช้ครั้งถัดไปและมันไม่ได้ทำอะไรด้วยตัวเองหรือไม่?)
ใช่ แต่สามารถทำได้มากกว่านั้นเล็กน้อย ตัวอย่างเช่นถ้าคุณผูก VAO (วัตถุอาร์เรย์จุดสุดยอด) จากนั้นผูก VBO VBO นั้นจะกลายเป็นผูกพันกับ VAO ต่อมาถ้าคุณผูก VAO นั้นอีกครั้งและเรียก glDrawArrays มันจะรู้ว่า VBO จะวาดอะไร
โปรดทราบว่าในขณะที่บทเรียนมากมายจะให้คุณสร้าง VAO สำหรับ VBO ทุกตัวฉันได้รับแจ้งว่านี่ไม่ใช่การใช้งานตามที่ตั้งใจไว้ สมมุติว่าคุณควรสร้าง VAO หนึ่งอันและใช้กับ VBO ทุกตัวที่มีคุณสมบัติเดียวกัน ฉันยังไม่ได้ลองเลยดังนั้นฉันไม่สามารถพูดได้อย่างแน่นอนว่ามันจะดีขึ้นหรือแย่ลง
API การเรียกแบบดึง
สิ่งที่เกิดขึ้นตรงนี้ค่อนข้างตรงไปตรงมา (จากมุมมองของเรา) สมมติว่าคุณผูก VAO แล้วโทรไปที่ glDrawArrays คุณระบุจุดเริ่มต้นและการนับและมันจะเรียกใช้จุดสุดยอดของคุณสำหรับทุกจุดสุดยอดในช่วงนั้นซึ่งจะส่งผ่านผลลัพธ์ของมันลงบรรทัด กระบวนการทั้งหมดนั้นเป็นอีกบทความหนึ่งของตนเอง