चलो मंच-अज्ञेयवादी सोचते हैं: मैं कुछ ग्राफिकल संसाधनों को लोड करना चाहता हूं जबकि बाकी गेम चल रहा है।
सिद्धांत रूप में, मैं वास्तविक फ़ाइलों को एक अलग थ्रेड पर लोड कर सकता हूं, या 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
इस तरह, मैं केवल एक संसाधन को लोड करूंगा यदि मैं उस फ्रेम के लिए समय के भीतर कर सकता हूं। दुर्भाग्य से, किसी दिए गए संसाधन को लोड करने में लगने वाले समय की मात्रा का अनुमान लगाने के लिए यह एक तरीका है, और जहाँ तक मुझे पता है, आमतौर पर ऐसा करने के कोई तरीके नहीं हैं।
मुझे यहां क्या समझ नहीं आ रहा है? कितने खेल अपने सभी सामानों को पूरी तरह से अतुल्यकालिक और बिना गिराए फ्रेम या बहुत लंबे समय तक लोड करने के लिए प्राप्त करते हैं?