मैं कोड के एक टुकड़े पर काम कर रहा हूं जहां मुझे यूवीएस (2 डी बनावट निर्देशांक) से निपटने की ज़रूरत है जो 0 से 1 रेंज में जरूरी नहीं हैं। एक उदाहरण के रूप में, कभी-कभी मुझे एक यूवी घटक मिल जाएगा जो 1.2 है।फर्श पर कॉल से बचें()
u -= floor(u)
v -= floor(v)
इस का कारण बनता है 1.2 0.2 जो वांछित परिणाम है बनने के लिए करना: इस संभाल करने में मैं एक रैपिंग जो निम्न कार्य करके खपरैल का कारण बनता है को लागू करने कर रहा हूँ। यह नकारात्मक मामलों को भी संभालता है, जैसे -0.4 0.6 बन रहा है।
हालांकि, फर्श पर ये कॉल धीमी हैं। मैंने इंटेल वीट्यून का उपयोग करके अपना आवेदन प्रोफाइल किया है और मैं सिर्फ इस मंजिल के संचालन के दौरान चक्रों की एक बड़ी मात्रा खर्च कर रहा हूं।
इस मुद्दे पर कुछ पृष्ठभूमि पढ़ने के बाद, मैं निम्नलिखित कार्य के साथ आया हूं जो थोड़ा तेज़ है लेकिन अभी भी वांछित होने के लिए बहुत कुछ छोड़ देता है (मैं अभी भी प्रकार के रूपांतरण दंड इत्यादि कर रहा हूं)।
int inline fasterfloor(const float x) { return x > 0 ? (int) x : (int) x - 1; }
मैं कुछ गुर कि इनलाइन विधानसभा लेकिन कुछ भी बिल्कुल सही काम करते हैं या किसी भी महत्वपूर्ण गति सुधार करने के लिए लगता है कि के साथ पूरा किया जाता है देखा है।
क्या किसी को इस तरह के परिदृश्य को संभालने के लिए कोई चाल पता है?
क्या आप जो भी अवैध मूल्य दे रहे हैं उसे ठीक कर सकते हैं? – Bill
* reinterpret_cast (& u) और किसी प्रकार का बिट जादू (आईईईई फ्लोट प्रारूप मानते हुए) का उपयोग करना शायद सबसे तेज़ होगा जो आप नंगे सी ++ में कर सकते हैं, लेकिन इससे कुछ पोर्टेबिलिटी खो जाती है। –
Tronic
क्या निर्देशांक कभी नकारात्मक हो सकते हैं? साथ ही, जब आपको "कोई महत्वपूर्ण गति सुधार" नहीं मिला है, तो क्या यह आपके दिमाग को पार कर गया है कि यह केवल इसलिए हो सकता है क्योंकि यदि एक महत्वपूर्ण तेज़ तरीका मौजूद है, तो संकलक इसका उपयोग शुरू करने के लिए करेगा? ;) – jalf