GL_STATIC_DRAW กับ GL_DYNAMIC_DRAW เทียบกับ GL_STREAM_DRAW: มันมีความสำคัญหรือไม่


11

ใน OpenGL นั้นฟังก์ชั่นบัฟเฟอร์วัตถุ ( glBufferData, glBufferSubDataและอาจมีอีกสองสามคน) มีพารามิเตอร์usageอธิบายโดยเอกสารเป็นคำใบ้ของการใช้งานที่ตั้งใจอาจหมายถึงการช่วยให้การใช้งานมีประสิทธิภาพดีขึ้น

การใช้

ระบุรูปแบบการใช้งานที่คาดหวังของแหล่งข้อมูล คงต้องเป็นสัญลักษณ์GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, หรือGL_DYNAMIC_READ การใช้ [... ] เป็นคำแนะนำในการนำ GL ไปใช้เพื่อให้สามารถเข้าถึงแหล่งเก็บข้อมูลของวัตถุบัฟเฟอร์ได้อย่างไร สิ่งนี้ช่วยให้การนำ GL ไปใช้ในการตัดสินใจอย่างชาญฉลาดยิ่งขึ้นซึ่งอาจส่งผลกระทบต่อประสิทธิภาพของวัตถุบัฟเฟอร์อย่างมาก อย่างไรก็ตามไม่ได้ จำกัด การใช้งานจริงของแหล่งข้อมูลGL_DYNAMIC_COPY

wikiนั้นคลุมเครือในทำนองเดียวกัน:

นี่เป็นเพียงคำใบ้เท่านั้น เป็นรหัส OpenGL ที่ถูกกฎหมายอย่างสมบูรณ์ในการปรับเปลี่ยนบัฟเฟอร์ STATIC หลังจากสร้างขึ้นหรือไม่เคยแก้ไขบัฟเฟอร์ STREAM
[... ]
เหล่านี้เป็นคำถามที่สามารถตอบได้ด้วยการทำโปรไฟล์อย่างระมัดระวัง และถึงแม้ว่าคำตอบนั้นจะถูกต้องสำหรับไดรเวอร์รุ่นนั้นโดยเฉพาะจากผู้จำหน่ายฮาร์ดแวร์รายนั้น

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

ฉันได้เขียนเลเยอร์ abstraction API กราฟิคบาง ๆ ไว้เพื่อใช้เป็น API อย่างใดอย่างหนึ่งที่มีอยู่แล้วและมันก็เป็นการล่อลวงที่จะไม่สนใจพารามิเตอร์นี้เลยและซ่อนมันจากสิ่งที่เป็นนามธรรม

คำตอบ:


7

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

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


4

หน้าที่พวกเขาเหมือนกัน

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

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

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