কীভাবে ধারাবাহিকভাবে সমস্ত সত্তাকে দক্ষতার সাথে আবিষ্কার করতে?


14

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

প্রদত্ত সীমাবদ্ধতাগুলি সহ গড়ে অন্য যে কোনও ইউনিটের কাছে মোট ইউনিট গণনার 1% থাকবে।

হস্তক্ষেপ না করে আমি কীভাবে দক্ষতার সাথে এটি করতে পারি?


7
আপনি কিছু ধরণের স্পেসিয়াল পার্টিশন সিস্টেম চাইবেন: en.wikedia.org/wiki/Space_partitioning
তেত্রাদ

উত্তর:


15

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

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

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

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

ধরা যাক এক্সজেড বিমানে আপনার বিশ্ব (-1000, -1000) থেকে (1000, 1000) পর্যন্ত রয়েছে। আপনি উদাহরণস্বরূপ এটিকে 10x10 গ্রিডে ভাগ করতে পারেন:

var grid = new List<Entity>[10, 10];

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

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

সম্পাদনা এটি অন্য ফোরামে পাওয়া গেছে এবং এটি আপনাকে সিদ্ধান্তে সহায়তা করতে পারে:

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

সমস্যার আপনার অস্পষ্ট বর্ণনা দিয়ে আমি গ্রিড সমাধানের বিরুদ্ধেও ঝুঁকছি (যা ধরে নিচ্ছি যে ইউনিটগুলি ছোট এবং মোটামুটিভাবে বিতরণ করা হয়েছে)।


বিস্তারিত উত্তরের জন্য ধন্যবাদ। হ্যাঁ, এটি সহজ গ্রিড সমাধান আমার পক্ষে যথেষ্ট ভাল বলে মনে হচ্ছে।
ওসিরিল

0

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

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


0

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

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

প্রথম: 2 ডি বাউন্ডিং বক্স ক্লিপ।

// returns true if the circle supplied is completely OUTSIDE the bounding box, rectClip
bool canTrivialRejectCircle(Vertex2D& vCentre, WorldUnit radius, Rect& rectClip) {
  if (vCentre.x + radius < rectClip.l ||
    vCentre.x - radius > rectClip.r ||
    vCentre.y + radius < rectClip.b ||
    vCentre.y - radius > rectClip.t)
    return true;
  else
    return false;
}

এই জাতীয় (3 ডি) এর সাথে তুলনা করুন:

BOOL bSphereTest(CObject3D* obj1, CObject3D* obj2 )
{
  D3DVECTOR relPos = obj1->prPosition - obj2->prPosition;
  float dist = relPos.x * relPos.x + relPos.y * relPos.y + relPos.z * relPos.z;
  float minDist = obj1->fRadius + obj2->fRadius;
  return dist <= minDist * minDist;
}.

যদি বিষয়টিকে তুচ্ছভাবে প্রত্যাখ্যান করা না হয় তবে আপনি আরও ব্যয়বহুল এবং সঠিক সংঘর্ষের পরীক্ষা করেন। তবে আপনি কেবল নিকটস্থের সন্ধান করছেন যাতে গোলক পরীক্ষাটি এর জন্য উপযুক্ত তবে কেবলমাত্র 1% অবজেক্টের জন্য যা তুচ্ছ অস্বীকৃতি থেকে বেঁচে থাকে।

এই নিবন্ধটি তুচ্ছ রিজেক্টের জন্য বাক্সটিকে সমর্থন করে। http://www.h3xed.com/programming/bounding-box-vs-bounding-circle-collision-detection-performance-as3

যদি এই রৈখিক পদ্ধতির আপনার প্রয়োজনীয় পারফরম্যান্সটি না দেয় তবে অন্যান্য পোস্টারগুলির মতো কথা বলা হয়েছে এমন একটি শ্রেণিবিন্যাসের ডেটা কাঠামোর প্রয়োজন হতে পারে। আর-ট্রিগুলি বিবেচনা করার মতো। তারা গতিশীল পরিবর্তনগুলি সমর্থন করে। তারা স্থানিক বিশ্বের BTree হয়।

আমি কেবল চাইনি যে আপনি যদি এড়াতে পারতেন তবে এই জাতীয় জটিলতার পরিচয় দেওয়ার সমস্ত সমস্যার দিকে যান। এছাড়াও বস্তুগুলি প্রতি সেকেন্ডে কয়েকবার ঘুরতে যাওয়ার সাথে সাথে এই জটিল ডেটা স্ট্রূচারটি টু ডেট রাখার ব্যয় কী?

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


1
ওপি স্পষ্টভাবে বলেছে যে তিনি একটি নিষ্ঠুর বলের পদ্ধতির এড়াতে চান, যা আপনার প্রথম অনুচ্ছেদে বর্ণিত ঠিক এটি। এছাড়াও, আপনি কীভাবে একটি বাউন্ডিং বক্স চেকটি একটি বাউন্ডিং গোলক চেকের তুলনায় সস্তা ব্যয় করতে পারেন?! এটা ঠিক ভুল।
notlesh

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

জিডিনেটের লিঙ্কটি ভাঙ্গা হয়েছে, তবে প্রচলিত গোলকের পরীক্ষাটি খুব সহজ, খুব সস্তা এবং শাখা করে না:inside = (dot(p-p0, p-p0) <= r*r)
লার্স ভিক্লুন্ড

পরিবর্তে আমি উপরে কোডটি পেস্ট করেছি। এটি সীমানা বাক্সের তুলনায় সস্তা ব্যতীত অন্য কিছুই দেখাচ্ছে।
Ciaran

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

0

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

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

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


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