সম্পূর্ণ গতিশীল কেডি-ট্রি বনাম কোয়াডট্রি?


11

আমার গেমটি নিয়ে কাজ করে, আমি সেই স্থানে রয়েছি যেখানে আমার বিশ্বের সমস্ত ইউনিট ট্র্যাক করা দরকার যাতে আমি লড়াইয়ের জন্য নিকটতম-প্রতিবেশী চেক করতে পারি। এটি একটি আরটিএস-এর মতো খেলা, সম্ভাব্য হাজার হাজার ছোট অটোমেটেড ইউনিট চারদিকে ঘুরে।

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

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

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

উত্তর:


12

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

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

তাহলে কিন্তু আপনি শুধুমাত্র একটি ধ্রুবক ব্যাসার্ধ মধ্যে সব ইউনিট খোঁজার করতে আগ্রহী হন , আপনাকে সরাসরি quadtree এবং KD-ট্রি প্রয়োজন হবে না। আপনি কেবল দৈর্ঘ্যের আর পাশের কক্ষের একটি 2D অ্যারে তৈরি করতে পারেন এবং প্রতিটি ইউনিটে তাদের ইউনিটগুলি তাদের অবস্থান অনুসারে স্ট্যাক করতে পারেন। এইভাবে, অনুসন্ধান করার জন্য আপনার কাছে সর্বদা খারাপ 9 টি কক্ষ রয়েছে। কেবলমাত্র যদি আপনার মানচিত্র বিশাল হয় তবে এই জাতীয় গ্রিডটি প্রয়োগ করা খুব বড় be

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

স্থানীয় সংবেদনশীল হ্যাশ টেবিলগুলি কেবল দক্ষতার সাথে আনুমানিক সমাধান দেয় তাই আমি তাদের নিয়ে বিরক্ত করব না।

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


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

4

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

বক্স 2 ডি উত্স কোডটিতে এটির দুর্দান্ত প্রয়োগ রয়েছে।

https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Collision/b2DynamicTree.h

তাদের প্রয়োগের জন্য এখানে একটি ভাল পর্যালোচনা দেওয়া হয়েছে:

http://www.randygaul.net/2013/08/06/dynamic-aabb-tree/


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

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