আমি টেরিয়ারিয়ার অনুরূপ একটি গেম ইঞ্জিন তৈরির কাজ করেছি , বেশিরভাগই একটি চ্যালেঞ্জ হিসাবে, এবং এর বেশিরভাগ বিষয়টি আমি বের করার পরেও আমি সত্যিই আমার মাথাটি জড়িয়ে রাখতে পারি না যে তারা কীভাবে লক্ষ লক্ষ ইন্টারেক্টেবল / ফসলযোগ্য টাইলস পরিচালনা করে খেলা এক সময় আছে। প্রায় 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);
}
}
...
আমার কোড সম্পর্কে কোনও সমালোচনা বা পরামর্শ স্বাগত is
আপডেট : সমাধান যুক্ত হয়েছে।
এখানে চূড়ান্ত স্তর। ড্র পদ্ধতি। আউটঅফ্রেঞ্জ ব্যতিক্রমগুলি এড়ানোর জন্য লেভেল.টাইলএট পদ্ধতিটি কেবল ইনপুট মানগুলি পরীক্ষা করে।
...
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);
}
}
}
...