मैं टेरारिया के समान एक गेम इंजन पर काम कर रहा हूं , ज्यादातर एक चुनौती के रूप में, और जब मैंने इसका अधिकांश पता लगा लिया है, तो मैं वास्तव में अपने सिर को चारों ओर लपेटने के लिए नहीं देख सकता हूं कि वे लाखों इंटरएक्टिव / कटाई योग्य टाइलों को कैसे संभालते हैं खेल एक समय में है। लगभग 500.000 टाइलें बनाना, जो कि 1/20 वीं है, जो कि टेरारिया में संभव है , मेरे इंजन में फ्रेम-दर 60 से 20 के आसपास गिरने का कारण बनता है, यहां तक कि मैं अभी भी केवल टाइलें देख रहा हूं। माइंड यू, मैं टाइल्स के साथ कुछ नहीं कर रहा हूं, केवल उन्हें याद में रखते हुए।
अपडेट : कोड यह दिखाने के लिए जोड़ा गया है कि मैं चीजों को कैसे करता हूं।
यह एक वर्ग का हिस्सा है, जो टाइल्स को संभालता है और उन्हें खींचता है। मैं अनुमान लगा रहा हूं कि अपराधी "फॉर्च्यूनर" वाला हिस्सा है, जो सब कुछ, यहां तक कि खाली इंडेक्स को भी प्रसारित करता है।
...
public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
{
foreach (Tile tile in this.Tiles)
{
if (tile != null)
{
if (tile.Position.X < -this.Offset.X + 32)
continue;
if (tile.Position.X > -this.Offset.X + 1024 - 48)
continue;
if (tile.Position.Y < -this.Offset.Y + 32)
continue;
if (tile.Position.Y > -this.Offset.Y + 768 - 48)
continue;
tile.Draw(spriteBatch, gameTime);
}
}
}
...
इसके अलावा यहां टाइल.ड्रॉ विधि है, जो एक अद्यतन के साथ भी कर सकती है, क्योंकि प्रत्येक टाइल स्प्राइटबैच.ड्राव विधि के लिए चार कॉल का उपयोग करती है। यह मेरे ऑटोटीलिंग सिस्टम का हिस्सा है, जिसका मतलब है कि पड़ोसी के टाइल्स के आधार पर प्रत्येक कोने को खींचना। बनावट_ * आयताकार हैं, एक बार स्तर के निर्माण पर सेट होते हैं, प्रत्येक अपडेट में नहीं।
...
public virtual void Draw(SpriteBatch spriteBatch, GameTime gameTime)
{
if (this.type == TileType.TileSet)
{
spriteBatch.Draw(this.texture, this.realm.Offset + this.Position, texture_tl, this.BlendColor);
spriteBatch.Draw(this.texture, this.realm.Offset + this.Position + new Vector2(8, 0), texture_tr, this.BlendColor);
spriteBatch.Draw(this.texture, this.realm.Offset + this.Position + new Vector2(0, 8), texture_bl, this.BlendColor);
spriteBatch.Draw(this.texture, this.realm.Offset + this.Position + new Vector2(8, 8), texture_br, this.BlendColor);
}
}
...
मेरे कोड में किसी भी आलोचना या सुझाव का स्वागत है।
अद्यतन : समाधान जोड़ा गया।
यहाँ अंतिम Level.Draw विधि है। Level.TileAt विधि केवल इनपुट किए गए मानों की जांच करती है, OutOfRange अपवादों से बचने के लिए।
...
public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
{
Int32 startx = (Int32)Math.Floor((-this.Offset.X - 32) / 16);
Int32 endx = (Int32)Math.Ceiling((-this.Offset.X + 1024 + 32) / 16);
Int32 starty = (Int32)Math.Floor((-this.Offset.Y - 32) / 16);
Int32 endy = (Int32)Math.Ceiling((-this.Offset.Y + 768 + 32) / 16);
for (Int32 x = startx; x < endx; x += 1)
{
for (Int32 y = starty; y < endy; y += 1)
{
Tile tile = this.TileAt(x, y);
if (tile != null)
tile.Draw(spriteBatch, gameTime);
}
}
}
...