मैं एक स्क्रॉलिंग शूटर गेम पोर्ट कर रहा हूं जिसे मैंने एक्सएनए में मोनोगेम का उपयोग करके लिनक्स में बनाया है। लगभग सबकुछ सुचारू रूप से चला गया है, लेकिन मुझे स्प्राइटबैच.ड्रा() को फ्रेमरेट को अपंग करने के लिए कॉल के साथ एक विशिष्ट स्थान पर कोई समस्या है। अधिकांश खेल बिना किसी हिचकी के ठीक चलाता है। यह बिना किसी मंदी के एक बार दुश्मनों और बड़ी संख्या में गोलियों को खींचता है। जो भाग गिराए गए फ्रेम का कारण बन रहा है, वह एक स्तरित स्क्रॉलिंग पृष्ठभूमि है। कोड के प्रासंगिक खंड यहां हैं।कुछ ड्रा() कॉल से मोनोगेम एक्सएनए कम फ़्रेमेट
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: ठीक है, मैं बस बुलेट काटने और पारदर्शिता परतों काटने का प्रयास कर रहा था (जैसे किसी प्रकार का आलसी आदमी)। इसने समस्या को हल किया, संभवतः अब इसे बड़ी संख्या में बेकार पिक्सेल प्रस्तुत करना नहीं है, लेकिन यह अभी भी मुझे आश्चर्यचकित करता है कि यह लिनक्स पर केवल एक मुद्दा क्यों है। भले ही मैंने समय के लिए अपना मुद्दा हल कर लिया है, फिर भी मैं इसे थोड़ा सा खोलने जा रहा हूं, अगर किसी के पास कोई भी अंतर्दृष्टि है कि कठोर प्रदर्शन अंतर क्या हो सकता है।
मैं वास्तव में विभिन्न चीजों के प्रदर्शन की लागत को याद नहीं कर सकता लेकिन जीपीयू को आकर्षित करने के लिए मजबूर कर रहा हूं कि कई उच्च-रेज बनावट शायद एक बहुत अच्छा विचार नहीं है और कुछ अलग तरीके से डिजाइन करने में सक्षम होना चाहिए। यदि स्मृति मुझे सही करता है तो जीपीयू को भेजे जाने पर उन बनावटों को 1024 * 1024 बनावट (2-आवश्यकता की शक्ति और रनटाइम के दौरान उस आकार में रीमेक करने के कारण) समाप्त हो जाएगा। –
इस मामले में समस्या यह है कि पृष्ठभूमि की प्रत्येक छवि एक अलग गति पर स्क्रॉल करती है या पारदर्शिता का एक अलग स्तर होता है। उनमें से कुछ मैं निश्चित रूप से काट सकता हूं और स्क्रीन के छोटे क्षेत्रों में आकर्षित परतें बना सकता हूं, लेकिन उनमें से कुछ (ज्यादातर पारदर्शिता परतें) इतनी आसान नहीं हैं। मुझे पता नहीं था कि जीपीयू ने दो बनावटों की गैर-शक्ति का आकार बदल दिया है; शायद मैं उनका आकार बदलूंगा और देख सकता हूं कि यह कुछ बदलता है या नहीं। अनुकूलन के बावजूद मैं बनाने में जा रहा हूं, मैं वास्तव में उलझन में हूं कि यह समस्या विंडोज पर क्यों नहीं होती है। – cmark89