2010-02-04 19 views
15

मुझे आश्चर्य है कि लंबे समय से ओपनजीएल फ्रेमबफर ऑब्जेक्ट्स (एफबीओ) को संभालने का सबसे अच्छा तरीका क्या होगा। स्विचिंग एफबीओ महंगा हो सकता है लेकिन नए अनुलग्नकों को भी परिभाषित कर सकता है।ओपनजीएल में एफबीओ को संभालने का सबसे अच्छा तरीका क्या है?

आप इसे कैसे करते हैं तेज़? सब कुछ, परिवर्तन कुर्की के लिए

  • 1 FBO लेकिन प्रत्येक के लिए FBOs के बीच स्विच नहीं है

  • 1 FBO प्रतिपादन में लक्ष्य (आकार + प्रारूप) प्रस्तुत करना:

    मैं इन 3 के बीच में संकोच पथ। इसका मतलब है कि मैं समान रेंडर लक्ष्यों के लिए एक ही एफबीओ का पुन: उपयोग करूंगा। लेकिन इस तरह एक कस्टम ब्लर की कीमत 4+ एफबीओ होगी।

  • 1 प्रत्येक के लिए FBO केवल एक बार लक्ष्य, सेट संलग्नक प्रस्तुत करना और फिर FBOs

    के बीच स्विच

इसके अलावा, मैं FBO स्विच की संख्या को कम करना चाहिए (जैसे मैं बनावट बाइंडिंग की संख्या को कम)?

+0

पहले ... एक एफबीओ क्या है? यदि आप कई बार एक संक्षिप्त शब्द का उपयोग करना चाहते हैं तो इसे पहली बार अप्रत्याशित रूप से उपयोग करने की अनुशंसा की जाती है। – fortran

+4

एफबीओ = फ्रेमबफर ऑब्जेक्ट – ponce

+0

अच्छा सवाल। हालांकि नीचे दिए गए उत्तर का पहला भाग "ओपनजीएल इनसाइट्स" पुस्तक में क्या कहा जाता है। पुस्तक बताती है कि एकाधिक एफबीओ के बीच स्विच करना महंगा है और प्रदर्शन बढ़ाने के लिए सबसे अच्छी बात यह है कि एक ही एफबीओ के लिए कई अनुलग्नक। –

उत्तर

14

अपडेट किया गया संदर्भ:


NVIDIA 2005 (शायद पुरानी): पिछले आधिकारिक प्रदर्शन सिफारिश एनवीआईडीआईए द्वारा मुझे पता है कि लगभग पांच साल पुराना है।उसकी GDC presentation में, साइमन ग्रीन की सिफारिश की निम्नलिखित (स्लाइड 29):

बढ़ती प्रदर्शन के लिए आदेश में:

  1. एकाधिक FBOs
    • प्रत्येक बनावट आप को रखना चाहते हैं के लिए एक अलग FBO बनाने
    • स्विच BindFramebuffer()
    • बीटा एनवीआईडीआईए ड्राइवरों में wglMakeCurrent() से 2x तेज हो सकता है
  2. एकल FBO, कई बनावट संलग्नक
    • बनावट ही स्वरूप और आयाम
    • उपयोग FramebufferTexture() बनावट के बीच स्विच करने
  3. एकल FBO, कई बनावट संलग्नक
    • होना चाहिए विभिन्न रंग अनुलग्नक
    • पर बनावट संलग्न करें
    • उपयोग glDrawBuffer() अलग रंग संलग्नक

मेरे अनुभव में करने के लिए प्रतिपादन स्विच करने के लिए, दूसरे मामले वास्तव में तेजी से पहले (ATI Radeon HD4850, GeForce 8800GT) की तुलना में है। मैंने तीसरे मामले की कोशिश नहीं की है, क्योंकि यह मेरे कोड को जटिल करेगा।

+0

[यहां जीडीसी प्रेजेंटेशन] (https://developer.nvidia.com/sites/default/files/akamai/gamedev/docs/Porting%20Source%20to%20Linux.pdf) संलग्नक स्विच न करने का उल्लेख करता है क्योंकि यह स्पष्ट रूप से होता है बुरा प्रदर्शन। तो यह इस प्रदर्शन आदेश के विपरीत है। – Deathicon

+0

कृपया ध्यान दें कि मैंने प्रस्तुत प्रस्तुति 2005 से है, और मेरे परिणाम 200 9 से हैं। अगर पिछले दशक में प्रदर्शन का क्रम बदल गया तो मुझे आश्चर्य नहीं होगा। –

+0

मैं यह भी जोड़ूंगा [लिंक] (https://software.intel.com/en-us/articles/opengl-performance-tips-swap-frame-buffer-objects-fbo-instead-of-surfaces-using- ए-सिंगल), जो संलग्नक स्विच करने के बजाय एफबीओ (# 1) स्विच करने के लिए बेहतर प्रदर्शन का उल्लेख करता है (# 2 और # 3)। इस प्रश्न का उत्तर अपडेट करना एक अच्छा विचार होगा। – Deathicon

4

दर्शन के मामले में, किसी ऑब्जेक्ट स्थिति को संशोधित करने के लिए यह पुनः सत्यापित किया जाना आवश्यक है। इसके बजाए, ऑब्जेक्ट बाइंडिंग को बदलना (जो पिछले फ्रेम से पहले से मान्य है) ड्राइवर के लिए तेज़ होना चाहिए [1]।

तो पहले कार्यान्वयन के रूप में, मैं प्रत्येक रेंडर लक्ष्य के लिए 1 एफबीओ के लिए जाऊंगा (या अधिक सटीक, लक्ष्य सेट करें। आप आमतौर पर एक साथ कई बफर प्रस्तुत करते हैं)।

यह कहा गया कि, कई कार्यान्वयन के खिलाफ आपके ऐप को बेंचमार्क करने वाला कुछ भी नहीं है।

[1] मैं ड्राइवर के लिए उल्लेख करता हूं, क्योंकि एक एफबीओ परिवर्तन आर्किटेक्चर के आधार पर एक जीपीयू फ्लश को मजबूर कर सकता है। यह ज्यादातर मामलों में बुलबुले पेश करेगा। तो यह निश्चित रूप से ऐसा कुछ है जिसे आप अक्सर नहीं करना चाहते हैं। बनावट बाइंडिंग को अनुकूलित करने से यह अधिक महत्वपूर्ण है, उदा।