কোনও 3D ভক্সেল-ভিত্তিক ঘরটি দক্ষতার সাথে সিল করা হয়েছে কীভাবে তা নির্ধারণ করবেন


10

ভক্সেল-ভিত্তিক 3D কক্ষে বড় কক্ষগুলি সিল করা হয়েছে কিনা তা দক্ষতার সাথে নির্ধারণ করার ক্ষেত্রে আমার কিছু সমস্যা ছিল। আমি এমন একটি স্থানে রয়েছি যেখানে আমি সাহায্য না চাইতেই সমস্যা সমাধানের জন্য আমার সর্বাত্মক চেষ্টা করেছি, কিন্তু হাল ছাড়ার পক্ষে যথেষ্ট চেষ্টা করেছিলাম না, তাই আমি সাহায্যের জন্য বলছি।

পরিষ্কার করার জন্য, সিল করা হচ্ছে যে ঘরে কোনও ছিদ্র নেই। অক্সিজেন সিলার রয়েছে, যা ঘরটি সিল করা হয়েছে কিনা তা পরীক্ষা করে এবং অক্সিজেন ইনপুট স্তরের উপর নির্ভর করে সিল করে।

এখনই, আমি এটি এটি করছি:

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

যদি অঞ্চলটি সিল না করা হয় তবে কিছু পরিবর্তন করে আবার লুপটি চালান:

  • ভ্যাকুয়াম টাইলের পরিবর্তে "শ্বাস প্রশ্বাসের বায়ু" টাইলের জন্য সংলগ্ন ব্লকগুলি পরীক্ষা করা হচ্ছে
  • একটি হ্রাসকারী কাউন্টার ব্যবহার করার পরিবর্তে, যতক্ষণ না সংলগ্ন "শ্বাস প্রশ্বাসের বায়ু" টাইলস পাওয়া যায় না ততক্ষণ চালিয়ে যান।
  • লুপ শেষ হয়ে গেলে, প্রতিটি চেক করা ব্লককে ভ্যাকুয়াম টাইলে সেট করুন।

আমি যে কোডটি ব্যবহার করছি তা এখানে: http://pastebin.com/NimyKncC

সমস্যাটি:

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

আমি ভাবছিলাম যে অপ্টিমাইজেশানের আরও অভিজ্ঞতার সাথে যদি কেউ আমাকে একটি হাত দিতে পারে বা কমপক্ষে আমাকে সঠিক দিকে নির্দেশ করে। একটি গুচ্ছ ধন্যবাদ।


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

যেহেতু 3-দ্বিতীয় সময়ের ফ্রেমে শত শত ভক্সেল পরিবর্তিত হতে পারে, তাই আমি ভেবেছিলাম যে কাছাকাছি কিছু পরিবর্তন হয়েছে কিনা তা পরীক্ষা না করে পর্যায়ক্রমে এটি করা আরও দক্ষ হবে। যদিও আমি এটি নিয়ে পরীক্ষা করব।
নাইজেলম্যান 1010

ওহ, ভাল যদি শত শত ভক্সেল 3 টি দ্বিতীয় সময়ের ফ্রেমে পরিবর্তিত হতে পারে তবে আপনার পারফরম্যান্স নিয়ে বেশ কয়েকটি সমস্যা হতে পারে। অদক্ষতা খুঁজে পেতে আপনার কোডটি প্রোফাইলিং শুরু করুন। শুভকামনা!
মাইকেলহাউস

উত্তর:


3

সর্বোত্তম সমাধানটি ঘরের প্রত্যাশিত আকারের মতো একাধিক কারণের উপর নির্ভর করবে।

  1. যখন কিছু আসলে পরিবর্তিত হয় কেবল তখনই এই চেকগুলি করুন।

পন্থা 1:

আপনি ভেন্ট / ভেন্টের উপরে ভেন্ট থেকে টাইলের দিকে বা টাইল হিসাবে যা টিকা হিসাবে পরিচিত এটির জন্য কোনও A * ব্যবহার করতে পারেন। যদি পথটি পাওয়া যায় তবে ঘরটি সিসিল করা হয়নি। এটি আপনার বর্তমান পদ্ধতির চেয়ে আলাদা নয় তবে দ্রুত হওয়া উচিত। একবার পাওয়া গেলে, টাইলগুলি শূন্যস্থান হিসাবে সেট করতে একটি "বন্যা ফিল" করুন make

পদ্ধতির 2:

হতে পারে আপনার বাহ্যিক কাঠামো কম কম - বিবেচনা করে দেখুন যে সেখানে কোনও তল রয়েছে যার মধ্যে কক্ষ রয়েছে, আপনাকে সমস্ত 6 দিক দিয়ে সরে যাওয়ার দরকার নেই, তাই আপনার পৃষ্ঠের সাথে ভ্রমণ করা উচিত, প্রতিটি টাইলকে শূন্যস্থান হিসাবে চিহ্নিত করুন যা আপনি ভ্রমণ করেন।


0

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

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

সম্পাদনা:

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


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