2013-06-07 5 views
5

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

Level.cs:

public void Draw(SpriteBatch spriteBatch) 
{ 
    foreach (ScrollingBackgroundLayer sbl in scrollingBackground) 
    { 
     sbl.Draw(spriteBatch); 
    } 
} 

"scrollingBackground" ऊपर ScrollingBackgroundLayers की एक सूची है, प्रासंगिक वर्गों जिनमें से कर रहे हैं:

ScrollingBackgroundLayers.cs:

Vector2[] scrollingBackgroundImages; 
public float DrawLayer; 

public ScrollingBackgroundLayer(GameScene newScene, Texture2D texture, float scrollSpeed, Color color) 
{ 
    layerColor = color; 
    layerSpeed = scrollSpeed; 
    layerTexture = texture; 
    thisScene = newScene; 

    Initialize(); 
} 

public void Initialize() 
{ 
    scrollingBackgroundImages = new Vector2[2]; 

    for (int i = 0; i < 2; i++) 
    { 
     scrollingBackgroundImages[i] = new Vector2(0, thisScene.ScreenArea.Height - (layerTexture.Height * i)); 
    } 
} 


public void Update(GameTime gameTime) 
{ 
    for (int i = 0; i < scrollingBackgroundImages.Length; i++) 
    { 
     scrollingBackgroundImages[i].Y += (float)gameTime.ElapsedGameTime.TotalSeconds * layerSpeed; 

     if (layerSpeed > 0 && scrollingBackgroundImages[i].Y >= thisScene.ScreenArea.Height) 
     { 
      scrollingBackgroundImages[i] = new Vector2(scrollingBackgroundImages[i].X, (scrollingBackgroundImages[i].Y - layerTexture.Height * 2)); 
     } 
     else if (layerSpeed < 0 && scrollingBackgroundImages[i].Y + layerTexture.Height <= 0) 
     { 
      scrollingBackgroundImages[i] = new Vector2(scrollingBackgroundImages[i].X, (scrollingBackgroundImages[i].Y + layerTexture.Height * 2)); 
     } 
    } 
} 

public void Draw(SpriteBatch spriteBatch) 
{ 
    foreach (Vector2 sb in scrollingBackgroundImages) 
    { 
     spriteBatch.Draw(layerTexture, sb, null, layerColor, 0f, Vector2.Zero, 1f, SpriteEffects.None, DrawLayer); 
    } 
} 

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

फ़्रेमेटेट कमी उस गेम के एक चरण पर होती है जिसमें 7 अलग-अलग स्कॉलिंग बैकग्राउंड लेयर होते हैं, जिनमें से प्रत्येक एक अलग बनावट खींचता है जो लगभग 700 पिक्सल चौड़ा और 900 ऊंचा होता है (प्रत्येक परत को इसे 2 गुना से अधिक नहीं करना चाहिए स्क्रॉलिंग प्रभाव)। मुझे लगता है कि मुझे कुछ स्पष्ट याद आना है, क्योंकि गेम कभी-कभी सटीक उसी अधिभार का उपयोग करके 2-300 गोलियों को प्रस्तुत करता है, इसलिए बाल्टी में एक और 14 कॉल ड्रॉप होनी चाहिए। क्या यह आसानी से प्रभावी ढंग से संभालने के लिए स्प्राइटबैच के लिए बनावट बनाने की कोशिश करने के साथ एक मुद्दा है? यह विंडोज संस्करण पर कोई मुद्दा नहीं है, इसलिए मैं सोच रहा हूं कि इसमें कुछ प्लेटफ़ॉर्म विशिष्ट कार्यवाही नहीं है, या यदि मोनोमेम का ड्रा का कार्यान्वयन केवल अक्षम है। किसी भी प्रतिक्रिया का स्वागत किया जाएगा।

उन दिलचस्पी के लिए पूर्ण स्रोत:

लिनक्स - https://github.com/cmark89/AsteroidRebuttal-Linux
विंडोज - https://github.com/cmark89/AsteroidRebuttal

संपादित करें: मैं थोड़ा और यह संवारता की कोशिश की। मैंने यह सुनिश्चित करने के लिए कॉल आयत() को बदल दिया है कि गंतव्य आयताकार स्क्रीन के ड्रॉइंग क्षेत्र के बराबर था, लेकिन इसमें कोई उल्लेखनीय परिवर्तन नहीं था। मैंने बनावट को बहुत छोटे से बदल दिया और अंतराल को समाप्त कर दिया, इसलिए मुझे लगता है कि बनावट के आकार के साथ इसका कुछ संबंध है।

संपादित करें 2: ठीक है, मैं बस बुलेट काटने और पारदर्शिता परतों काटने का प्रयास कर रहा था (जैसे किसी प्रकार का आलसी आदमी)। इसने समस्या को हल किया, संभवतः अब इसे बड़ी संख्या में बेकार पिक्सेल प्रस्तुत करना नहीं है, लेकिन यह अभी भी मुझे आश्चर्यचकित करता है कि यह लिनक्स पर केवल एक मुद्दा क्यों है। भले ही मैंने समय के लिए अपना मुद्दा हल कर लिया है, फिर भी मैं इसे थोड़ा सा खोलने जा रहा हूं, अगर किसी के पास कोई भी अंतर्दृष्टि है कि कठोर प्रदर्शन अंतर क्या हो सकता है।

+1

मैं वास्तव में विभिन्न चीजों के प्रदर्शन की लागत को याद नहीं कर सकता लेकिन जीपीयू को आकर्षित करने के लिए मजबूर कर रहा हूं कि कई उच्च-रेज बनावट शायद एक बहुत अच्छा विचार नहीं है और कुछ अलग तरीके से डिजाइन करने में सक्षम होना चाहिए। यदि स्मृति मुझे सही करता है तो जीपीयू को भेजे जाने पर उन बनावटों को 1024 * 1024 बनावट (2-आवश्यकता की शक्ति और रनटाइम के दौरान उस आकार में रीमेक करने के कारण) समाप्त हो जाएगा। –

+0

इस मामले में समस्या यह है कि पृष्ठभूमि की प्रत्येक छवि एक अलग गति पर स्क्रॉल करती है या पारदर्शिता का एक अलग स्तर होता है। उनमें से कुछ मैं निश्चित रूप से काट सकता हूं और स्क्रीन के छोटे क्षेत्रों में आकर्षित परतें बना सकता हूं, लेकिन उनमें से कुछ (ज्यादातर पारदर्शिता परतें) इतनी आसान नहीं हैं। मुझे पता नहीं था कि जीपीयू ने दो बनावटों की गैर-शक्ति का आकार बदल दिया है; शायद मैं उनका आकार बदलूंगा और देख सकता हूं कि यह कुछ बदलता है या नहीं। अनुकूलन के बावजूद मैं बनाने में जा रहा हूं, मैं वास्तव में उलझन में हूं कि यह समस्या विंडोज पर क्यों नहीं होती है। – cmark89

उत्तर

2

इस स्थिति में, मैं सुझाव दूंगा कि आप इसे पूरा करने के लिए, बजाय एक शेडर का उपयोग करें। ऐसा करके आप अपना प्रदर्शन स्काईरकेट देखेंगे।निम्नलिखित पर एक नज़र डालें:

http://www.david-gouveia.com/scrolling-textures-with-zoom-and-rotation/

यह इस तरह से कर रहा, CPU उपयोग का एक बहुत कम हो जाएगा, और अपने GPU बनाने के काम के थोक है।

आप अपने बनावट को 700x900 के बजाय 2 की शक्तियों में भी स्टोर करना चाहते हैं। (512x512 की तरह कुछ करें)। आपकी ग्राफिक्स पाइपलाइन में बनावट से संबंधित प्रदर्शन बढ़ावा है जिसमें दो की शक्ति है।

+0

मैं इसमें देख रहा हूं, लेकिन मुझे जो करना है उसके लिए यह अधिक हो सकता है। हो सकता है कि सिर्फ इसलिए कि शेडर्स मुझे डराते हैं। जब मुझे यह कोशिश करने का मौका मिलता है तो मैं वापस आऊंगा। – cmark89

+0

यह अधिक नहीं है, मैं आपको आश्वासन देता हूं कि यह बहुत आसान है। आपको काम करने के लिए शेडरों के बारे में कुछ भी जानने की ज़रूरत नहीं है;) – jgallant

+0

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

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