সর্বোচ্চ ৩০ টি অবজেক্টের সাথে, ফ্রেমের প্রতি একাধিকবার একে অপরের বিরুদ্ধে একই দুটি জোড়া যাচাই না করা ছাড়া আপনার অন্য কোনওটিতে খুব বেশি অপ্টিমাইজেশনের প্রয়োজন হবে না। যা নীচের কোড নমুনা কভার করবে। তবে যদি আপনি বিভিন্ন অপ্টিমাইজেশনে আকর্ষণীয় হন যা কোনও পদার্থ বিজ্ঞান ইঞ্জিন ব্যবহার করবে তবে এই পোস্টের বাকি অংশে পড়া চালিয়ে যান।
আপনার যা প্রয়োজন তা হ'ল একটি স্থানিক বিভাজন বাস্তবায়ন, যেমন অক্ট্রি (3 ডি গেমসের জন্য) বা কোয়াড্ট্রি (2 ডি গেমসের জন্য)। এইগুলি বিশ্বকে উপ-বিভাগে বিভক্ত করে, এবং তারপরে প্রতিটি উপ-বিভাগকে আরও একই অংশে ভাগ করা হয় যতক্ষণ না তারা একটি সর্বনিম্ন আকারে বিভক্ত হয়। এটি আপনাকে খুব তাড়াতাড়ি যাচাই করতে দেয় যে পৃথিবীর একই অঞ্চলে অন্য কোন অবজেক্টগুলি অন্য হিসাবে রয়েছে, যা আপনাকে যে ধরণের সংঘর্ষের বিরুদ্ধে পরীক্ষা করতে হবে তা সীমাবদ্ধ করে।
স্থানিক বিভাজন ছাড়াও আমি আপনার প্রতিটি পদার্থবিজ্ঞানের বস্তুর জন্য একটি এএবিবি ( অক্ষ- প্রান্তযুক্ত বাউন্ডিং বাক্স ) তৈরি করার পরামর্শ দেব । এটি আপনাকে অন্য একটি সামগ্রীর AABB চেক করতে দেয়, যা বস্তুর মধ্যে বিশদ প্রতি পলি চেকের চেয়ে অনেক দ্রুত is
জটিল বা বড় পদার্থবিজ্ঞানের জন্য এটি আরও একটি পদক্ষেপ নেওয়া যেতে পারে, যেখানে আপনি পদার্থবিজ্ঞানের জাল নিজেই উপ-বিভক্ত করতে পারেন, প্রতিটি উপ-আকারকে তার নিজস্ব এএবিবি দেয় যা আপনি কেবল দুটি বস্তুর এএবিবি ওভারল্যাপিং করলেই তার বিরুদ্ধে পরীক্ষা করতে পারেন।
বেশিরভাগ পদার্থবিজ্ঞানের ইঞ্জিনগুলি বিশ্রামে আসার পরে পদার্থবিদ্যার সংস্থাগুলিতে সক্রিয় পদার্থবিজ্ঞানের সিমুলেশন নিষ্ক্রিয় করবে। যখন পদার্থবিদ্যার বডিটি নিষ্ক্রিয় করা হয়, তখন প্রতিটি ফ্রেমের জন্য এটির কেবলমাত্র এএএবিবির সাথে সংঘর্ষের জন্য পরীক্ষা করা প্রয়োজন এবং যদি এএবিবির সাথে কোনও সংঘর্ষ ঘটে তবে তা আবার সক্রিয় হবে এবং আরও দানাদার সংঘর্ষের চেক করবে। এটি সিমুলেশন বার ডাউন রাখে।
এছাড়াও, অনেক পদার্থবিজ্ঞানের ইঞ্জিনগুলি 'সিমুলেশন দ্বীপপুঞ্জ' ব্যবহার করে, যেখানে পদার্থবিদ্যার সংস্থাগুলির একটি গ্রুপ একত্রে একত্রে একত্রিত হয়। সিমুলেশন দ্বীপের সবকিছু যদি বিশ্রামে থাকে তবে সিমুলেশন দ্বীপ নিজেই ডিএ্যাকটিভস। সিমুলেশন দ্বীপের সুবিধা হ'ল একবার দ্বীপটি নিষ্ক্রিয় হয়ে যাওয়ার পরে এর অভ্যন্তরের সমস্ত দেহ সংঘর্ষের জন্য চেক করা বন্ধ করতে পারে এবং প্রতিটি ফ্রেমের একমাত্র চেকটি দ্বীপের এএবিবিতে প্রবেশ করেছে কিনা তা দেখতে হবে। কেবল একবার দ্বীপের এএবিবিতে প্রবেশ করার পরে দ্বীপের প্রতিটি দেহের সংঘর্ষের জন্য পরীক্ষা করা দরকার। সিমুলেশন দ্বীপটি আবার সক্রিয় হয় যদি এর ভিতরে কোনও দেহ নিজে থেকে আবার চলা শুরু করে। গ্রুপের কেন্দ্র থেকে যদি কোনও দেহ যথেষ্ট পরিমাণে সরে যায় তবে এটি দ্বীপ থেকে সরানো হবে।
শেষ অবধি আপনি এই জাতীয় কিছু রেখেছেন (সিউডো-কোডে):
// Go through each leaf node in the octree. This could be more efficient
// by keeping a list of leaf nodes with objects in it.
for ( node in octreeLeafNodes )
{
// We only need to check for collision if more than one object
// or island is in the bounds of this octree node.
if ( node.numAABBsInBounds > 1)
{
for ( int i = 0; i < AABBNodes.size(); ++i )
{
// Using i+1 here allows us to skip duplicate checks between AABBS
// e.g (If there are 5 bodies, and i = 0, we only check i against
// indexes 1,2,3,4. Once i = 1, we only check i against indexes
// 2,3,4)
for ( int j = i + 1; j < AABBNodes.size(); ++j )
{
if ( AABBOverlaps( AABBNodes[i], AABBNodes[j] ) )
{
// If the AABB we checked against was a simulation island
// then we now check against the nodes in the simulation island
// Once you find overlaps between two actual object AABBs
// you can now check sub-nodes with each object, if you went
// that far in optimizing physics meshes.
{
}
}
}
}
আমি এটির মতো লুপগুলির মধ্যে এতগুলি লুপ না রাখারও সুপারিশ করব, উপরের নমুনাটি ঠিক আপনি ধারণাগুলি পেয়েছিলেন, আমি এটিকে একাধিক ফাংশনে বিভক্ত করব যা আপনাকে উপরের চিত্রের মতো কিছু কার্যকারিতা দেয়।
এছাড়াও, নিশ্চিত হয়ে নিন যে এএবিবিএনডস কনটেইনারটি লুপ করার সময় এটি পরিবর্তন করবেন না, কারণ এর অর্থ মিসড সংঘর্ষের চেকগুলি হতে পারে। এটি সাধারণ জ্ঞানের মতো শোনাতে পারে তবে আপনি অবাক হবেন যে সংঘর্ষে প্রতিক্রিয়াযুক্ত জিনিসগুলি আপনি যেটি প্রত্যাশা করেননি এমন কারণগুলির প্রতিক্রিয়া দেখানো কত সহজ। উদাহরণস্বরূপ, যদি কোনও সংঘর্ষের কারণে কোনও সংঘর্ষকারী বস্তুর কোনও একটিকে তার অবস্থান পরিবর্তন করতে পর্যাপ্ত অবস্থান পরিবর্তন করতে পারে যার দ্বারা আপনি যাচাই করছেন reeত্রী নোডের এএবিবি থেকে সরিয়ে ফেলা যায় তবে এটি সেই ধারকটিকে পরিবর্তন করতে পারে। এটি সমাধানের জন্য আমি চেক চলাকালীন ঘটে যাওয়া সমস্ত সংঘর্ষের ইভেন্টগুলির একটি তালিকা রাখার পরামর্শ দিচ্ছি এবং তারপরে সমস্ত চেক তালিকাটির মাধ্যমে পুরোপুরি চালানো হবে এবং কোনও সংঘর্ষের ঘটনা প্রেরণ করব।