2 डी वेक्टर वर्ग के लिए फ्लोट, डबल या दोनों?


11

मैं वर्तमान में हमारे स्टूडियो के लिए एक छोटा क्रॉस-प्लेटफ़ॉर्म OpenGL- आधारित 2D गेम इंजन लिख रहा हूं। जब मैंने शोध किया कि किस 2D वेक्टर क्लास का उपयोग करना है, तो मैंने तीन अलग-अलग डिज़ाइन के प्रतिमानों को ठोकर दिया:

  • फ्लोट और कॉल-बाय-वैल्यू, जैसे इस गामासूत्र लेख में । लगता है तेज है, लेकिन थोड़ा परिशुद्धता प्रदान करता है (यह भी देखें धागा )। प्रो: सबसे पुस्तकालयों के साथ तेज, पोर्टेबल और संगत।

  • डबल और कॉल-बाय-संदर्भ। यदि मैं उपरोक्त लेख को सही समझता हूं, तो मैं 4 फ्लोट संख्याओं के बजाय 2 डबल सटीक चर का उपयोग कर सकता हूं। उपरोक्त धागे के अनुसार फ्लोट की तुलना में डबल अभी भी धीमा है।

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

मैं यह जानना चाहूंगा कि आपके इन-हाउस इंजनों में आप कौन से समाधानों का उपयोग कर रहे हैं और उदाहरण के लिए लोकप्रिय गेम इंजन कितने सटीक हैं, इसलिए मैं यह तय कर सकता हूं कि मैं अपने इंजन में कौन सा समाधान लागू करूंगा। फिलहाल मैं फ्लोट प्रिसिजन का इस्तेमाल कर रहा हूं और इसके साथ जी रहा हूं।


धीमा कहां ? अगर आप किसी विशेष आर्किटेक्चर से बंधे नहीं हैं तो आप गति के बारे में बात नहीं कर सकते।
ओ ० '।

2
@ लोरिस: मैं ऐसी किसी भी वास्तुकला को नहीं जानता जहां फ्लोट से दोगुना तेज है।

अपने स्वयं के वेक्टर वर्ग को लिखने के बजाय, सोनी के ( बुलेटफिजिक्स.ऑर्ग / बुलेट / एफपीबीबी 3/… ) का उपयोग करने पर विचार करें । यह एक आसान ड्रॉप-हेडर-ओनली "लाइब्रेरी" है जो पहले से ही माइक्रो-ऑप्टिमाइज़ किया गया है, और सभी वेक्टर लाइब्रेरी मूल रूप से वैसे ही समान इंटरफ़ेस हैं।

@ जो: 4 फ्लोट के बजाय 2 डबल्स?
ओ ० '।

@ लोरिस: प्रश्न थोड़ा अजीब है, मुझे नहीं पता कि प्रश्नकर्ता भ्रमित है या सिर्फ आप - आप दो डबल्स का उपयोग करते हैं, "चार फ्लोट्स के बजाय" सिमड से निपटने के लिए, क्योंकि रजिस्टर 128 बिट्स चौड़ा है। आपको अभी भी एक समान संख्याओं को संसाधित करने की आवश्यकता है, और आप इसे अर्ध-गति से कर रहे हैं।

जवाबों:


9

मैं हमेशा फ्लोट का उपयोग करता हूं जब तक कि मेरे पास डबल का उपयोग करने का कोई कारण नहीं है, जब तक कि मैं इंट का उपयोग नहीं करता हूं जब तक कि मेरे पास int64_t का उपयोग करने का कारण नहीं है।

2 24 तक सटीक पूर्णांक अंकगणित करने में फ़्लोट्स की कोई समस्या नहीं है , जो कि ज्यादातर लोग डरते हैं (ज्यादातर तर्कहीन रूप से)। युगल सामान्य मानों की समस्या को ठीक से अप्रमाणित करने की समस्या का समाधान नहीं करते हैं - चाहे आप 0.10000001 या 0.10000000000000001 प्राप्त करें, फिर भी आपको यह सुनिश्चित करना होगा कि आपका कोड 0.09999999 तक इसे "बराबर" मानता है।

डबल्स हर प्लेटफ़ॉर्म पर धीमे हैं जिन्हें आप गेम लिखने की परवाह करेंगे, मेमोरी बैंडविड्थ को दो बार लेंगे, और कम विशेष सीपीयू निर्देश उपलब्ध होंगे।

एकल-सटीक फ़्लोट्स हार्डवेयर ग्राफ़िक्स इंटरफ़ेस के लिए मानक बने रहते हैं, दोनों C / C ++ साइड और अंदर शेड्स पर।

आपको किसी बिंदु पर डबल वेक्टर की आवश्यकता होगी, लेकिन इसका उपयोग तब किया जाना चाहिए, जब डिफ़ॉल्ट रूप से आवश्यक हो।

टेम्प्लेटिंग के लिए - आप सही हैं, अधिकतम प्रदर्शन के लिए आप वैसे भी मैन्युअल रूप से टेम्प्लेट को विशेषज्ञ बनाना चाहेंगे। उस के अलावा, मैंने सप्ताहांत में कुछ टेम्पर्ड कोड के लिए कुछ परीक्षण चलाए (4-पीएल इंटरेक्ट और फ्लोटरेक्ट बनाकर), और पाया कि टेम्पर्ड संस्करण को कोड को दोहराने के बजाय संकलित करने में 20 गुना अधिक समय लगा, जो लगभग 15 लाइनों की राशि थी । पुनरावृत्ति बेकार है, लेकिन संकलन का इंतजार अधिक बेकार है - और ऐसा नहीं है कि मुझे कभी स्ट्रिंगरक्ट या फूआरक्ट की आवश्यकता होने वाली है।


" डबल्स हर प्लेटफॉर्म पर धीमे हैं [...] " - उद्धरण की आवश्यकता है।
ज़ीनत

3

Microsoft XNA गेम फ्रेमवर्क में एक वेक्टर 2 वर्ग है जो फ्लोट्स का उपयोग करता है। फ्लोट्स के साथ जाने का यह मेरा व्यक्तिगत सबसे बड़ा कारण होगा, क्योंकि मुझे XNA टीम के ज्ञान और अनुभव पर भरोसा है कि यह मेरे खुद के मुकाबले बहुत अधिक है।

मुझे इस स्टैक ओवरफ्लो प्रश्न में जवाब पढ़ने के बजाय दिलचस्प लगा: "फ्लोट बनाम डबल प्रदर्शन" । GPU में दोहरे प्रदर्शन की कुछ चर्चा के साथ एक gamedev.net धागा भी है । मुझे लगता है कि यह मान लेना सुरक्षित है कि युगल फ्लोट की तुलना में धीमे हैं, कम से कम कई जीपीयू में, और मैंने हमेशा अपने डबल समकक्षों पर फ्लोट ओपनगेल कार्यों का उपयोग किया। यह आजकल लागू नहीं हो सकता है, लेकिन यदि आप समझते हैं कि आपके खेल को चलाने वाले सभी लोगों के पास मूल दोहरे समर्थन के साथ नवीनतम GPU नहीं है, तो मुझे लगता है कि यह कारण है कि फ़्लोट्स का उपयोग करना और उस अतिरिक्त प्रदर्शन को प्राप्त करना।


1
SO प्रश्न से: "x86 प्रोसेसर पर, कम से कम, फ्लोट और डबल प्रत्येक को प्रसंस्करण के लिए FPU द्वारा वास्तविक 10-बाइट में परिवर्तित किया जाएगा।" हालांकि यह सच है, यह दोनों SIMD निर्देशों और अतिरिक्त मेमोरी (= बदतर कैश सुसंगतता, अधिक मेमोरी बैंडविड्थ) दोनों की आवश्यकताओं की उपेक्षा करता है, दोनों वास्तविक दुनिया के परीक्षणों में फ्लोट की तुलना में इसे धीमा करना जारी रखते हैं।

मुझे लगा कि एक कैच है। आपको टिप्पणी करनी चाहिए कि SO उत्तर पर, मैं इसे बढ़ा दूंगा।
Ricket

यह पहले से ही एक टिप्पणी के रूप में है।

1
चूंकि आप XNA लाए थे, इसलिए मैं यह भी बता सकता हूं कि Direct2D एकल-सटीक फ्लोट का भी उपयोग करता है।
माइक स्ट्रोबेल

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