स्रोत प्रक्रिया संस्थाओं की तरह एक इंजन कैसे होता है?


9

स्रोत इंजन पर (और यह एंटवर्सर है, गोल्ड्सस्क, भूकंप के) गेम ऑब्जेक्ट्स को दो प्रकारों, दुनिया और संस्थाओं में विभाजित किया गया है। दुनिया मानचित्र ज्यामिति है और संस्थाएँ खिलाड़ी, कण, ध्वनियाँ, स्कोर, आदि (स्रोत इंजन के लिए) हैं।

प्रत्येक इकाई का एक विचार फ़ंक्शन होता है, जो उस इकाई के लिए सभी तर्क करते हैं।

इसलिए, अगर सब कुछ जिस पर कार्रवाई करने की आवश्यकता है, वह थिंक फ़ंक्शन के साथ बेस क्लास से आता है, गेम इंजन एक सूची में और हर फ्रेम पर, उसके माध्यम से लूप और उस फ़ंक्शन को कॉल करने के लिए सब कुछ स्टोर कर सकता है।

पहली नज़र में, यह विचार उचित है, लेकिन यह बहुत अधिक संसाधन ले सकता है, अगर खेल में बहुत अधिक संस्थाएँ हैं ..

तो, स्रोत जैसे इंजन गेम ऑब्जेक्ट्स की देखभाल (प्रक्रिया, अपडेट, ड्रॉ, आदि) कैसे करता है?


2
इससे कोई फर्क नहीं पड़ता कि <some commercial engine>यह कैसे होता है?
कम्युनिस्ट डक

8
@ कम्युनिस्ट डक, मुझे लगता है कि असली सवाल यहाँ अधिक है कि एक सफल इंजन ऐसा कैसे करता है ताकि मैं उनसे सीख
सबब

जवाबों:


5

ठीक है, वहाँ काफी नहीं यह करने के लिए दूसरा रास्ता है - आप के लिए जा रहे है पाश के माध्यम से और कॉल think()हर कुछ तख्ते एक बार कम से कम हर इकाई के लिए।

आप अपने स्वयं के धागे पर संस्थाओं को रख सकते हैं, लेकिन फिर आपके पास पूरे राज्य-तुल्यकालन दुःस्वप्न है, जो निश्चित रूप से इसके लायक नहीं है।

पहली नज़र में, यह विचार उचित है, लेकिन यह बहुत अधिक संसाधन ले सकता है, अगर खेल में बहुत अधिक संस्थाएँ हैं ..

यही कारण है कि स्रोत इंजन उन इकाइयों की संख्या के लिए एक कठिन सीमा रखता है जो एक समय में मौजूद हो सकती हैं : 4096 इकाइयाँ, जिनमें से केवल आधी (2048) को नेटवर्क किया जा सकता है। इन सीमाओं में से किसी एक पर जाएं, और गेम क्रैश हो जाएगा।

यही कारण है कि, एक नक्शा बनाते समय, वे आपको लगभग 800 से अधिक संस्थाओं का उपयोग नहीं करने की सलाह देते हैं।


2 ^ 12 फ़ंक्शन कॉल अभी भी प्रत्येक फ्रेम के लिए एक बड़ी संख्या नहीं है?
JulioC

@ जुएलियो: ठीक है, 60 एफपीएस पर 246k फ़ंक्शन कॉल प्रति सेकंड - यह बहुत कुछ है, लेकिन निश्चित रूप से आज के हार्डवेयर पर संभव है। हालाँकि, याद रखें कि स्रोत इंजन के दुर्घटनाग्रस्त होने से पहले यह पूरी तरह से अनुमत अधिकतम अनुमति है - आम तौर पर, नक्शे पर बहुत कम इकाइयाँ होती हैं।
ब्लूराजा - डैनी पफ्लुगुएट

5
संस्थाओं के पास अगला समय होता है, थिंक फ़ंक्शन को हरफ्रेम नहीं कहा जाता है और सभी संस्थाओं को नहीं। मुझे याद है कि भूकंप 2 के लिए न्यूनतम सोचने का समय 0.1 (100msec) था, संस्थाओं के प्रसंस्करण के लिए केवल 10fps।
15

"आप अपने स्वयं के धागे पर संस्थाओं को रख सकते हैं, लेकिन फिर आपके पास पूरे राज्य-तुल्यकालन दुःस्वप्न है, जो निश्चित रूप से इसके लायक नहीं है।" इन किल्ज़ोन 4 स्लाइड्स की जाँच करें यदि आपको लगता है कि यह इसके लायक नहीं है: de.slideshare.net/jrouwe/…
तारा

3

आपके द्वारा बताए गए ये चरण सबसे अलग इंजनों में होने की संभावना है। यह सिर्फ इतना है कि साधारण गेम इंजन आमतौर पर एक पास में होते हैं। आपका क्रम

for each object
    do physics
    do game logic
    draw

हो जाता है

call physics subsystem
call game logic subsystem
call drawing subsystem

भौतिकी इंजन पदों और आकारों का ध्यान रखता है।

गेम लॉजिक इंजन यह व्याख्या करने का ध्यान रखता है कि भौतिक विज्ञान इंजन क्या बदल गया (वह कुछ तरह से बाधा डाल सकता है ...), लक्ष्यों के पात्रों में क्या है और उन्हें क्या व्यवहार करना चाहिए , वह अनुसूचित स्क्रिप्ट (यह कार्य सोचते हैं) चलाता है ।

ड्रॉइंग इंजन ऐसी वस्तुएं बनाता है जो वस्तुएं दिखाई देती हैं, और वह जानती है कि कौन सी वस्तुएं दिखाई देती हैं क्योंकि क्वेक इंजन यहां धोखा देते हैं (ड्रा अनुभाग देखें)।

आपको मेरी सलाह यह है कि उस गेम इंजन के बजाय सिमुलेशन का अध्ययन कैसे किया जाए। खेल विकास से संबंधित एक विशाल पॉप-संस्कृति है और खेल इंजन अनिवार्य भाषाओं (परंपरा और गति के कारण) में बने हैं; इसलिए मेरे लिए यह अच्छा था कि मैं अच्छी पाठ्यपुस्तकें (बल्कि सिद्धांत) प्राप्त करूं और इंजनों (पज़ल) को देखने की बजाय इंजन और पहेली को देखूं कि उन्होंने यह कैसे किया।

भौतिक विज्ञान

सभी संस्थाओं को पुनरावृति करने की पूरी धारणा और {सोचना, आकर्षित करना} शायद समस्याओं को जन्म देगा। संघर्ष वगैरह होंगे। मुझे विश्वास है कि वाल्व में हॉक है और मुझे लगता है कि हॉक पर्याप्त-सही भौतिकी का ख्याल रखता है।

सोच

थिंक फंक्शन तब चलाया जाता है जब गेम में एक समय नेक्थिंक में समय के बराबर होता है । यह क्वेक इंजन में इस तरह से काम करता है, और क्वेक इंजन हाफ लाइफ इंजन के लिए आधार है। यह हर बार नहीं चलाया जाता है।

आंतरिक रूप से यह संस्थाओं की एक सूची के माध्यम से एक सरल पुनरावृत्ति होना चाहिए और यह सोचने के लिए कि क्या फ़ंक्शन को कॉल करने के लिए समय बीत गया है। समय जटिलता ओ (एन) होगी, जहां एन संस्थाओं की संख्या है।

यदि बहुत बड़ी संख्या में इकाइयाँ हैं, तो आपको यह मापना चाहिए कि यह एफपीएस में कितना सुधार करेगा। ध्यान दें, क्योंकि Amdahl के नियम के कारण यह संभावित रूप से अदृश्य स्पीडअप है। मेरा मतलब है, आप बस सभी वस्तुओं को गर्तित करते हैं और एक संख्या को घटाते हैं और जांचते हैं।

मैं नेक्थिंक द्वारा संस्थाओं को सॉर्ट करके इसे गति प्रदान करूंगा (प्रत्येक बार संस्थाओं को पॉइंटर्स की सूची बनाऊंगा और इसे हर बार सॉर्ट करूंगा; संस्थाओं की सरणी नहीं, क्योंकि इकाइयां कभी भी अपने नेक्थिंक को बदल सकती हैं, इसलिए उन्हें सरणी में पुन: व्यवस्थित करने से O के बजाय O (N) लगता है? 1) सूची में)।

आपको लिनक्स में O (1) अनुसूचक को भी देखना चाहिए ।

खींचना

इंजन खींचता है कि कैमरा किस क्षेत्र से दिखाई दे रहा है। खेल का स्तर एक पेड़ में विभाजन है, और एक क्षेत्र उस पेड़ का पत्ता है। मैं आपको इसके बारे में विवरण से परेशान नहीं करूंगा ... इसलिए यदि कोई इकाई दिखाई दे रही है तो इसे दृश्यमान संस्थाओं के एक समूह में डाल दिया जाता है और वे तैयार हो जाते हैं।

वे संग्रहीत करते हैं कि कौन से क्षेत्र संभावित रूप से दृश्यमान क्षेत्र हैं। इसे "संभावित दृश्यमान सेट" कहा जाता है , संक्षिप्त रूप से पीवीएसपीवीएस का दृश्य है , हरे रंग का कैप्सूल खिलाड़ी है और उसके आस-पास उसके पीवीएस हैं जो प्रदान किए गए हैं।


2

इसलिए, अगर सब कुछ जिस पर कार्रवाई करने की आवश्यकता है, वह थिंक फ़ंक्शन के साथ बेस क्लास से आता है, गेम इंजन एक सूची में और हर फ्रेम पर, उसके माध्यम से लूप और उस फ़ंक्शन को कॉल करने के लिए सब कुछ स्टोर कर सकता है।

पहली नज़र में, यह विचार उचित है, लेकिन यह बहुत अधिक संसाधन ले सकता है, अगर खेल में बहुत अधिक संस्थाएँ हैं ..

वास्तव में सब कुछ एक बड़ी सूची में रखना आमतौर पर वांछनीय से कम है; यदि आप संस्थाओं को सूचियों के आधार पर समूहित करते हैं, उदाहरण के लिए, उनका प्रकार, तो आप बेहतर रूप से कई थ्रेड पर प्रसंस्करण वितरित कर सकते हैं। उदाहरण के लिए यदि आपको पता है कि Foo के सभी प्रकार अनुकार चरण के दौरान किसी भी अन्य संस्थाओं के साथ बातचीत नहीं करते हैं, तो आप उन्हें पूरी तरह से बंद कर सकते हैं। अगर वे कुछ बड़े विलक्षण सूची में विली-नीली बिखरे हुए थे, तो यह करना बहुत कठिन होगा।

आपको उस बिंदु पर एक सामान्य आधार वर्ग से सब कुछ प्राप्त करने की आवश्यकता नहीं है; स्रोत काफी हद तक इनहेरिटेंस के दुरुपयोग के साथ खत्म हो जाता है जो अन्यथा उस संबंध में डेटा के रूप में लागू किया जा सकता है।

आप निश्चित रूप से उन संस्थाओं की संख्या पर हमेशा ऊपरी सीमा रखेंगे, जहां आप प्रति फ्रेम प्रक्रिया कर सकते हैं, भले ही आप अन्य कोर के लिए काम करना शुरू कर दें। इसके आस-पास कोई रास्ता नहीं है, आपको बस इस बात का अंदाजा होना चाहिए कि आपके कार्यान्वयन में वह सीमा क्या है और इसे कम करने के लिए कदम उठाए गए हैं (ऑब्जेक्ट पर प्रसंस्करण चरणों का उचित रूप से कम करना, जिनकी आवश्यकता नहीं होगी, वस्तुओं में अति-ग्रन्थि से बचने के लिए, एट इत्यादि)।


1

आपको किन बातों को ध्यान में रखना है और पिछले उत्तरों के बारे में सोचा जा रहा है कि आपकी प्रदर्शन गतिविधियों को कब और कैसे कॉल किया जाएगा।

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

और आपके विशिष्ट गेम तर्क और स्थिति के आधार पर अनुकूलन के अन्य विशिष्ट स्तर हैं।


"एक खिलाड़ी को अपनी नाक उठाते हुए 2 मील दूर एक पात्र दिखाई देता है" हाहा! लेकिन कैसे आया कोई भी इंगित नहीं कर रहा है कि आभासी कार्यों का उपयोग बहुत धीमा है?
तारा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.