দ্রুত 2 ডি সংঘর্ষ সনাক্তকরণ


13

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

Enemy class update method
    Loop through all enemies (continue; if the loop points at this object)
        If enemy object intersects with this object
            Push enemy object away from this enemy object

এটি কাজ করে। যতক্ষণ না আমার কাছে কেবলমাত্র 200 শত্রু সত্তা রয়েছে। আমি যখন 300-350 শত্রু সংস্থাগুলির কাছাকাছি পৌঁছে যাই তখন আমার ফ্রেমের হার খুব কমতে শুরু করে। প্রথমে আমি ভেবেছিলাম এটি খারাপ উপস্থাপনা ছিল তাই আমি তাদের ড্র কলটি সরিয়েছি। এটি মোটেও সহায়তা করেনি অবশ্যই আমি বুঝতে পারি এটি আপডেট পদ্ধতি update তাদের আপডেট পদ্ধতির একমাত্র ভারী অংশটি হ'ল এটি প্রতিটি শত্রু-লুপ-থ্রু-প্রতি-শত্রু অংশ। আমি যখন 300 শত্রুদের কাছাকাছি পৌঁছে যাই গেমটি 90000 (300x300) পদক্ষেপের পরিবর্তন করে। আমার আমার ~

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

TL; ড? সত্তার প্রচুর সংস্থার মধ্যে সংঘর্ষ সনাক্তকরণকে আমি কীভাবে অগ্রাহ্য করব?

দ্রুত সম্পাদনা: যদি এটি কোনও সহায়তার জন্য হয় তবে আমি সি # এক্সএনএ ব্যবহার করছি।


আমি ভাবছি যে আপনি প্রথম স্থানটিতে 90 কে যেতে কীভাবে পেয়েছেন? 20K এ আমার chokes (আমি যদিও পুরো স্যাট এমটিভি সনাক্তকরণ করছি)। তবে আমি সমস্ত শত্রুদের মধ্য থেকে লুপিং করা সম্ভব বলে মনে হয়। তবে আপনাকে যা করা দরকার তা হ'ল সেগুলি ইতিমধ্যে চেক করা হয়েছে কিনা তা যাচাই করা উচিত, কারণ আপনি যদি বলেন তার মতো করে থাকেন তবে প্রত্যেকের সাথে দু'বার পরীক্ষা করা হচ্ছে।
বিভ্রান্তিকর যুক্তি


প্রশ্নটিতে খুব ভাল উত্তর রয়েছে যা @ মার্কসভনবারডির সাথে সংযুক্ত করেছে।
সাইফার

উত্তর:


11

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

আমি সাধারণত সিস্টেমগুলির জন্য তিনটি সংগ্রহ করি। এবং যখন আপনি সত্তার সংখ্যার কথা বলছেন তখন আপনি ট্র্যাকিংয়ের ডেটা (প্রতিটি অন্যান্য সত্তার জন্য প্রবেশের সাথে সত্তা অনুসারে 3 টি তালিকা) খুব দ্রুত বেরিয়ে আসতে পারে বলে এর জন্য আপনাকে একটি সম্পূর্ণ প্রস্ফুটিত দৃশ্যের গ্রাফ নিয়ে যেতে হবে have নিয়ন্ত্রণ

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

পরের তালিকাটি এমন একটি বাফার পরিসরে থাকবে যা প্রচুর পরিশ্রম করে সত্তার পরিসরে চলে যেতে পারে .. আমরা কেবল যুক্তি দেখানোর জন্য এই রেঞ্জটিকে এক্স * 1.5 বলেছি। এটি এমন একটি সময় কাটা তালিকা যেখানে আপনি কেবলমাত্র ফ্রেম প্রতি তাদের হাতে গোনা কয়েকটি আপডেট করবেন তবে নিশ্চিত করে নিন যে আপনি সহজেই কাজ করার উপস্থাপনাগুলি বজায় রাখতে পর্যাপ্ত পরিমাণে তাদের মধ্য দিয়ে যাচ্ছেন।

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

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

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

আশাকরি এটা সাহায্য করবে.


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

@ ভিনসেন্টপিল একটি চতুষ্কোণ গাছের চেয়ে দৃশ্যের গ্রাফ আর জটিল নয়।
সাইফার

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

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

6

আপনি বাছাই করা ডেটা স্ট্রাকচারের সাথে সংঘর্ষগুলি পরিচালনা করতে হবে, যাতে আপনার ভয়ঙ্কর এন ^ 2 এর পরিবর্তে এন * লগ (এন) বার থাকতে পারে। এবং এন * লগ (এন) প্রায় রৈখিক হিসাবে আপনি জানেন। এর একটি (শাস্ত্রীয়) উদাহরণ একটি চতুষ্কোণ, এখানে গ্রাফিক্স এবং কোড (জাভা) সহ একটি বেশ সহজ এবং ভাল লিখিত টিউটোরিয়াল রয়েছে:

http://gamedev.tutsplus.com/tutorials/implementation/quick-tip-use-quadtrees-to-detect-likely-collisions-in-2d-space/

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


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

0

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


3
এটি মন্তব্য করা আরও মানানসই। আপনার উত্তরে আরও যুক্ত করার বিষয়টি বিবেচনা করুন।

0

কোয়াড বা অষ্ট গাছ সম্পর্কে যখন কথা হয় তখন আমি বেশ নির্বোধ। তবে আমি মনে করি যে এই পদ্ধতিটি করা উচিত:

আপনাকে প্লেয়ারের কাঠামো / শ্রেণিটি পরিবর্তন করতে হবে। অন্যান্য খেলোয়াড়ের কাঠামোর সাথে পয়েন্টারের একটি অ্যারে / ভেক্টর যুক্ত করুন।

প্রতি দুই খেলোয়াড়ের মধ্যে প্রতি দ্বিতীয় চেক দূরত্ব distance যদি এটি এত কম হয় যে 1 সেকেন্ডের মধ্যে পৌঁছানো সম্ভব হয় তবে সেই খেলোয়াড়ের পয়েন্টারটিকে বর্তমান প্লেয়ারের সংঘর্ষের অ্যারেতে যুক্ত করুন।

এখন কেবল একে অপরের তালিকার খেলোয়াড়দের মধ্যে সংঘর্ষ পরীক্ষা করুন।

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