কোয়াড ট্রি বনাম গ্রিড ভিত্তিক সংঘর্ষ সনাক্তকরণ


27

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

এক অন্য চেয়ে ভাল ? না আরও মার্জিত? আমার কোনটি ব্যবহার করা উচিত তা আমি সত্যই নিশ্চিত নই।

কোন পরামর্শ স্বাগত। ধন্যবাদ।

উত্তর:


31

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

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

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

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

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

foreach actor in actorList:
    foreach target in actorList:
        if (actor != target) and actor.boundingbox intersects target.boundingbox:
            actor.doCollision(target)

এটি স্পষ্টতই ও (এন ^ 2) এর কাছাকাছি পারফরম্যান্স সহ, যেখানে বর্তমানে বুলেট এবং স্পেসশিপ এবং এলিয়েন সহ গেমটিতে জীবিত অভিনেতাদের সংখ্যা রয়েছে। এটি ছোট স্থিতিশীল বাধাও অন্তর্ভুক্ত করতে পারে।

এটি এতক্ষণ দুর্দান্তভাবে কাজ করে যেহেতু এই জাতীয় আইটেমের সংখ্যা যুক্তিসঙ্গতভাবে ছোট, তবে কয়েক শতাধিক বস্তুর বিরুদ্ধে যখন পরীক্ষা করা দরকার তখন কিছুটা দরিদ্র দেখা শুরু করে। 10 টি বস্তুর ফলাফল 100 টি সংঘর্ষের চেকগুলিতে, 10,000 টি চেকের 100 ফলাফল। এক মিলিয়ন চেকে 1000 ফলাফল results

একটি স্থানিক সূচক (চতুর্ভুজগুলির মতো) জ্যামিতিক সম্পর্ক অনুসারে সংগ্রহ করা আইটেমগুলিকে দক্ষতার সাথে গণনা করতে পারে। এটি সংঘর্ষের অ্যালগরিদমকে এমন কিছুতে পরিবর্তন করবে:

foreach actor in actorList:
    foreach target in actorIndex.neighbors(actor.boundingbox):
       if (actor != target) and actor.boundingbox intersects target.boundingbox:
            actor.doCollision(target)

এর দক্ষতা (সত্তাগুলির অভিন্ন বন্টন ধরে নেওয়া): সাধারণত ও (এন ^ 1.5 লগ (এন)) হয়, যেহেতু সূচকটি লগ (এন) এর সাথে তুলনা করার জন্য নেয়, তাই স্কয়ার (এন) প্রতিবেশীদের তুলনা করতে হবে , এবং চেক করার জন্য এন অভিনেতা আছে। বাস্তবে, যদিও প্রতিবেশীর সংখ্যা সর্বদা যথেষ্ট সীমাবদ্ধ, যেহেতু যদি কোনও সংঘর্ষ ঘটে তবে বেশিরভাগ সময় কোনও একটি বস্তু মুছে ফেলা হয় বা সংঘর্ষ থেকে দূরে সরে যায়। এইভাবে আপনি কেবল ও (এন লগ (এন)) পান। 10 টি সত্তার জন্য, আপনি প্রায় (10) তুলনা করেন, 100 এর জন্য, আপনি 200 করেন, 1000 এর জন্য আপনি 3000 করেন।

সত্যিকারের চালাক সূচক এমনকি প্রতিবেশী অনুসন্ধানকে বাল্ক পুনরাবৃত্তির সাথে একত্রিত করতে এবং প্রতিটি ছেদকারী সত্তায় কলব্যাক করতে পারে। এটি প্রায় ও (এন) এর একটি পারফরম্যান্স দেবে, যেহেতু সূচিটি এন বার বার জিজ্ঞাসার চেয়ে একবার স্ক্যান করা হচ্ছে।


আমি নিশ্চিত নই যে আপনি যখন "স্ট্যাটিক ব্যাকগ্রাউন্ড" বলবেন তখন আপনি কী উল্লেখ করছেন I আমি যা নিয়ে কাজ করছি তা মূলত একটি 2 ডি শ্যুটার, তাই এটি স্থান জাহাজ এবং এলিয়েন, বুলেট এবং দেয়ালের সাথে সংঘর্ষ সনাক্তকরণ।
ডটমিনিক

2
আপনি সবেমাত্র আমার ব্যক্তিগত "দুর্দান্ত উত্তর" ব্যাজটি অর্জন করেছেন!
ফেলিক্সিজ

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

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

এই সব বেশ বিভ্রান্তিকর! তথ্যের জন্য ধন্যবাদ
ডটমিনিক

3

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

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

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

struct Node
{
    int32_t next;
    ...
};

struct Grid
{
     vector<int32_t> cells;
     vector<Node> nodes;
};

তাই ভালো:

এখানে চিত্র বর্ণনা লিখুন

ঠিক আছে, তাই কনস যাও। আমি গ্রিডের প্রতি পক্ষপাত এবং অগ্রাধিকার সহ স্বীকার করে আসছি, তবে তাদের প্রধান অসুবিধাটি হ'ল তারা খুব কম নয়।

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

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

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

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.