आपके पसंदीदा गेम-विशिष्ट कोडिंग रत्न क्या हैं? [बन्द है]


24

मैं क्वैक III में जॉन कार्मैक के फास्ट इनवर्स स्क्वायर रूट के साथ शुरुआत करूंगा :

float Q_rsqrt(float number) {

  long i;
  float x2, y;
  const float threehalfs = 1.5F;

  x2 = number * 0.5F;
  y = number;
  i = * ( long * ) &y;
  i = 0x5f3759df - ( i >> 1 );
  y = * ( float * ) &i;
  y = y * ( threehalfs - ( x2 * y * y ) );

  return y;

}

6
यह वास्तव में एक सवाल नहीं है - बहुत कम से कम, आप इसे एक सामुदायिक विकी पेज घोषित कर सकते हैं ...
राहेल ब्लम

हो गया, समुदाय -कृत।
जक

3
कि पेंच! बस किसी भी और सभी कोड महान जेसी द्वारा तैयार की जाती है!
एडम नायलर

3
0x5f375a86 (: वैसे, टिप्पणी वहाँ एक और अधिक सटीक "जादुई संख्या" वर्गमूल समारोह उलटा तेजी में उपयोग करने के लिए ऐसा कर en.wikipedia.org/wiki/... )
Ricket

8
यह भी ध्यान दें कि यह जॉन कार्मैक का नहीं है।
काज

जवाबों:


25

MapValue फ़ंक्शन:

float mapValue( float inVal, float inFrom, float inTo, float outFrom, float outTo )
{
    float inScale = (inFrom != inTo) 
        ? ( ( inVal - inFrom ) / ( inTo - inFrom ) ) 
        : 0.0f;
    float outVal = outFrom + ( inScale * ( outTo - outFrom ) );
    outVal = (outFrom < outTo ) 
        ? clamp( outVal, outFrom, outTo ) 
        : clamp( outVal, outTo, outFrom );
    return outVal;
}

यह एक मान लेता है, इसे एक सीमा के भीतर एक अनुपात में परिवर्तित करता है, और फिर दूसरी श्रेणी के सापेक्ष मापता है। डबल-लेरप की तरह।

सामान को सामान्य करने के लिए आप इसका उपयोग कर सकते हैं:

float minDamage = 0.0f; float maxDamage = 300.0f;
float normalisedDamage = mapValue(damange, minDamage, maxDamage, 0.0f, 1.0f);

या आप एक सीमा से दूसरी सीमा में परिवर्तित कर सकते हैं:

float brakeStrength = mapValue(timeToCollision, 
    0.0f, 10.0f, // seconds
    1.0f, 0.2f // brake values 
    );

दूसरे उदाहरण में ध्यान दें कि आउट रेंज रेंज में एक अलग क्रम है।

यह ज्यादा नहीं दिखता है, लेकिन मैं इस छोटी सी बेला का उपयोग सभी जगह करता हूं।


14

मुझे अभी भी विश्वास नहीं हो रहा है कि मैंने कितनी बार अपने गेम कोड में पायथागॉरियन प्रमेय का उपयोग किया है। मेरे लिए, यह सरल सूत्र खेल के विकास में एक रत्न है।

a ^ 2 + b ^ 2 = c ^ 2
(स्रोत: mathurl.com )

या

वैकल्पिक शब्द
(स्रोत: mathurl.com )

और जब केवल सापेक्ष दूरी मायने रखती है, तो इसका उपयोग महंगी स्क्वायर रूट ऑपरेशन के बिना किया जा सकता है

वैकल्पिक शब्द
(स्रोत: mathurl.com )


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

1
सच। इसलिए यह एक रत्न है। ;)
श्रीवल्देज़

4
एक दिलचस्प भिन्नता तब है जब आप केवल सापेक्ष दूरी के बारे में परवाह करते हैं । तब आप संभावित महंगी sqrtकॉल को छोड़ सकते हैं और बस गणना कर सकते हैं distance2 = x^2 + y^2
mm34

@ खरीदार - एक और अद्भुत बात: यदि आप x ^ 2 स्थान पर काम कर रहे हैं, तो दूरी केवल सापेक्ष नहीं है।
स्टीवन एवर्स

रिश्तेदार दूरी बिट का उल्लेख करने के लिए धन्यवाद। मैंने कई अनावश्यक स्क्वायर रूट ऑपरेशनों को देखा है, जैसे कि A * का उपयोग करने वाले लोग जब वे कुछ कम सटीक उपयोग कर रहे होंगे।
Ricket

13

मुझसे सबसे बड़ा स्कॉट बिलास के गेम ऑबजेक्ट सिस्टम के बारे में पढ़ रहा था भले ही मैं एक डेटाबेस प्रणाली का उपयोग नहीं करता, जैसे कि वह करता है, इसने मुझे 6 स्तरीय वंशानुक्रम वाले पेड़ बनाने से रोक दिया और मुझे एक घटक प्रणाली बनाने में मदद मिली जो बहुत अधिक प्रबंधनीय और पुन: प्रयोज्य है।


10

मुझे डफ डिवाइस के साथ जाना है । यह कोड का पहला ब्लॉक था जिसने सचमुच मेरा जबड़ा गिरा दिया। "तुम यह कर सकते हो?!?"


हे भगवान। काले चश्मे! वे कुछ नहीं करते!
राउल

"स्विच-केस" के अंदर नेस्टेड "डू-जबकि" हमेशा मुझे झपकी देता है। 20 साल बाद भी ...
Andreas

1
-1। मुझे यह पसंद नहीं है। आज यह बहुत उपयोगी नहीं है ( memcpyयदि आप इसके बजाय उपयोग करेंगे , यदि आप चाहते हैं कि अन्य लोग आपके कोड को पढ़ने में सक्षम हों)
बॉबोबोबो

1
@JoeWreschnig क्यों नहीं? Memcpy हमेशा अधिक पठनीय, पोर्टेबल और शायद अधिक अनुकूलित होगी।
koD

1
@kaoD: क्योंकि डफ के उपकरण के बराबर मेमकीपी नहीं है - इससे कोई फर्क नहीं पड़ता कि "पठनीय, पोर्टेबल और शायद अधिक अनुकूलित" यह है अगर यह एक ही काम नहीं करता है! आधुनिक सीपीयू पाइपलाइन शाखा की भविष्यवाणी और निर्देश कैशिंग के कारण शायद इसके साथ डफ के उपकरण के बिना बेहतर करेगी, लेकिन इसका कोई लेना- देना नहीं है memcpy

7

एक छोटा सी / सी ++ स्निपेट खेल से मैंने कई साल पहले लिखने में मदद की:

(fill ? FillRect : DrawRect) (x, y, w, h, colour);

अपने पहले गेम ( इस ) पर मुझे 1Mb से अधिक RAM तक पहुंचने की आवश्यकता थी, और, इससे पहले कि यह इंटरनेट बंद हो जाए, मेरे पास XMS और ईएमएस के लिए कोई दस्तावेज नहीं था जो DOS ऐप्स अतिरिक्त रैम तक पहुंच के लिए उपयोग करते थे।

इसलिए, मैंने एक छोटे 'पिछले दरवाजे' का उपयोग किया, जो कि 386 में सेगमेंट रजिस्टर के संबंध में था। आम तौर पर, वास्तविक मोड में, पते की गणना की गई थी seg*16+offजो आपको 1Mb तक सीमित करता है।

हालाँकि, आप संरक्षित मोड में जा सकते हैं, 4Mb को संबोधित करने के लिए एक सेगमेंट सेट कर सकते हैं, वापस स्विच कर सकते हैं, और बशर्ते आप सेगमेंट रजिस्टर को नहीं लिखते (जो कि ठीक था क्योंकि डॉस ने केवल 8086 सेगमेंट रजिस्टर का उपयोग किया था), आप पूरे तक पहुंच सकते हैं 4Mb एक फ्लैट एड्रेस स्पेस के रूप में। यदि आप डॉस सेवाओं का उपयोग करना चाहते हैं, तो वास्तविक मोड पर वापस आना आवश्यक था।

कई डीपीएमआई एक्सटेंडर या तो उपलब्ध नहीं थे।


C # में लगभग काम करता है (आपको एक प्रतिनिधि प्रकार की घोषणा करने और कम से कम एक कलाकारों को सम्मिलित करने की आवश्यकता है)
finnw

आप असली मोड में 32-बिट एड्रेसिंग मोड के साथ मतलब है? (यानी एक पते के आकार के उपसर्ग की आवश्यकता है)। क्या आप सुनिश्चित हैं कि एक सेगमेंट डिस्क्रिप्टर स्थापित करना आवश्यक था, और यह वास्तव में सेगमेंट रजिस्टर को सामान्य 16 * FS + के रूप में उपयोग नहीं करता था? मुझे नहीं लगा कि खंडों में भी 16-बिट मोड की सीमाएं थीं, बस आधार पता (16 * उनका मूल्य), इसलिए क्या आप एफएस को 16-बिट मोड में किसी चीज़ में सेट नहीं कर सकते, और [fs:esi]जो भी आप उपयोग कर सकते हैं या जो भी उपयोग करना है। चाहता था?
पीटर कॉर्डेस

मैंने यह कोशिश नहीं की है, या 16-बिट मोड के लिए कोई वास्तविक कोड लिखा है, सिर्फ 32 और 64 बिट एएसएम, लेकिन यह अजीब लगता है। हम्म, प्रशंसनीय हालांकि। आधुनिक सीपीयू निश्चित रूप से आंतरिक रूप से सेगमेंट सामान को कैश करते हैं, और केवल उन कैश को फिर से लोड करते हैं जब आप सेगमेंट में लिखते हैं, तो हो सकता है कि इसने संरक्षित-मोड आधार + सीमा को रखा हो (यदि वास्तव में ऐसा हुआ है, और आप सिर्फ उपयोग नहीं कर रहे थे 4MB 16 * FS) से शुरू होता है।
पीटर कॉर्डेस

5

व्यक्तिगत रूप से मैं पूर्वानुमान योग्य यादृच्छिक संख्याओं के लिए मर्सें ट्विस्टर का बहुत बड़ा प्रशंसक हूं, खासकर यदि आपको रैंड के कई अलग-अलग वरीयता प्राप्त उदाहरण बनाने की आवश्यकता है

http://en.wikipedia.org/wiki/Mersenne_twister


Mersenne ट्विस्टर इस अर्थ में अच्छा है कि यह एक अच्छा यादृच्छिक संख्या जनरेटर है, लेकिन यह विशेष रूप से सुरुचिपूर्ण या शांत नहीं है (या लागू करने के लिए तेज़ या आसान)। उसके लिए, आप en.wikipedia.org/wiki/Rule_30 को देखना चाह सकते हैं ।

1
WELL आम तौर पर अधिकांश उपयोगों के लिए MT से बेहतर होता है .. en.wikipedia.org/wiki/Well_equidistributed_long-period_linear
जरी कोम्पा

5

यहाँ क्रिस क्रॉफोर्ड (और जाहिर तौर पर अटारी द्वारा उपयोग किया गया) द्वारा उल्लेख किया गया है, जिसे वह 'ए ग्राफिक्स ट्रिक' कहते हैं।

LDA FIRST
EOR SECOND
AND CONTROL
EOR SECOND
STA OUTPUT

स्पष्टीकरण के लिए पूरा लेख पढ़ें ।


1
यह लिंक अब टूट गया है, इसलिए यहां स्पष्टीकरण देने में मदद मिलेगी।
फाइननव

धन्यवाद। वह चला गया और फिर से अपनी वेबसाइट बदल दी। मैंने लिंक अपडेट किया।
एंथनी

4

किसी कारण से, लोग अक्सर खेलों में डिजाइन पैटर्न की शक्ति से गुजरते हैं। मैंने लगभग हर एक GoF पैटर्न को खेलों में सफलता के साथ लागू किया है।


1
खेल प्रोग्रामिंग के बारे में मुझे जो चीजें पसंद हैं उनमें से एक "शुद्धता" के मानक GoF रास्ते से दूर हो रही है और बस बहुत सुंदर गति पर ध्यान केंद्रित कर रही है! उस ने कहा, मैंने खेलों में एमवीसी के कई बुरे कार्यान्वयन देखे हैं जो अच्छे से अधिक नुकसान करते हैं।
इयान

मुझे लगता है कि डिजाइन पैटर्न का अपना स्थान है। खेल में इतना नहीं, यद्यपि।
ब्लिसफ्रीक

@blissfreak: गेम प्रोग्रामिंग के बारे में कुछ खास नहीं है जो इसे किसी प्रकार का जंगली पश्चिम बनाता है जहां पैटर्न सामान्य नहीं हैं। वे हास्यास्पद रूप से सामान्य हैं और यहां कुछ उदाहरण हैं।
स्टीवन एवर्स

4

Math.atan2 () बहुत उपयोगी है (सभी ट्रिगर के साथ)।


यह है, हे भगवान! मैंने बहुत सारे 3 डी किए हैं और वास्तव में कभी भी इसकी आवश्यकता नहीं है।
स्किज़ जूल

+1, यह x + y वेक्टर घटकों से रेडियन दिशा में जाने का एकमात्र तरीका है।
RCIX

1
@RCIX: मेरा कहना है कि परिवर्तन अनावश्यक है, (x, y) -> कोण, किसी भी कोण समस्या का एक वेक्टर समाधान है।
स्किज़ जूल

6
मैं वास्तव में एक नंगे मानक पुस्तकालय समारोह को "मणि" नहीं कहूंगा।

1
@Skizz: शायद 3 डी के लिए, लेकिन मैं सामान्यीकृत वेक्टर लेने और रेडियन दिशा मान निकालने का कोई अन्य तरीका नहीं जानता। जो 2 डी गेम में मूल्य का अच्छा सौदा है।
RCIX

3

ऊपर पाइथागोरस मणि को जोड़ने के लिए ...
मैं हमेशा लोगों को बताता हूं कि 3 डी प्रोग्रामिंग के लिए उन्हें केवल जानने की जरूरत है:
- ए ^ 2 + बी ^ 2 = सी ^ 2
- सोसकैकोआ (पाप = विरोध पक्ष / ढलान वाला पक्ष, कॉस = पक्ष) / sloped side, tan = विरोध पक्ष / संलग्न पक्ष)
- a। बी = | ए | * - बी | * cos अल्फा
- एक * b = | a | * - बी | * पाप अल्फा * यूनिट वेक्टर
यह गेम डेवलपमेंट में आपके द्वारा सामना की जाने वाली किसी भी 3 डी (या 2 डी) समस्या को काफी हद तक हल कर सकता है।
ज़रूर, वहाँ अच्छे तरीके हैं, लेकिन यह उन्हें सभी को हल कर सकता है - मुझे पता होना चाहिए, मैं एक हैक हूं जो एम पर एक कैरियर आधारित है।


5
पुन: soscastoa मुझे लगता है कि ज्यादातर लोग जानते हैं कि sohcahtoa के रूप में ('ढलान की ओर' की जगह और अधिक विशिष्ट के साथ, अगर और अधिक अस्पष्ट, 'कर्ण')। ज़ुबान को आसान बनाता है, और मुझे लगता है कि इस तरह याद रखना आसान है।
अस्मोर

1
मैं हमेशा 'द ओल्ड अरब सैट ऑन हिज कैमल एंड हॉलेड' को पसंद करता हूं, क्योंकि माध्यमिक विद्यालय (हाई स्कूल की उम्र) को मेरे मस्तिष्क पर अंकित किया गया है।
जॉर्ज डकेट 7

वहाँ भी है " S ome हे ld एच ippy सी एएमई एक nd एच विज्ञापन टी फट हे n एक सीआईडी"
blissfreak

3

मेरे पसंदीदा में से एक 'लाइफ' का असेंबली लैंग्वेज वर्जन है, और माइकल एब्रैश द्वारा " द ज़ेन ऑफ़ कोड ऑप्टिमाइज़ेशन" में इसे अनुकूलित करने का पूरा विवरण है ।

मैं किसी को भी रत्नों की कोडिंग के लिए उसकी किताबों की सिफारिश करूंगा।

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