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_DYNAMIC_COPY
[...]
उपयोग जीएल कार्यान्वयन के लिए एक संकेत है कि कैसे बफर ऑब्जेक्ट के डेटा स्टोर तक पहुंचा जाएगा। यह जीएल कार्यान्वयन को अधिक बुद्धिमान निर्णय लेने में सक्षम बनाता है जो बफर ऑब्जेक्ट प्रदर्शन को महत्वपूर्ण रूप से प्रभावित कर सकता है। हालांकि, यह डेटा स्टोर के वास्तविक उपयोग के लिए बाध्य नहीं करता है।

विकी इसी तरह अस्पष्ट है:

ये केवल संकेत हैं, आखिरकार। यह एक STATIC बफर को संशोधित करने के बाद, या STREAM बफर को कभी संशोधित नहीं करने के लिए पूरी तरह से कानूनी OpenGL कोड है।
[...]
ये ऐसे प्रश्न हैं जिनका उत्तर केवल सावधान रूपरेखा के साथ दिया जा सकता है। और फिर भी, उत्तर केवल उस विशेष हार्डवेयर विक्रेता से उस विशेष ड्राइवर संस्करण के लिए सटीक होगा।

ठीक है, यह पैरामीटर कितना प्रासंगिक है, यदि यह सब है? क्या ड्राइवर वास्तव में इसे ध्यान में रखते हैं, और यदि वे करते हैं, तो आपके अनुभव में यह व्यवहार में प्रदर्शन को कितना प्रभावित करता है? क्या आपके पास साझा करने के लिए डेटा है?

मैंने एक पतली ग्राफिक्स एपीआई एब्सट्रैक्शन लेयर लिखी है जिसका मतलब है कि मौजूदा एपीआई में से किसी के रूप में लागू किया जाना है, और यह इस पैरामीटर को पूरी तरह से अनदेखा करने और इसे उजागर एब्सट्रैक्शन से छिपाने के लिए आकर्षक है।

जवाबों:


7

यह कार्यान्वयन के बीच अलग-अलग होगा, लेकिन मैंने जिस ड्राइवर पर काम किया, उसने इनका उपयोग किया, मुख्य रूप से मेमोरी लेआउट तय करने के लिए। इन संकेतों द्वारा सक्षम किए गए अनुकूलन आपके द्वारा पसंद किए जाने की तुलना में बहुत छोटे हैं, मुख्यतः प्रतिबंध के कारण जो आप कर सकते हैं जो भी संकेत देते हैं कोई भी उपयोग हैं। उदाहरण के लिए, यह कैश अमान्यकरण को बहुत सस्ता बना देगा यदि बफ़र्स केवल पढ़ने के लिए संकेत देते हैं, तो यह बिल्कुल भी नहीं लिखा जा सकता है, लेकिन यह अनुकूलन असंभव है।

कुछ उल्लेखनीय खेल जो कि GPUs के बीच बेंचमार्क तुलना के लिए व्यापक रूप से उपयोग किए जाते हैं, इन संकेतों का सही उपयोग नहीं करते हैं, इसलिए GPU विक्रेताओं के पास उन संकेतों का तेजी से उपयोग करने के लिए एक प्रोत्साहन है, भले ही वे संकेत से मेल न खाते हों।


4

कार्यात्मक रूप से वे समान हैं।

ड्राइवर उन्हें अलग-अलग करने के लिए उपयोग कर सकता है कि पर्दे के पीछे बफर को कैसे संभालना है। जहाँ उदाहरण के लिए static_draw को यथाशीघ्र vram पर कॉपी किया जाएगा और वहाँ छोड़ दिया जाएगा, लेकिन stream_read में हर समय RAM में दिनांक कॉपी करने का विकल्प होगा।

इस अस्पष्टता का कारण है कि glBufferStorage एक बात बन गई। इस तरह से आप निर्दिष्ट करते हैं कि आप बफर के साथ क्या करना चाहते हैं (क्या आप इसे बफ़रसुबडटा के माध्यम से अपडेट करेंगे, चाहे आप मैप के माध्यम से पढ़ेंगे या लिखेंगे, मानचित्रण कितना सुसंगत है, क्या मैपिंग उपयोगों में बनी रह सकती है) और उन सीमाओं के बाहर जाना एक त्रुटि है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.