2009-12-18 11 views
5

पर रंग मैनिपुलेशन अनुकूलित करें मैं अपना सरल 2 डी एक्सएनए गेम प्रोफाइल कर रहा हूं। मैंने पाया कि पूरे चलने वाले समय का 4% दो रंगों को एक साथ जोड़ने के सरल ऑपरेशन द्वारा लिया जाता है, उनमें से एक फ्लोट द्वारा पहले गुणा किया जाता है।एक्सएनए

मुझे इस विधि को प्रति फ्रेम 2000 बार (मानचित्र पर प्रत्येक टाइल के लिए) कॉल करने की आवश्यकता है, जिसने मुझे XNA के 60 एफपीएस के लिए प्रति सेकंड 120000 बार दिया। यहां तक ​​कि एकल कॉल की न्यूनतम वृद्धि भी भारी गति प्रभाव देगी। अभी तक मैं सरल पता नहीं कैसे मैं इस और अधिक प्रभावी

private void DoColorCalcs(float factor, Color color) 
    { 
     int mul = (int)Math.Max(Math.Min(factor * 255.0, 255.0), 0.0); 
     tile.Color = new Color(
      (byte)Math.Min(tile.Color.R + (color.R * mul/255), 255), 
      (byte)Math.Min(tile.Color.G + (color.G * mul/255), 255), 
      (byte)Math.Min(tile.Color.B + (color.B * mul/255), 255)); 

    } 

संपादित कर सकते हैं: माइकल Stum द्वारा सुझाव दिया गया है:

private void DoColorCalcs(float factor, Color color) 
    { 
     factor= (float)Math.Max(factor, 0.0); 
     tile.Color = new Color(
      (byte)Math.Min(tile.Color.R + (color.R * factor), 255), 
      (byte)Math.Min(tile.Color.G + (color.G * factor), 255), 
      (byte)Math.Min(tile.Color.B + (color.B * factor), 255)); 
    } 

यह 2.5%

+2

जो शब्द आप खोज रहे हैं वह अनुकूलित है, अनुकूल नहीं है। :) – jalf

+0

यह एक साधारण 2 डी गेम के लिए बहुत सी कॉल की तरह लगता है। क्या आप इसके बजाय समग्र एल्गोरिदम नहीं बदल सकते? उदा। परिणाम कैशिंग या हर फ्रेम सब कुछ करने से परहेज? – Jan

+0

मुझे टाइल्स के लिए गतिशील रोशनी को पुन: गणना करने की आवश्यकता है (मेरे प्रकाश मॉडल में हल्की झिलमिलाहट शामिल है, जो हर फ्रेम में दिए गए टाइल के लिए पाप (समय) * 0.1 पर प्रकाश तीव्रता को बदलती है) – PiotrK

उत्तर

1

मेरा पहला सवाल है, क्यों फ़्लोटिंग पॉइंट? यदि आप उन्हें फीका करने के लिए सिर्फ रंग स्केल कर रहे हैं, तो आपको बहुत सटीकता की आवश्यकता नहीं है। उदाहरण:

int factorTimes256; 
tile.Color.R = Math.Max(255, tile.Color.R + (color.R * factorTimes256)/256); 
// same for G and B 

दूसरे शब्दों में, 0 से 256 के लिए एक पूर्णांक के रूप में अपने कारक प्रतिनिधित्व करते हैं, और पूर्णांकों पर सभी गणना करते हैं। आपको 8 बिट्स की तुलना में अधिक सटीकता की आवश्यकता नहीं है क्योंकि परिणाम केवल 8 बिट्स है।

मेरा दूसरा सवाल यह है कि, क्या आप कहते हैं कि आप इस कोड में 4% से 2.5% तक गए थे? यह छोटा है। जो लोग ऐसे प्रोफाइलर्स का उपयोग करते हैं जो केवल उपकरण काउंटर करते हैं या प्रोग्राम काउंटर का नमूना करते हैं, वे अक्सर ऐसे छोटे सुधारों से संतुष्ट होते हैं। मुझे यकीन है कि आपके पास अन्य चीजें चल रही हैं जो बहुत अधिक समय लेती हैं, जिससे आप हमला कर सकते हैं। Here's an example of what I mean.

1

The To 4% से समय उपयोग को कम कर दिया mul की गणना में डिवीजन ऑपरेशन (/ 255) की गणना में स्पष्ट सुधार होगा, विभाजन को 3 से एक एकल विभाजन में कम करने के लिए:

private void DoColorCalcs(float factor, Color color) 
{ 
    float mul = Math.Max(Math.Min(factor * 255.0f, 255.0f), 0.0f)/255f; 
    tile.Color = new Color(
     (byte)Math.Min(tile.Color.R + (color.R * mul), 255), 
     (byte)Math.Min(tile.Color.G + (color.G * mul), 255), 
     (byte)Math.Min(tile.Color.B + (color.B * mul), 255)); 
} 

यही कहा जा रहा है, जब से तुम tile.Color बदल रहे हैं, यह वास्तव में तेजी से हो सकता है उसे ओवरराइट (हालांकि मैं प्रोफ़ाइल चाहते हैं, तो यह मदद करता है यह देखने के लिए) के बजाय जगह में इसे बदलना:

private void DoColorCalcs(float factor, Color color) 
{ 
    float mul = Math.Max(Math.Min(factor * 255.0f, 255.0f), 0.0f)/255f; 
    tile.Color.R = (byte)Math.Min(tile.Color.R + (color.R * mul), 255); 
    tile.Color.G = (byte)Math.Min(tile.Color.G + (color.G * mul), 255); 
    tile.Color.B = (byte)Math.Min(tile.Color.B + (color.B * mul), 255); 
} 

यह अल्फा चैनल के पुनर्मूल्यांकन को रोकता है, और निर्देशों की मात्रा को थोड़ा कम कर सकता है।

+0

(int) Math.Max ​​(Math.Min (कारक * 255.0, 255.0) , 0.0)/255 परिणामस्वरूप ज्यादातर मामलों में 0 होगा। तो यह मदद नहीं करता है। –

+0

साइमन ओटेंहॉस के साथ सहमत हैं - आप 255 तक पूर्णांक 0..255 को विभाजित कर रहे हैं, जिसने आपको 254 शून्य और सिंगल वैल्यू "एक" – PiotrK

+0

आह दिया, मैं भूल गया - मैंने अपने चर सेट करके नई रंग ऑब्जेक्ट बनाने की जगह बदलने की कोशिश की। इसे थोड़ा "खराब दृष्टिकोण" की आवश्यकता थी क्योंकि मुझे टाइल बदलना पड़ा था। एक्सेसर प्रकार से परिवर्तनीय तक रंग। लेकिन फिर भी इसका कोई गति प्रभाव नहीं था (परीक्षण और गोलाकार परिणाम 0,1 एफपीएस) – PiotrK

संबंधित मुद्दे