आधुनिक गेम कोड में वास्तव में कितना असेंबली का उपयोग किया जाता है? [बन्द है]


21

औसतन, आधुनिक गेम कोड में विधानसभा का उपयोग कितनी बार किया जाता है?

विशेष रूप से उन प्लेटफार्मों पर जो पहले से ही अच्छे C ++ कंपाइलर हैं, जैसे x86, PPC, या ARM - क्योंकि मैं मानता हूं कि एम्बेडेड सिस्टम पर गेम असेंबली का व्यापक उपयोग करते हैं।


4
सी ++ विधानसभा के लिए संकलित नहीं करता है - यह मशीन कोड के लिए संकलित करता है। असेंबली लैंग्वेज सीधे तौर पर यह निर्दिष्ट करने का एक तरीका है कि आप किस मशीन कोड को जनरेट करना चाहते हैं।
काइलोटन

6
सी ++ वास्तव में असेंबली के लिए संकलित नहीं है (आमतौर पर), इसे सीधे मशीन कोड में संकलित किया जाता है। यह प्रश्न संभवतः इस बात का जिक्र कर रहा है कि हाथ से लिखी विधानसभा को किसी परियोजना से जोड़ा जाता है या इनलाइन विधानसभा के रूप में लिखा जाता है।

1
बावजूद, मुझे नहीं लगता कि इस सवाल का कोई व्यावहारिक, उपयोगी जवाब है। यह मूल रूप से एक प्रकार के कारकों पर निर्भर करता है, जिनमें से कई व्यक्तिपरक हैं (यानी, कोड के लेखकों की राय)।

1
एसपीयू प्रोग्रामिंग जैसे कुछ अपवादों के साथ इन दिनों इतना लेखन विधानसभा महत्वपूर्ण नहीं है, लेकिन क्रैश डंप का विश्लेषण करने के लिए इसे पढ़ने में सक्षम होना महत्वपूर्ण है
Maik Semder

4
@Legion - आप संकलक / आईडीई लिए पैदा कर सकता फेंकना विधानसभा, लेकिन इसका मतलब यह नहीं है कि संकलक एक सामान्य संकलन की प्रक्रिया के हिस्से के रूप में विधानसभा पैदा करता है। यह ऐसा करने के लिए आवश्यक नहीं है और परिणामस्वरूप, अधिकांश नहीं।

जवाबों:


29

उत्तर "खेल", और "प्रयुक्त" के अर्थ पर थोड़ा निर्भर करता है। मुझे लगता है कि "प्रयुक्त" का अर्थ है "विशिष्ट गेम प्रोजेक्ट के दौरान लिखा गया"।

जिन लोगों से मैंने बात की है, उनमें से मेरे अनुभव और वास्तविक आंकड़ों में:

  • ब्राउज़र आधारित खेलों में? कोई नहीं।
  • ठेठ पीसी खेल में? कोई नहीं। (लेकिन आप निम्न स्तर के पुस्तकालयों में कुछ देख सकते हैं।)
  • iOS और Android गेम में? कोई नहीं।
  • "एएए" पीसी गेम और कंसोल गेम? शायद थोड़ा, शायद आधार के 0.05% कोड। (पुस्तकालयों में थोड़ा और अधिक के साथ।)

गेम इंडस्ट्री में काम के लिए असेंबली लैंग्वेज का ज्ञान अपेक्षित नहीं है, लेकिन आपके द्वारा किए जाने वाले गेम के प्रकार के आधार पर यह लाभप्रद हो सकता है।

एक तर्क हुआ करता था कि कंपाइलर सी-कोड को मानव से बेहतर बनाने के लिए हाथ से लिखे गए असेंबली में बेहतर काम करता है। आमतौर पर यह सच है, कभी-कभी यह गलत है। लेकिन इन दिनों लगातार बढ़ती सीपीयू जटिलता और 'आउट' (यानी अलग-अलग प्रोसेसरों को) स्केल करने की जरूरत का मतलब है कि अनुकूलन के प्रयास आमतौर पर कहीं और खर्च किए जाते हैं।

हाल के वर्षों में मैंने केवल गेम कोड में असेंबली देखी है __asm int 3ब्रेकपॉइंट्स को बाध्य करने के लिए बयान दिए गए थे, और असेंबली का मेरा एकमात्र व्यक्तिगत उपयोग असामान्य क्रैश बग का निदान करने के लिए एक फ़ंक्शन के असंगति को देखने में था।


1
SSE निर्देशों के बारे में क्या?
सेनापति

4
@ भाषा, आमतौर पर लोग एसएसई कोड को या तो आंतरिक, या गणित पुस्तकालयों का उपयोग करते हुए लिखते हैं जो एसएसई सामान को लपेटते हैं, या विशेष रूप से एसएसई को संकलन करने के लिए विशेष रूप से डिजाइन की गई एक विशेष भाषा में, जैसे आईएसपीसी । सीधे विधानसभा लिखना अभी भी बहुत दुर्लभ है।
नाथन रीड

1
IOS गेम्स के बारे में: अगर मुझे सही याद है, तो 3D / Math लाइब्रेरी Oolong ने कुछ इनलाइन ARM असेंबली का इस्तेमाल किया है। Apple को Accelerate ढांचा जारी करने के बाद से इसकी कोई आवश्यकता नहीं है।
निकोलस मिआरी

नाथन के साथ सहमत - एसएसई और इसी तरह के निर्देश-विशिष्ट अनुकूलन आमतौर पर पुस्तकालयों के भीतर मौजूद होते हैं (क्योंकि वे आमतौर पर केवल एक ही स्थान होते हैं, जहां कुल लाभ प्राप्त किया जाता है)
काइलोटन

26

आधुनिक कंसोल गेम्स में उच्च प्रदर्शन कोड के थोक को विधानसभा और C ++ के बीच के मध्य मैदान के प्रकार का उपयोग करके लिखा गया है: संकलक आंतरिक । ये C ++ फ़ंक्शंस की तरह दिखते हैं और पार्स करते हैं, लेकिन वास्तव में एकल मशीन निर्देशों में अनुवादित होते हैं । इसलिए, उदाहरण के लिए, मेरे "वेक्टर V के प्रत्येक मान को दबाना = = a और <= b" फ़ंक्शन दिखता है

// for each v.x, ensure v.x >= a.x && v.x <= b.x
inline __m128 ClampSIMD( const __m128 &v, const __m128 & a, const __m128 & b )
{
    return _mm_max_ps( a, _mm_min_ps( v, b ) );
}

इस तरह के कार्यों में मैं अभी भी विशिष्ट मशीन निर्देशों के संदर्भ में सोच रहा हूं , लेकिन मुझे उन्हें सी में लिखने की सुविधा है ताकि मुझे रजिस्टर रंग और शेड्यूलिंग और ऑप्स और अन्य उबाऊ विवरणों के बारे में चिंता करने की आवश्यकता न हो।

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

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


3
+1 केवल इसलिए कि क्रैशवर्क्स को SO पर "उस व्यक्ति के रूप में जाना जाता है जो वास्तव में गेम के लिए निम्न-स्तरीय अनुकूलित कोड लिखता है" - अगर कोई भी इस विषय के बारे में जानता है, तो वह उसे है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

@ BlueRaja-DannyPflughoeft "प्रसिद्ध"? प्रशंसा सुनकर खुशी हुई, धन्यवाद! =) नाथन रीड की टिप्पणियों के प्रकाश में एक मनोरंजक संयोग, यह है कि मैंने अपने कई निम्न-स्तरीय अनुकूलन कौशल नॉटी डॉग में सीखे।
क्रैश जूल

कहीं और मैंने डिबगिंग में असेंबली के महत्व को भी सुना है। इसलिए मैं इसे सीखने जा रहा हूं। अंतर्दृष्टि और लिंक के लिए धन्यवाद।
लीजन

7

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

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

उस के साथ कहा, PS3 पर SPU एक क्षेत्र है जहां लोगों को अभी भी विधानसभा का उपयोग करने के लिए प्रोसेसर का सबसे अधिक उपयोग करने के लिए है, उदाहरण के लिए मैनुअल निर्देश पाइपलाइनिंग के साथ यहां बताया गया है


1
PS3 पर भी, लोग आमतौर पर नंगे विधानसभा में काफी कार्यक्रम नहीं करते हैं । एक उपकरण है जो आपको असेंबली-जैसे सिंटैक्स में कोड लिखने देता है, जहां आप मशीन निर्देशों को निर्दिष्ट करते हैं, लेकिन यह आपके लिए रजिस्टर आवंटन, निर्देश निर्धारण और लूप पाइपलाइनिंग करता है। खैर, शायद शरारती कुत्ता वास्तव में यह सब हाथ से करता है, लेकिन यहां तक ​​कि अधिकांश PS3 एसपीयू डेवलपर्स मेरे अनुभव में नहीं हैं। :)
नाथन रीड

1
@NathanReed PS2 दिनों में, मैनुअल लूप पाइपलाइनिंग वास्तव में शरारती डॉग के प्रोग्रामर साक्षात्कार का हिस्सा था।
क्रैश जूल

-1

तथ्य यह है कि हम एक बहु मंच की दुनिया में रहते हैं, और हमारे गेम कोड के कुछ हिस्सों को स्थानीय प्लेटफ़ॉर्म के अनुरूप होना चाहिए - अच्छी तरह से नहीं, लेकिन अगर हम स्थानीय हार्डवेयर सामान का लाभ उठाते हैं तो लाभ हैं!

यह गेम या गेम लॉजिक के बारे में नहीं है, यह कोड के इष्टतम प्रदर्शन के लिए हार्डवेयर इलाके के बारे में है, जिस पर गेम लॉजिक टिका है, हम वास्तव में कोड सेक्शन को लपेट सकते हैं, उदाहरण के लिए मैक्रोज़ का उपयोग करना, जैसे कि एक स्रोत कोड है, जो अच्छी तरह से निष्पादित करता है मंच इसके खिलाफ बनाया गया था।

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