একটি ও (এন ^ 2) ফাংশন উন্নতি করা (সমস্ত সত্তা অন্য সমস্ত সত্তার উপরে পুনরাবৃত্তি করে)


21

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

অতিরিক্তভাবে, গেমটি রিয়েল টাইমে চালানো হলে পারফরম্যান্স ভাল হয় (60fps কোনও সমস্যা নেই), তবে আমি কোনও উল্লেখযোগ্য পরিবর্তন দেখতে 4 ঘন্টা অপেক্ষা না করার জন্য এটিকে দ্রুতগতিতে সক্ষম করতে চাই to তাই আমি এটি যত তাড়াতাড়ি পেতে চাই।

আমি প্রাণীদের খাদ্য খুঁজে পেতে একটি কার্যকর পদ্ধতি খুঁজতে লড়াই করছি to প্রতিটি প্রাণীর কাছে তাদের কাছে খুব ভাল খাবারের সন্ধান করার কথা।

গেমের স্ক্রিনশট উদাহরণ

যদি এটি খেতে চায় তবে কেন্দ্রটিতে চিত্রিত প্রাণীটি নিজের চারপাশে একটি 149.64 ব্যাসার্ধের দিকে দৃষ্টিপাত করবে (এর দেখার দূরত্ব) এবং পুষ্টি, দূরত্ব এবং ধরণের (মাংস বা উদ্ভিদ) এর উপর ভিত্তি করে কোন খাবারটি গ্রহণ করা উচিত তা বিচার করবে ।

প্রতিটি প্রাণীকে তাদের খাবার সন্ধানের জন্য দায়ী ফাংশন রান-টাইমের প্রায় 70% খাচ্ছে। বর্তমানে এটি কীভাবে লিখিত হয়েছে সরলকরণ, এটি এরকম কিছু হয়:

for (creature : all_creatures)
{
  for (food : all_entities_with_food_value)
  {
    // if the food is within the creatures view and it's
    // the best food found yet, it becomes the best food
  }
  // set the best food as the target for creature
  // make the creature chase it (change its state)
}

এই ক্রিয়াকলাপটি প্রতিটি প্রাণীর জন্য খাদ্য সন্ধানের জন্য প্রতিটি টিক চালিত হয়, যতক্ষণ না প্রাণীটি খাদ্য আবিষ্কার করে এবং স্থিতি পরিবর্তন করে। এটি প্রত্যেকবারই নতুন খাবারের প্রাণীদের জন্য ইতিমধ্যে একটি নির্দিষ্ট খাবারের তাড়া করে চালানোর জন্য চালানো হয়, যাতে সকলেই তাদের জন্য সর্বোত্তম খাবার সরবরাহ করে available

এই প্রক্রিয়াটিকে আরও দক্ষ করে তুলতে কীভাবে আমি ধারণার জন্য উন্মুক্ত। আমি জটিলতাটি থেকে হ্রাস করতে পছন্দ করব তবে এটি এমনকি সম্ভব কিনা তা আমি জানি না।O(N2)

আমি ইতিমধ্যে এটির উন্নতি করার একটি উপায় all_entities_with_food_valueগ্রুপকে বাছাই করা যাতে কোনও প্রাণী যখন খাবারের জন্য খুব বড় খাবারের উপরে পুনরাবৃত্তি করে, এটি সেখানে থামে। অন্য কোন উন্নতি স্বাগত চেয়ে বেশি!

সম্পাদনা: জবাবের জন্য আপনাকে সবাইকে ধন্যবাদ! আমি বিভিন্ন উত্তর থেকে বিভিন্ন জিনিস বাস্তবায়িত করেছি:

আমি প্রথমত এবং সহজভাবে এটি তৈরি করেছিলাম যাতে দোষী ফাংশন প্রতি পাঁচটি টিকিটে একবার চালিত হয়, এটি গেমটি 4x-এর কাছাকাছি করে তোলে, যখন গেম সম্পর্কে দৃশ্যমানভাবে কোনও পরিবর্তন হয় না।

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

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

এখন রেন্ডারিং হ'ল যা আমার গতি কমিয়ে দিচ্ছে, তবে এটি অন্য দিনের সমস্যা। সবাইকে ধন্যবাদ!


2
আপনি একাধিক সিপিইউ কোর একসাথে চলতে একাধিক থ্রেড পরীক্ষা করেছেন?
এড মার্টি

6
আপনার গড়ে কত প্রাণী রয়েছে? স্ন্যাপশট থেকে বিচার করা এটি এতটা উঁচু বলে মনে হচ্ছে না। যদি সর্বদা এটি হয় তবে স্পেস পার্টিশনটি খুব বেশি সাহায্য করবে না। আপনি প্রতিটি টিক এই ফাংশন না চালিয়ে বিবেচনা করেছেন ? আপনি এটি চালাতে পারেন, বলুন, 10 টিকিট। সিমুলেশনের ফলাফলগুলি গুণগতভাবে পরিবর্তন করা উচিত নয়।
Turms

4
খাদ্য মূল্যায়নের সবচেয়ে ব্যয়বহুল অংশটি বের করার জন্য আপনি কোনও বিশদ প্রোফাইল লিখেছেন? সামগ্রিক জটিলতার দিকে তাকানোর পরিবর্তে, আপনাকে দেখার দরকার আছে এমন কোনও নির্দিষ্ট গণনা বা মেমরি কাঠামোর অ্যাক্সেস যা আপনাকে দম বন্ধ করছে।
হারাবেকে

একটি নিষ্পাপ পরামর্শ: আপনি এখন এটি করছেন O (N ^ 2) এর পরিবর্তে একটি চতুর্ভুজ বা সম্পর্কিত ডেটা স্ট্রাকচার ব্যবহার করতে পারেন।
সেয়ারিয়া

3
@ হারাবেকের পরামর্শ অনুসারে, লুপের মধ্যে সমস্ত সময় কোথায় ব্যয় হচ্ছে তা দেখতে আমি আরও গভীর খনন করব। যদি এটি দূরত্বের জন্য বর্গমূলের গণনা হয়, উদাহরণস্বরূপ, আপনি ব্যয়বহুল স্কয়ারটি বাকীগুলি করার আগে প্রথমে প্রচুর পরীক্ষার্থীদের প্রাক-নির্মূল করার জন্য এক্সওয়াই কর্ডগুলি তুলনা করতে সক্ষম হতে পারেন। যুক্ত if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;করা "জটিল" স্টোরেজ স্ট্রাকচার বাস্তবায়নের চেয়ে সহজ হওয়া উচিত যদি এটি যথেষ্ট পারফরম্যান্স করে। (সম্পর্কিত: আপনি যদি আপনার অভ্যন্তরীণ লুপে কোডের কিছুটা বেশি পোস্ট করেন তবে এটি আমাদের সহায়তা করতে পারে)
এসি

উত্তর:


34

আমি জানি আপনি এটিকে সংঘর্ষ হিসাবে ধারণাই করেন না, তবে আপনি যা করছেন তা সমস্ত খাদ্য সহ প্রাণীর কেন্দ্রিক একটি বৃত্তের সাথে সংঘর্ষ ঘটছে।

আপনি যে খাবারটি জানেন তা সত্যই আপনি দেখতে চান না কেবল কেবল নিকটবর্তী খাবার what এটি হ'ল সংঘর্ষের অপ্টিমাইজেশনের সাধারণ পরামর্শ। আমি সংঘর্ষগুলির অনুকূলকরণের জন্য কৌশলগুলি অনুসন্ধান করতে উত্সাহিত করতে চাই এবং অনুসন্ধানের সময় নিজেকে C ++ এ সীমাবদ্ধ রাখবেন না।


প্রাণীর খাবার সন্ধান করছেন

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

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

যদি খাবার সরে না যায়, আপনি তৈরির জন্য গ্রিডে খাদ্য সত্তাগুলি যুক্ত করতে পারেন, যাতে আপনার কোষে কী কী সত্ত্বা রয়েছে তা অনুসন্ধান করার দরকার পড়ে না। পরিবর্তে আপনি ঘরে জিজ্ঞাসা করুন এবং এটিতে তালিকা রয়েছে।

আপনি যদি কোষগুলির আকারকে দুটি হিসাবে শক্তিশালী করেন তবে আপনি যে ঘরটি তৈরি করেছেন তার সক্ষমতাগুলি কেটে রেখে কেবল সেই প্রাণীটি খুঁজে পেতে পারেন।

নিকটতমটির সন্ধানের সাথে তুলনা করার সময় আপনি স্কোয়ার দূরত্বের সাথে (ওরফে স্কোরিট করবেন না) সাথে কাজ করতে পারেন। কম স্কয়ার্ট অপারেশন মানে দ্রুত কার্যকরকরণ।


নতুন খাবার যুক্ত হয়েছে

যখন নতুন খাবার যুক্ত করা হয় তখন কেবল নিকটবর্তী প্রাণীদের জাগ্রত করা দরকার। এটি একই ধারণা, এখন ব্যতীত আপনার কোষে জীবের তালিকা পাওয়া দরকার।

আরও মজার বিষয় হল, আপনি যদি প্রাণীর মধ্যে এটি টানছেন যে এটি যে খাবারটি তাড়া করছে তা কতটা দূরে ... আপনি সরাসরি সেই দূরত্বের বিরুদ্ধে পরীক্ষা করতে পারেন।

আরেকটি জিনিস যা আপনাকে সহায়তা করবে তা হ'ল খাবারগুলি প্রাণী কী তা তাড়া করছে তা সম্পর্কে সচেতন করা। এটি আপনাকে এমন সমস্ত প্রাণীর জন্য খাদ্য সন্ধানের কোড চালানোর অনুমতি দেবে যা সবেমাত্র খেয়েছে এমন এক টুকরো টুকরো তাড় করছে।

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


সিমুলেশন বাদ দেওয়া হচ্ছে

কোনও প্রাণীর গতি জেনে আপনি জানেন যে এটি তার লক্ষ্যে পৌঁছানো পর্যন্ত এটি কতটা। সমস্ত প্রাণীর যদি একই গতি থাকে তবে যেটি প্রথমে পৌঁছাবে তার মধ্যে সবচেয়ে ছোট এন্টারোটেটেড দূরত্ব রয়েছে।

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

এই মুহুর্তে যান। আপনার চারপাশে ঘুরে বেড়ানো প্রাণীর অনুকরণ করার দরকার নেই।


1
"এবং কেবল সেখানেই অনুসন্ধান করুন।" এবং কক্ষগুলি আশেপাশের প্রতিবেশী - মোট 9 টি কোষ meaning কেন 9? কারণ জীব যদি কোনও ঘরের কোণে থাকে।
ইউকেমনকি

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

2
অবশ্যই - অতিরিক্ত কক্ষে অনুসন্ধান করার প্রয়োজনে যদি আপনি কাজ করতে চান তবে ... তবে প্রদত্ত যে বেশিরভাগ কোষের খাবার থাকবে না (প্রদত্ত চিত্র থেকে); কোন 4 টি অনুসন্ধান করতে হবে তার চেয়ে বেশি 9 টি ঘর অনুসন্ধান করা দ্রুততর হবে be
ইউকেমনকি

@ ইউকেমনকি এই কারণেই আমি প্রথমে এটি উল্লেখ করিনি।
থেরোট

16

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

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

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

আপনি এএবিবি সি সি লাইব্রেরি ব্যবহার করতে পারেন ।


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

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

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

1
@ বিভিএইচ বাস্তবায়ন করে আপনি ভবিষ্যতে সহজেই সিমুলেশন স্কেল প্রসারিত করতে পারেন। আপনি যদি কিছুটা ছোট আকারের সিমুলেশনের জন্য করেন তবে আপনি সত্যই কিছু আলগা করেন না।
ওসেলোট

2

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

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

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

পূর্ববর্তী কেরিয়ারে পয়েন্টটি আন্ডারলাইন করার জন্য আমি কারখানার সিমুলেটর তৈরি করেছি। আমরা এক ঘন্টােরও কম সময়ে এই পদ্ধতিতে সপ্তাহের জন্য বড় বড় কারখানাগুলি / বিমানবন্দরগুলি প্রতিটি আইটেম স্তরে পুরো উপাদান প্রবাহিত করি। যদিও টাইমস্টেপ ভিত্তিক সিমুলেশন বাস্তব সময়ের চেয়ে 4-5 গুণ দ্রুত সিমুলেট করতে পারে।

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


@ থেরোট আমরা জানি না যে কীভাবে অঙ্কনের জিনিসগুলি কাঠামোগত করা হয়। তবে হ্যাঁ drawcalls bottlenecks হয়ে যাবে একবার আপনি যথেষ্ট দ্রুত যাহাই হউক না কেন পেতে
joojaa

1

Nlog (N) এর জটিলতা হ্রাস করতে আপনি একটি সুইপ-লাইন অ্যালগরিদম ব্যবহার করতে পারেন। তত্ত্বটি হ'ল ভোরোনাই চিত্র, যা কোনও প্রাণীকে ঘিরে এমন একটি অঞ্চলে বিভক্ত হয়ে যায় যা সমস্ত পয়েন্টের সাথে অন্য কোনও অঞ্চলের চেয়ে নিকটে রয়েছে points

তথাকথিত ফরচুনের অ্যালগরিদম এটি আপনার জন্য Nlog (N) এ এবং উইকি পৃষ্ঠায় এটি প্রয়োগ করার জন্য সিউডো কোড রয়েছে। আমি নিশ্চিত যে সেখানেও গ্রন্থাগারের বাস্তবায়ন রয়েছে। https://en.wikipedia.org/wiki/Fortune%27s_algorithm


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

আমি এই ধারণাটি পছন্দ করি, আমি এটি প্রসারিত দেখতে চাই। আপনি কীভাবে ভোরোনাই চিত্রটি উপস্থাপন করবেন (মেমরি ডেটা স্ট্রাকচার হিসাবে)? আপনি এটি কীভাবে জিজ্ঞাসা করবেন?
থেরোট

@ আপনার যে ভেরোনাই চিত্রের দরকার নেই কেবল সেই একই সুইপলাইন ধারণাটি তৈরি করুন।
joojaa

-2

সবচেয়ে সহজ সমাধান হ'ল ফিজিক্স ইঞ্জিনকে সংহত করা এবং কেবল সংঘর্ষ সনাক্তকরণ অ্যালগরিদম ব্যবহার করা। প্রতিটি সত্তার চারদিকে কেবল একটি বৃত্ত / ক্ষেত্র তৈরি করুন এবং পদার্থবিজ্ঞানের ইঞ্জিন সংঘর্ষগুলি গণনা করতে দিন। 2D আমি সুপারিশ করবে Box2D বা চিপমাংক , এবং বুলেট 3D জন্য।

আপনি যদি মনে করেন যে পুরো পদার্থবিজ্ঞানের ইঞ্জিনকে সংহত করা খুব বেশি, তবে আমি নির্দিষ্ট সংঘর্ষের অ্যালগরিদমগুলি অনুসন্ধান করার পরামর্শ দেব would বেশিরভাগ সংঘর্ষ সনাক্তকরণ গ্রন্থাগার দুটি ধাপে কাজ করে:

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