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