मैं ग्राफिकल संसाधनों को अतुल्यकालिक रूप से कैसे लोड करूं?


9

चलो मंच-अज्ञेयवादी सोचते हैं: मैं कुछ ग्राफिकल संसाधनों को लोड करना चाहता हूं जबकि बाकी गेम चल रहा है।

सिद्धांत रूप में, मैं वास्तविक फ़ाइलों को एक अलग थ्रेड पर लोड कर सकता हूं, या async I / O का उपयोग कर सकता हूं। लेकिन चित्रमय वस्तुओं के साथ, मुझे उन्हें GPU पर अपलोड करना होगा, और यह (आमतौर पर) केवल मुख्य धागे पर किया जा सकता है।

मैं अपना गेम लूप कुछ इस तरह से बदल सकता हूं:

while true do
    update()
    for each pending resource do
        load resource to gpu
    end
    draw()
end

डिस्क से रैम तक एक अलग थ्रेड लोड संसाधन होने पर।

हालांकि, अगर लोड करने के लिए कई बड़े संसाधन हैं, तो इससे मुझे एक फ्रेम की समय सीमा याद आ सकती है और अंततः गिरा हुआ फ्रेम मिल सकता है। इसलिए मैं पाश को इसमें बदल सकता हूं:

while true do
    update()
    if there are pending resources then
        load one resource to gpu
        remove that resource from the pending list
    end
    draw()
end

प्रभावी ढंग से प्रति फ्रेम केवल एक संसाधन लोड हो रहा है। हालांकि, अगर लोड करने के लिए कई छोटे संसाधन हैं, तो उन सभी को लोड करने में कई फ्रेम लगेंगे, और बहुत समय बर्बाद होगा।

वैकल्पिक रूप से, मैं अपनी लोडिंग को निम्नलिखित तरीके से करना चाहूंगा:

while true do
    time_start = get_time()
    update()
    while there are pending resources then
        current_time = get_time()
        if (current_time - time_start) + time_to_load(resource) >= 1/60 then
            break
        load one resource to gpu
        remove that resource from the pending list
    end
    draw()
end

इस तरह, मैं केवल एक संसाधन को लोड करूंगा यदि मैं उस फ्रेम के लिए समय के भीतर कर सकता हूं। दुर्भाग्य से, किसी दिए गए संसाधन को लोड करने में लगने वाले समय की मात्रा का अनुमान लगाने के लिए यह एक तरीका है, और जहाँ तक मुझे पता है, आमतौर पर ऐसा करने के कोई तरीके नहीं हैं।

मुझे यहां क्या समझ नहीं आ रहा है? कितने खेल अपने सभी सामानों को पूरी तरह से अतुल्यकालिक और बिना गिराए फ्रेम या बहुत लंबे समय तक लोड करने के लिए प्राप्त करते हैं?

जवाबों:


7

चलो एक आदर्श दुनिया मानकर शुरू करते हैं। किसी संसाधन को लोड करने के दो चरण हैं: पहला आप इसे अपने स्टोरेज मीडिया और मेमोरी में सही फॉर्मेट में बंद कर दें, और दूसरा आप इसे मेमोरी बस में वीडियो मेमोरी में ट्रांसफर कर दें। उन दो चरणों में से किसी को भी वास्तव में आपके मुख्य धागे पर समय का उपयोग करने की आवश्यकता नहीं है - इसे केवल I / O कमांड जारी करने के लिए शामिल होने की आवश्यकता है। आपके CPU और GPU दोनों अन्य चीजें कर सकते हैं, जबकि संसाधन की नकल की जा रही है। खपत किया जा रहा एकमात्र वास्तविक संसाधन मेमोरी बैंडविड्थ है।

यदि आप अपने और हार्डवेयर के बीच एक बहुत अमूर्त परत के बिना एक मंच का उपयोग कर रहे हैं, तो एपीआई शायद इन अवधारणाओं को सीधे उजागर करता है। लेकिन अगर आप एक पीसी पर हैं, तो शायद आपके और GPU के बीच एक ड्राइवर बैठा है, और वह चीजों को अपने तरीके से करना चाहता है। एपीआई के आधार पर आप एक ऐसी बनावट बनाने में सक्षम हो सकते हैं जो आपके द्वारा समर्थित मेमोरी के द्वारा समर्थित है, लेकिन अधिक संभावना है कि "क्रिएट टेक्सचर" एपीआई कॉलिंग बनावट को कुछ मेमोरी में कॉपी करेगा जो ड्राइवर का मालिक है। उस मामले में एक बनावट बनाने में कुछ निश्चित ओवरहेड और कुछ समय बनावट के आकार के आनुपातिक होगा। उसके बाद ड्राइवर कुछ भी कर सकता है - यह बनावट को वीआरएएम में स्थानांतरित कर सकता है, या जब तक आप इसे पहली बार उपयोग करने का प्रयास नहीं करते हैं, तब तक यह बनावट को अपलोड करने में परेशान नहीं कर सकता है।

आप उसके बारे में कुछ करने में सक्षम हो सकते हैं या नहीं कर सकते हैं , लेकिन आप "बनावट बनाने" के लिए कॉल की मात्रा का अनुमान लगा सकते हैं। बेशक, सभी नंबर हार्डवेयर और सॉफ्टवेयर के आधार पर बदलने जा रहे हैं, इसलिए संभवत: समय का एक गुच्छा उन्हें रिवर्स इंजीनियरिंग में खर्च करने लायक नहीं है। तो बस कोशिश करो और देखो! एक मीट्रिक चुनें: या तो "प्रति फ्रेम बनावट की संख्या" या "फ्रेम के प्रति बनावट का कुल आकार", एक कोटा चुनें (कहें, फ्रेम प्रति 4 बनावट), और इसे तनाव-परीक्षण करना शुरू करें।

पैथोलॉजिकल मामलों में, आपको एक ही समय में दोनों कोटाों पर नज़र रखने की आवश्यकता हो सकती है (उदाहरण के लिए प्रति फ्रेम 4 बनावट या प्रति फ्रेम में 2 एमबी बनावट, जो भी कम हो)। लेकिन अधिकांश बनावट स्ट्रीमिंग के लिए वास्तविक चाल यह पता लगाना है कि आप अपनी सीमित मेमोरी में कौन से टेक्सट को फिट करना चाहते हैं, न कि उन्हें कॉपी करने में कितना समय लगता है।

इसके अलावा, बनावट निर्माण के लिए पैथोलॉजिकल मामले - जैसे कि एक ही बार में बहुत सारे छोटे बनावट की आवश्यकता होती है- अन्य क्षेत्रों के लिए भी पैथोलॉजिकल मामले होते हैं। यह वास्तव में कितने माइक्रोसेकंड की बनावट को कॉपी करने के बारे में चिंता करने से पहले एक सरल कार्य कार्यान्वयन के लायक है। (इसके अलावा, वास्तविक प्रदर्शन हिट "निर्माण बनावट" कॉल पर सीपीयू समय के रूप में नहीं हो सकता है, लेकिन इसके बजाय पहले फ्रेम पर GPU समय के रूप में आप बनावट का उपयोग करते हैं।)


यह एक बहुत अच्छी व्याख्या है। बहुत सारा सामान मुझे मालूम नहीं था लेकिन बहुत मायने रखता था। इसके बजाय तनाव-परीक्षण के बजाय, मैं रनटाइम में बनावट निर्माण उपरि मापता हूं, धीरे से कहना शुरू करता हूं और कहना शुरू करता हूं, आउटलेर्स के लिए कमरे छोड़ने के लिए उपलब्ध निष्पादन समय का 80%।
पांडा पाजामा

@PandaPajama मैं उससे थोड़ा सशंकित हूँ। मुझे उम्मीद है कि स्थिर स्थिति "कोई बनावट की नकल नहीं की जा रही है," और भारी मात्रा में विचरण होगा। और जैसा कि मैंने कहा, मुझे संदेह है कि हिट का हिस्सा पहला रेंडर फ्रेम है जो बनावट का उपयोग करता है, जो प्रदर्शन को प्रभावित किए बिना गतिशील रूप से मापने के लिए बहुत कठिन है।
जॉन कैल्सबेक

इसके अलावा, यहाँ अतुल्यकालिक बनावट स्थानान्तरण पर एक NVIDIA प्रस्तुति है। मुख्य बात यह है कि यह घर चला रहा है, जहां तक ​​मैं पढ़ रहा हूं, यह है कि अपलोड करने के तुरंत बाद एक बनावट का उपयोग करना भी स्टाल होने जा रहा है। developer.download.nvidia.com/GTC/PDF/GTC2012/PresentationPDF/...
जॉन Calsbeek

मैं कोई ड्राइवर देव जॉकी नहीं हूं, लेकिन क्या यह आम है? इस तरह से ड्राइवरों को लागू करने के लिए बहुत अधिक समझ में नहीं आता है, क्योंकि बनावट पहले-उपयोग के लिए समयरेखा के साथ-साथ स्थानिक (प्रत्येक स्तर की शुरुआत में) की तरह आने की संभावना है।
पांडा पाजामा

@PandaPajama उपलब्ध वीआरएएम की तुलना में अधिक बनावट बनाने के लिए, और बनावट बनाने और फिर उनके बारे में कभी भी आवेदन करना आम बात है। एक सामान्य मामला है "बनावट का एक गुच्छा बनाएं और फिर तुरंत एक ऐसा दृश्य बनाएं जो उनका उपयोग करता है," जिस स्थिति में आलसी होने पर ड्राइवर की मदद करता है, क्योंकि यह पता लगा सकता है कि वास्तव में कौन से बनावट का उपयोग किया जाता है, और वह पहला फ्रेम वैसे भी अड़चन में डालने वाला है। । लेकिन मैं भी कोई ड्राइवर देव नहीं हूं, इसे नमक के दाने के साथ लें (और इसका परीक्षण करें!)।
बजे जॉन कलसेबेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.