তারা কীভাবে এটি করত: টেরারিয়ায় কয়েক মিলিয়ন টাইলস


45

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

            }
        }
    }
...

2
আপনি কি একেবারে ইতিবাচক? আপনি কেবল ক্যামেরার দৃষ্টিতে যা রেন্ডার করছেন, অর্থ কী সঠিক রেন্ডার করবেন তা নির্ধারণের জন্য কোড?
কুপার

5
ফ্রেমারেট 60 থেকে 20 fps থেকে ড্রপ, কেবল বরাদ্দ মেমরির কারণে? এটি খুব অসম্ভব, এখানে কিছু ভুল থাকতে হবে। এটা কি প্ল্যাটফর্ম? সিস্টেমটি কি ভার্চুয়াল মেমরিটিকে ডিস্কে অদলবদল করে?
মাইক সেমদার

6
@ ড্রাকির এই ক্ষেত্রে আমি বলব এটি যদি ভুল হয় তবে যদি টাইল শ্রেণি না থাকে তবে উপযুক্ত দৈর্ঘ্যের পূর্ণসংখ্যার একটি অ্যারে করা উচিত এবং যখন অর্ধ মিলিয়ন অবজেক্ট থাকে তখন ওও ওভারহেড কোনও রসিকতা নয়। আমি অনুমান করি যে অবজেক্টগুলির সাথে এটি করা সম্ভব, তবে বিন্দুটি কী হবে? একটি পূর্ণসংখ্যার অ্যারে হ্যান্ডেল করার জন্য মৃত সহজ।
aaaaaaaaaaaa

3
সেকি! Iterating সব টাইলস এবং প্রতিটি এক দৃশ্য যে চার বার আঁকুন কলিং। এখানে অবশ্যই কিছু উন্নতি সম্ভব হয়েছে ....
থাইডিয়ান

11
আপনার দর্শনীয় বিষয়গুলি কেবল রেন্ডার করতে নীচে সমস্ত অভিনব পার্টিশনিংয়ের কথা বলা উচিত নয়। এটি একটি টাইলম্যাপ। এটি ইতিমধ্যে একটি নিয়মিত গ্রিডে বিভক্ত। পর্দার উপরের-বামে এবং নীচে-ডানদিকে কেবল টাইল গণনা করুন এবং সেই আয়তক্ষেত্রের সমস্ত কিছু আঁকুন।
ব্লেকি

উত্তর:


56

আপনি যখন রেন্ডার করছেন তখন কি সমস্ত 500,000 টাইলের মধ্য দিয়ে লুপ করছেন? যদি তা হয় তবে সম্ভবত এটি আপনার সমস্যার অংশ হয়ে উঠবে। যদি আপনি রেন্ডারিংয়ের সময় অর্ধ মিলিয়ন টাইলস এবং তার উপর 'আপডেট' টিকগুলি সম্পাদন করার সময় অর্ধ মিলিয়ন টাইলগুলি লুপ করেন তবে আপনি প্রতিটি ফ্রেমে মিলিয়ন টাইলস লুপ করছেন।

স্পষ্টতই, এই কাছাকাছি উপায় আছে। রেন্ডারিংয়ের সময় আপনি নিজের আপডেট টিকগুলি সম্পাদন করতে পারেন, এইভাবে আপনি এই সমস্ত টাইলগুলির মধ্য দিয়ে লুপিংয়ের জন্য অর্ধেক সময় সাশ্রয় করেছেন। তবে এটি আপনার রেন্ডারিং কোড এবং আপনার আপডেট কোডকে এক সাথে একটি ফাংশনের সাথে যুক্ত করে এবং এটি সাধারণত একটি বিএড আইডিএ

আপনি স্ক্রিনে থাকা টাইলগুলির উপর নজর রাখতে পারেন এবং সেগুলি কেবল (এবং রেন্ডার) মাধ্যমে লুপ করতে পারেন। আপনার টাইলসের আকার এবং স্ক্রিনের আকারের মতো জিনিসের উপর নির্ভর করে এটি আপনার যে পরিমাণ টাইলগুলি লুপ করতে হবে তা সহজেই হ্রাস করতে পারে এবং এটি প্রক্রিয়াজাতকরণের বেশ কিছুটা সময় সাশ্রয় করতে পারে।

অবশেষে এবং সম্ভবত সেরা বিকল্প (বেশিরভাগ বৃহত বিশ্ব গেমগুলি এটি করে) হ'ল আপনার অঞ্চলগুলিকে অঞ্চলগুলিতে বিভক্ত করা। বলুন, 512x512 টাইলসকে বিশ্বে ভাগ করুন এবং খেলোয়াড় কোনও অঞ্চলের কাছাকাছি বা আরও দূরে যাওয়ার সাথে সাথে অঞ্চলগুলি লোড / আনলোড করুন। এটি কোনও ধরণের 'আপডেট' টিক সম্পাদন করতে আপনাকে দূরবর্তী টাইলসের মধ্য থেকে লুপ করতে বাঁচায়।

(স্পষ্টতই, যদি আপনার ইঞ্জিন টাইলগুলিতে কোনও ধরণের আপডেট টিক না সম্পাদন করে তবে আপনি এই উত্তরের যে অংশটি উল্লেখ করেছেন সে অংশটি উপেক্ষা করতে পারেন))


5
অঞ্চলটির অংশটি আকর্ষণীয় বলে মনে হচ্ছে, যদি আমি সঠিকভাবে স্মরণ করি তবে মাইনক্রাফ্ট এটি কীভাবে কাজ করে, তবে এটি টেরিয়ারিয়ার ভূখণ্ডটি কীভাবে বিকশিত হয় তার সাথেও কাজ করে না যদিও আপনি এর কাছাকাছি কোথাও নেই, যেমন ঘাস ছড়িয়ে, ক্যাকটি বৃদ্ধি এবং এর মতো। সম্পাদনা করুন : অবশ্যই, অঞ্চলটি সক্রিয় থাকাকালীন সময় থেকে তারা অতিবাহিত সময় প্রয়োগ করে এবং তারপরে সেই সময়ের মধ্যে ঘটে যাওয়া সমস্ত পরিবর্তন সম্পাদন করে। এটি আসলে কাজ করতে পারে।
উইলিয়াম মারিয়েরার

2
মাইনক্রাফ্ট স্পষ্টতই অঞ্চলগুলি ব্যবহার করে (এবং পরবর্তী আলটিমা গেমগুলি করেছে, এবং আমি নিশ্চিত যে বেশিরভাগ বেথেদা গেমগুলি করে)। টেরারিয়া ভূখণ্ড কীভাবে পরিচালনা করে সে সম্পর্কে আমি কম নিশ্চিত, তবে তারা সম্ভবত "নতুন" অঞ্চলে অতিবাহিত সময় প্রয়োগ করবেন, বা তারা পুরো মানচিত্রটিকে স্মৃতিতে সঞ্চয় করবেন। আধুনিকরা উচ্চতর র‍্যাম ব্যবহারের জন্য দাবি করবে তবে বেশিরভাগ আধুনিক কম্পিউটার এটি পরিচালনা করতে পারে। এছাড়াও অন্যান্য অপশন থাকতে পারে যা উল্লেখ করা হয়নি।
থাইডিয়ান

2
@ মাইন্ড ওয়ারাক্স: পুনরায় লোড করার সময় সমস্ত আপডেট করা সর্বদা কার্যকর হবে না - ধরুন আপনার কাছে পুরো জঞ্জাল অঞ্চল এবং তারপরে ঘাস থাকবে। আপনি যুগে যুগে চলে যান এবং তারপরে ঘাসের দিকে হাঁটাবেন। যখন ঘাসের সাথে থাকা ব্লকটি এটি ধরে যায় এবং এটি সেই ব্লকে ছড়িয়ে পড়ে তবে এটি ইতিমধ্যে লোড হওয়া কাছাকাছি ব্লকগুলিতে ছড়িয়ে যায় না। এই ধরনের জিনিস অগ্রগতি অনেক খেলা তুলনায় ধীর, যদিও - কোনো এক আপডেটের চক্রে শুধুমাত্র টাইলস একটি ছোট উপশাখা চেক করুন এবং আপনি সিস্টেম নিচে লোড ছাড়া লাইভ দূরবর্তী ভূখণ্ড করতে পারেন।
লরেন পেচটেল

1
কোনও অঞ্চল যখন খেলোয়াড়ের কাছাকাছি আসে তখন "ধরা" বিকল্প হিসাবে (বা পরিপূরক) হিসাবে, আপনি পরিবর্তে প্রতিটি দূরবর্তী অঞ্চলে পুনরাবৃত্তি করতে এবং ধীর হারে তাদের আপডেট করতে পারেন ating আপনি এই প্রতিটি ফ্রেমের জন্য সময় সংরক্ষণ করতে পারেন বা এটি একটি পৃথক থ্রেডে চালিত করতে পারেন। সুতরাং উদাহরণস্বরূপ আপনি প্লেয়ারটি প্রতিটি ফ্রেমে প্লাসে 6 সংলগ্ন অঞ্চলগুলিকে আপডেট করতে পারেন তবে 1 বা 2 অতিরিক্ত অঞ্চলও আপডেট করুন।
লুইস ওয়েকফোর্ড

1
যে কারও জন্য অবাক হওয়ার জন্য, টেরারিয়া তার সম্পূর্ণ টাইলের ডেটা 2 ডি অ্যারে (সর্বোচ্চ আকার 8400x2400) সঞ্চয় করে। এবং তারপরে টাইলগুলির কোন বিভাগটি রেন্ডার করতে হবে তা নির্ধারণ করতে কিছু সাধারণ গণিত ব্যবহার করে।
ফ্রেঞ্চনিএনজেড

4

আমি এখানে একটি বিশাল ভুল দেখছি যা কোনও উত্তর দ্বারা পরিচালিত হয়নি। অবশ্যই আপনার বেশি টাইল আঁকতে এবং পুনরাবৃত্তি করা উচিত নয় তবে আপনার খুব দরকার। স্পষ্টতই কম কী আপনি আসলে টাইলস সংজ্ঞায়িত হয়। যেহেতু আমি দেখতে পাচ্ছি যে আপনি একটি টাইল শ্রেণি তৈরি করেছেন আমি সর্বদা এটিও করতাম তবে এটি একটি বিশাল ভুল। আপনার সম্ভবত সেই শ্রেণিতে সমস্ত ধরণের ফাংশন রয়েছে এবং এটি প্রচুর অপ্রয়োজনীয় প্রক্রিয়াজাতকরণ তৈরি করে।

প্রক্রিয়াজাতকরণের জন্য যা প্রয়োজন তা কেবল আপনাকে পুনরাবৃত্তি করতে হবে। সুতরাং টাইলসের জন্য আপনার আসলে কী প্রয়োজন তা ভেবে দেখুন। 'মি আঁকতে আপনার কেবল একটি টেক্সচার প্রয়োজন, তবে আপনি প্রকৃত চিত্রটি পুনরাবৃত্তি করতে চান না কারণ প্রক্রিয়াগুলি বড়। আপনি কেবল একটি ইনট [,] বা একটি স্বাক্ষরবিহীন বাইট [,] করতে পারেন (আপনি যদি 255 টাইল টেক্সচারের বেশি আশা করেন না)। আপনাকে যা করতে হবে তা হ'ল এই ছোট অ্যারেগুলিকে পুনরাবৃত্তি করতে হবে এবং টেক্সচারটি আঁকার জন্য যদি একটি স্যুইচ বা বিবৃতি ব্যবহার করা হয়।

তাহলে আপনার আপডেট করার দরকার কী? ধরণ, স্বাস্থ্য এবং ক্ষতি যথেষ্ট বলে মনে হচ্ছে। এই সবগুলি বাইটে সংরক্ষণ করা যায়। তাহলে আপডেট লুপের জন্য কেন এমন কাঠামো তৈরি করবেন না:

struct TileUpdate
{
public byte health;
public byte type;
public byte damage;
}

আপনি টাইল আঁকার জন্য আসলে টাইপটি ব্যবহার করতে পারেন। সুতরাং আপনি স্ট্রাক্ট থেকে সেইটিকে (এটির নিজস্ব একটি অ্যারে তৈরি) আলাদা করতে পারেন যাতে আপনি ড্র লুপের অপ্রয়োজনীয় স্বাস্থ্য এবং ক্ষতির ক্ষেত্রগুলি নিয়ে পুনরাবৃত্তি করবেন না। উদ্দেশ্য আপডেট করার জন্য আপনার বিস্তৃত অঞ্চলটি বিবেচনা করা উচিত তবে ঠিক আপনার পর্দা যাতে গেমের জগত আরও প্রাণবন্ত বোধ করে (সত্তা পর্দার বাইরে অবস্থান পরিবর্তন করে) তবে জিনিসগুলি অঙ্কনের জন্য আপনার কেবল টাইলটি দৃশ্যমান হওয়া দরকার।

যদি আপনি উপরের কাঠামোটি রাখেন তবে এটিতে টাইল প্রতি 3 বাইট লাগে। সুতরাং সংরক্ষণ এবং মেমরি উদ্দেশ্যে এই আদর্শ। প্রসেসিং স্পিডের জন্য আপনি ইন্ট বা বাইট ব্যবহার করেন না, এমনকি আপনার যদি 64 বিট সিস্টেম থাকে তবে লম্বা ইনট ব্যবহার করা যায় না।


1
হ্যাঁ, পরে আমার ইঞ্জিনের পুনরাবৃত্তিগুলি এটি ব্যবহার করতে বিকশিত হয়েছিল। বেশিরভাগ ক্ষেত্রে মেমরির খরচ কমাতে এবং গতি বাড়াতে। বাইআরফ প্রকারগুলি বাইভাল স্ট্রাক্টগুলিতে ভরাট অ্যারের তুলনায় ধীরে ধীরে। তবুও এটি উত্তম যে আপনি এটি উত্তরে যুক্ত করেছেন।
উইলিয়াম মারিয়ার

1
হ্যাঁ এলোমেলো হয়ে কিছু র্যান্ডম অ্যালগরিদম খুঁজতে গিয়ে। তাত্ক্ষণিকভাবে আপনাকে খেয়াল করেছে যেখানে আপনার কোডে আপনার নিজস্ব টাইল শ্রেণি ব্যবহার করা হচ্ছে। এটি যখন আপনার নতুন হয় তখন খুব সাধারণ ভুল। 2 বছর আগে আপনি এটি পোস্ট করার পরেও আপনি এখনও সক্রিয় রয়েছেন দেখে ভাল লাগছে।
ম্যাডমিনিও

3
আপনার প্রয়োজন হয় না healthবা damage। আপনি সর্বাধিক-নির্বাচিত টাইলের অবস্থান এবং প্রতিটিটির ক্ষতির একটি ছোট বাফার রাখতে পারেন। যদি কোনও নতুন টাইল বাছাই করা হয় এবং বাফার পূর্ণ হয় তবে নতুনটি যুক্ত করার আগে এটি থেকে প্রাচীনতম স্থানটি রোল করুন। এটি একবারে আপনি কত টাইল খনন করতে পারেন তা সীমাবদ্ধ করে তবে যাইহোক এটির একটি অন্তর্নিহিত সীমা রয়েছে (মোটামুটি #players * pick_tile_size)। যদি এটিকে আরও সহজ করে তোলে আপনি প্রতি প্লেয়ারটিকে এই তালিকাটি রাখতে পারেন। সাইজ করে গতির জন্য ব্যাপার; ছোট আকারের অর্থ প্রতিটি সিপিইউ ক্যাচলিনে আরও টাইলস।
শান মিডলডিচ

পছন্দ করুন পয়েন্টটি হ'ল থামানো এবং ভেবেছিলেন আপনার আসলে স্ক্রিনে টাইলগুলি আঁকতে এবং আপনার গণনাগুলি করার দরকার। যেহেতু ওপি একটি সম্পূর্ণ ক্লাস ব্যবহার করছিল আমি একটি সাধারণ উদাহরণ তৈরি করেছি, সহজ একটি শেখার অগ্রগতিতে অনেক এগিয়ে যায়। এখন আমার বিষয়টিকে পিক্সেল ঘনত্বের জন্য আনলক করুন দয়া করে আপনি অবশ্যই কোনও প্রোগ্রামার একজন সিজি শিল্পীর চোখ দিয়ে এই প্রশ্নটি দেখার চেষ্টা করছেন। যেহেতু এই সাইটটি গেমস আফিকের জন্যও সিজি এর জন্য।
ম্যাডমিনিও

2

আপনি ব্যবহার করতে পারেন এমন বিভিন্ন এনকোডিং কৌশল রয়েছে।

আরএলই: সুতরাং আপনি একটি স্থানাঙ্ক (x, y) দিয়ে শুরু করুন এবং তারপরে একটি অক্ষের একপাশে একই টাইলের কতগুলি পাশাপাশি পাশাপাশি (দৈর্ঘ্য) উপস্থিত রয়েছে তা গণনা করুন। উদাহরণ: (1,1,10,5) এর অর্থ হ'ল 1,1 স্থানাঙ্ক থেকে শুরু করে সেখানে টাইল 5 প্রকারের পাশাপাশি 10 টি টাইল রয়েছে।

বিশাল অ্যারে (বিটম্যাপ): অ্যারের প্রতিটি উপাদান সেই টাইলের ধরণ ধরে যা ওই অঞ্চলে থাকে।

সম্পাদনা: আমি এই চমত্কার প্রশ্নটি এখানে এসেছি: মানচিত্র উত্পন্ন করার জন্য এলোমেলো বীজ ফাংশন?

পার্লিন শোনার জেনারেটরটি একটি ভাল উত্তরের মতো দেখাচ্ছে।


আমি সত্যিই নিশ্চিত নই যে আপনি যে প্রশ্নটি জিজ্ঞাসা করছেন তার উত্তর দিচ্ছেন, যেহেতু আপনি এনকোডিং (এবং পার্লিন শব্দ) এর কথা বলছেন, এবং প্রশ্নটি কার্য সম্পাদনের সমস্যাগুলির সাথে মোকাবিলা করছে বলে মনে হচ্ছে।
থাইডিয়ান

1
যথাযথ এনকোডিং (যেমন পার্লিন শব্দ) ব্যবহার করে আপনি একবারে সেই সমস্ত টাইলস একবারে মেমোরিতে রাখার বিষয়ে চিন্তা করতে পারবেন না ... পরিবর্তে আপনি কেবল আপনার এনকোডার (শব্দ শব্দ জেনারেটর) কে কোনও নির্দিষ্ট স্থানাঙ্কে উপস্থিত হওয়ার কথা বলে তা বলতে বলুন। সিপিইউ চক্র এবং মেমরির ব্যবহারের মধ্যে এখানে একটি ভারসাম্য রয়েছে এবং একটি শোনার জেনারেটর সেই ভারসাম্য আইনে সহায়তা করতে পারে।
স্যাম অক্স

2
এখানে সমস্যাটি হ'ল আপনি যদি এমন একটি গেম তৈরি করেন যা ব্যবহারকারীদের কোনওভাবে এই অঞ্চলটি সংশোধন করতে দেয়, কেবল কোনও শব্দ জেনারেটর ব্যবহার করে "স্টোর" রাখতে তথ্য কার্যকর হয় না। বেশিরভাগ, এনকোডিংয়ের মতো কৌশলগুলি শোনানো উত্পাদন মোটামুটি ব্যয়বহুল। আপনি প্রকৃত গেমপ্লে স্টাফগুলির জন্য সিপিইউ চক্রগুলি সঞ্চয় করা ভাল (পদার্থবিজ্ঞান, সংঘর্ষ, আলো ইত্যাদি) পার্লিন শব্দটি ভূখণ্ড প্রজন্মের জন্য দুর্দান্ত, এবং ডিস্কে সংরক্ষণের জন্য এনকোডিং ভাল তবে এই ক্ষেত্রে স্মৃতি পরিচালনা করার আরও ভাল উপায় রয়েছে।
thedaian

খুব দুর্দান্ত ধারণা, তবে, দাদিয়ানের মতো, এই অঞ্চলটি ব্যবহারকারীর সাথে যোগাযোগ করা হয়েছে, যার অর্থ আমি গাণিতিকভাবে তথ্য পুনরুদ্ধার করতে পারি না। বেস অঞ্চলটি তৈরি করতে, আমি যাইহোক পার্লিন শব্দটি দেখব।
উইলিয়াম মারিয়ের 21

1

আপনার সম্ভবত সম্ভবত প্রস্তাবিত টাইলম্যাপটি পার্টিশন করা উচিত। উদাহরণস্বরূপ কোয়াড্ট্রি কাঠামোর সাথে কোনও সম্ভাব্য প্রক্রিয়াজাতকরণ (উদাহরণস্বরূপ এমনকি কেবল লুপিং) অপ্রয়োজনীয় (দৃষ্টি নয়) টাইলস থেকে মুক্তি পান। এইভাবে আপনি কেবলমাত্র প্রক্রিয়াজাতকরণের প্রয়োজন হতে পারে এবং ডেটাসেট (টাইল মানচিত্র) এর আকার বাড়ানো কোনও ব্যবহারিক কার্যকারিতা জরিমানার কারণ নয়। অবশ্যই, ধরে নিচ্ছি যে গাছটি ভাল সুষম।

আমি "পুরাতন" পুনরাবৃত্তি করে নিস্তেজ বা কিছু শুনতে চাই না, তবে অনুকূলিতকরণ করার সময়, সর্বদা আপনার সরঞ্জামচেন / সংকলক দ্বারা সমর্থিত অনুকূলিতকরণগুলি ব্যবহার করতে ভুলবেন না, আপনি তাদের সাথে কিছুটা পরীক্ষা করা উচিত। এবং হ্যাঁ, অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল। আপনার সংকলককে বিশ্বাস করুন, বেশিরভাগ ক্ষেত্রে এটি আপনার চেয়ে ভাল জানেন তবে সর্বদা, সর্বদাদু'বার পরিমাপ করুন এবং কখনও অনুমানের উপর নির্ভর করবেন না। যতক্ষণ না আপনি জানেন না যে আসল বাধা কোথায় তা দ্রুততম অ্যালগরিদমের দ্রুত প্রয়োগের বিষয়ে নয়। এজন্য আপনার কোডের স্লোথ (হট) পাথগুলি খুঁজে পেতে প্রোফাইলার ব্যবহার করা উচিত এবং সেগুলি মুছে ফেলার (বা অনুকূলকরণ) ফোকাস করা উচিত। হার্ড আর্কিটেকচারের নিম্ন-স্তরের জ্ঞান প্রায়শই হার্ডওয়্যারের দেওয়া সমস্ত কিছু বার করার জন্য প্রয়োজনীয়, সুতরাং সেই সিপিইউ ক্যাশেগুলি অধ্যয়ন করুন এবং একটি শাখার ভবিষ্যদ্বাণী কী তা শিখুন। আপনার প্রোফাইলর আপনাকে ক্যাশে / শাখার হিট / মিসগুলি সম্পর্কে কী বলে তা দেখুন। এবং গাছের উপাত্তের কাঠামোর কিছু ফর্ম ব্যবহার করে দেখা যায়, অন্যান্য উপায়ের চেয়ে বুদ্ধিমান ডেটা স্ট্রাকচার এবং বোবা অ্যালগরিদম থাকা ভাল। কর্মক্ষমতা আসে যখন তথ্য প্রথম আসে। :)


"অকালীন অপটিমাইজেশন সমস্ত অশুভের মূল" এর জন্য +1 আমি এর জন্য দোষী :(
থাইডিয়ান

16
-1 একটি চতুর্ভুজ? ওভারকিল কিছুটা? সমস্ত টাইলস যখন 2 ডি গেমের মতো একই আকারে থাকে (যা তারা টেরিয়ারিয়ার জন্য হয়) তখন স্ক্রিনে কোন টাইলের রেঞ্জ রয়েছে তা নির্ধারণ করা খুব সহজ - এটি কেবল উপরের-বামদিকের (স্ক্রিনে) থেকে নিম্ন-ডানদিকে টাইলস
ব্লুরাজা - ড্যানি পিফ্লুঘিওফ্ট

1

সব কি খুব বেশি ড্র কল সম্পর্কে নয়? যদি আপনি আপনার সমস্ত মানচিত্রের টাইল টেক্সচারগুলি একক চিত্র - টাইল এ্যাটলাসে রাখেন তবে রেন্ডারিংয়ের সময় কোনও টেক্সচার স্যুইচিং হবে না। এবং আপনি যদি আপনার সমস্ত টাইলসকে একটি একক জালের সাথে ব্যাচ করেন তবে এটি একটি ড্র কলটিতে আঁকতে হবে।

গতিশীল বিজ্ঞাপন সম্পর্কে ... কোয়াড ট্রি সম্ভবত খারাপ ধারণা নয়। ধরে নিচ্ছি যে পাতাতে টাইলস স্থাপন করা হচ্ছে এবং পাতাগুলিহীন নোডগুলি কেবল তার বাচ্চাদের কাছ থেকে জালযুক্ত জালযুক্ত মিশ্রণে রয়েছে, মূলটি সমস্ত টাইলকে একটি জাল দিয়ে আবদ্ধ থাকতে হবে। একটি টাইল অপসারণ করতে মূল পর্যন্ত নোড আপডেট (জাল পুনরায় পাঠানো) দরকার। তবে প্রতিটি গাছের স্তরে জাল রিবেচড ওয়াচের মধ্যে কেবল 1/4 তম পরিমাণ থাকা উচিত নয়, 4 * গাছ_উচ্চ উচ্চতা জালটিতে যোগ দেয়?

ওহ এবং আপনি যদি ক্লিপিং অ্যালগরিদমে এই গাছটি ব্যবহার করেন তবে আপনি সর্বদা রুট নোড নয় এর কয়েকটি বাচ্চাদের রেন্ডার করতে পারেন, সুতরাং আপনাকে সমস্ত নোডকে রুট পর্যন্ত আপডেট / পুনরায় পাঠাতে হবে না, তবে আপনি (নন-লিফ) নোড পর্যন্ত মুহুর্তে রেন্ডারিং।

কেবল আমার চিন্তাভাবনা, কোনও কোড নেই, এটির বোকামি হতে পারে।


0

@ আগমন ঠিক আছে। সমস্যাটি হচ্ছে ড্র কোড। আপনি প্রতি ফ্রেমে 4 * 3000 + ড্র কোয়াড কমান্ড (24000+ অঙ্কন বহুভুজ কমান্ড) এর একটি অ্যারে বিল্ডিংয়ে রয়েছেন । তারপরে এই কমান্ডগুলি প্রক্রিয়া করে জিপিইউতে পাইপ করা হয়। এটা বরং খারাপ।

কিছু সমাধান আছে।

  • স্টাইলের টেক্সচারে টাইলগুলির বড় ব্লকগুলি (উদাহরণস্বরূপ, স্ক্রিনের আকার) রেন্ডার করুন এবং এটি একটি একক কল এ আঁকুন।
  • জিপিইউতে প্রতিটি ফ্রেমে জ্যামিতি না পাঠিয়ে টাইলস আঁকার জন্য শেডারগুলি ব্যবহার করুন (যেমনটি জিপিইউতে টাইল মানচিত্র সংরক্ষণ করুন)।

0

আপনার যা করা দরকার তা হল বিশ্বের অঞ্চলগুলিতে বিভক্ত। পার্লিন শব্দদণ্ডের ভূখণ্ডের প্রজন্ম একটি সাধারণ বীজ ব্যবহার করতে পারে, যাতে পৃথিবীটি পূর্বসূরিত না হওয়া সত্ত্বেও, বীজ শব্দের অ্যালগোয়ের একটি অংশ তৈরি করে, যা বিদ্যমান অংশগুলিতে সুন্দরভাবে নতুন ভূখণ্ডকে seams করে। এইভাবে, আপনাকে একবারে খেলোয়াড়দের দেখার আগে (বর্তমানের কয়েকটি পর্দা) ছোট বাফারের চেয়ে বেশি গণনা করতে হবে না।

খেলোয়াড়দের বর্তমান স্ক্রীন থেকে অনেক দূরে অঞ্চলে উদ্ভিদ বাড়ানোর মতো বিষয়গুলি হ্যান্ডল করার ক্ষেত্রে উদাহরণস্বরূপ আপনার টাইমার থাকতে পারে। এই টাইমারগুলি ফাইলগুলি উদ্ভিদের তথ্য, তাদের অবস্থান ইত্যাদি সম্পর্কিত তথ্য সংরক্ষণের মাধ্যমে পুনরাবৃত্তি করবে আপনার টাইমারগুলিতে কেবল ফাইলগুলি পড়া / আপডেট / সংরক্ষণ করতে হবে। প্লেয়ারটি যখন আবার পৃথিবীর reaches অংশে পৌঁছে, ইঞ্জিনটি ফাইলগুলি স্বাভাবিক হিসাবে পড়ত এবং নতুন উদ্ভিদের ডেটা স্ক্রিনে উপস্থাপন করত।

আমি এই কৌশলটি ফসল কাটা ও কৃষিকাজের জন্য গত বছর আমার অনুরূপ খেলায় ব্যবহার করেছি। খেলোয়াড় মাঠ থেকে অনেক দূরে হাঁটতে পারে এবং ফিরে আসার পরে আইটেমগুলি আপডেট করা হয়েছিল।


-2

আমি কীভাবে এতটা কোটি কোটি ব্লক পরিচালনা করব তা নিয়ে ভাবছিলাম এবং আমার মাথায় আসে কেবল ফ্লাইওয়েট ডিজাইনের প্যাটার্ন। যদি আপনি না জানেন তবে আমি গভীরভাবে এ সম্পর্কে পড়ার পরামর্শ দিচ্ছি: স্মৃতি সংরক্ষণ এবং প্রক্রিয়াজাতকরণের ক্ষেত্রে এটি অনেকখানি সহায়তা করতে পারে: http://en.wikedia.org/wiki/ ফ্লাইওয়েট_প্যাটার্ন


3
-1 এই উত্তরটি দরকারী হিসাবে খুব সাধারণ, এবং আপনার সরবরাহিত লিঙ্কটি এই বিশেষ সমস্যাটিকে সরাসরি সমাধান করে না। ফ্লাইওয়েট প্যাটার্ন হ'ল দক্ষতার সাথে বড় ডেটা সেটগুলি পরিচালনা করার বিভিন্ন উপায়; টেরিয়ারিয়ার মতো গেমটিতে টাইলস সংরক্ষণের নির্দিষ্ট প্রসঙ্গে আপনি কীভাবে এই প্যাটার্নটি প্রয়োগ করবেন তা আপনি কী ব্যাখ্যা করতে পারেন?
পোস্টগুডিজম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.