আমি ইতিমধ্যে উত্তরগুলির সন্ধান করেছি কিন্তু ব্যয়বহুল ফাংশন / গণনা পরিচালনা করার জন্য আমি সেরা পদ্ধতির সন্ধান করতে সক্ষম হইনি।
আমার বর্তমান গেমটিতে (একটি 2 ডি টাইল-ভিত্তিক নগর বিল্ডিং) ব্যবহারকারী ভবন স্থাপন করতে, রাস্তা তৈরি করতে সক্ষম। যদি কোনও ভবন এই মোড়ের সাথে সংযুক্ত না থাকে তবে "রাস্তার সাথে সংযুক্ত নয়" চিহ্নটি ক্ষতিগ্রস্থ বিল্ডিংয়ের উপরে পপআপ করবে (অন্যথায় এটি সরিয়ে ফেলতে হবে)। বেশিরভাগ বিল্ডিংয়ের ব্যাসার্ধ থাকে এবং এটি একে অপরের সাথে সম্পর্কিতও হতে পারে (উদাহরণস্বরূপ ফায়ার ডিপার্টমেন্ট 30 টাইলের ব্যাসার্ধের মধ্যে সমস্ত ঘরগুলিকে সহায়তা করতে পারে)। রাস্তার সংযোগ পরিবর্তিত হলে আমারও এটি আপডেট / চেক করা দরকার।
গতকাল আমি একটি বড় পারফরম্যান্স ইস্যুতে ছুটে এসেছি। নিম্নলিখিত দৃশ্যের দিকে একবার নজর দেওয়া যাক: একজন ব্যবহারকারী অবশ্যই বিল্ডিং এবং রাস্তাগুলি মুছতে পারেন। সুতরাং এখন যদি কোনও ব্যবহারকারী জংশনের ঠিক পরে সংযোগটি ভেঙে দেয় তবে আমাকে একই সাথে অনেকগুলি বিল্ডিং আপডেট করতে হবে । আমি মনে করি প্রথম পরামর্শগুলির মধ্যে একটি হ'ল নেস্টেড লুপগুলি এড়ানো (যা অবশ্যই এই দৃশ্যের একটি বড় কারণ) তবে আমাকে যাচাই করতে হবে ...
- যদি কোনও বিল্ডিং এখনও রাস্তার টাইল সরিয়ে ফেলা হয়েছে এমন স্থানে জংশনের সাথে সংযুক্ত থাকে (আমি কেবল এটিই সেই রাস্তা দ্বারা ক্ষতিগ্রস্থ বিল্ডিংয়ের জন্য করি)। (এই পরিস্থিতিতে একটি ছোট সমস্যা হতে পারে)
ব্যাসার্ধ টাইলগুলির তালিকা এবং ব্যাসার্ধের মধ্যে বিল্ডিং পান (নেস্টেড লুপগুলি - বড় সমস্যা!) ।
// Go through all buildings affected by erasing this road tile. foreach(var affectedBuilding in affectedBuildings) { // Get buildings within radius. foreach(var radiusTile in affectedBuilding.RadiusTiles) { // Get all buildings on Map within this radius (which is technially another foreach). var buildingsInRadius = TileMap.Buildings.Where(b => b.TileIndex == radiusTile.TileIndex); // Do stuff. } }
এই সবগুলি আমার এফপিএসকে এক সেকেন্ডের জন্য 60 থেকে প্রায় 10 পর্যন্ত ভেঙে দেয় ।
আমি কি করতে পারে। আমার ধারণাগুলি হবে:
- এটির জন্য মূল থ্রেড (আপডেট ফাংশন) ব্যবহার না করে অন্য একটি থ্রেড। আমি যখন মাল্টিথ্রেডিং ব্যবহার শুরু করি তখন আমি লক করার সমস্যায় পড়তে পারি।
- প্রচুর গণনা পরিচালনা করতে একটি সারি ব্যবহার করে (এই ক্ষেত্রে সেরা পন্থাটি কী হবে?)
- বেশি হিসাব (যেমন ব্যাসার্ধের মধ্যে বিল্ডিং) এড়াতে আমার অবজেক্টগুলিতে (বিল্ডিং) আরও তথ্য রাখুন।
শেষ পন্থাটি ব্যবহার করে আমি পরিবর্তে এই ফোরচকে কোনও নেস্টিং সরিয়ে ফেলতে পারি:
// Go through all buildings affected by erasing this road tile.
foreach(var affectedBuilding in affectedBuildings) {
// Go through buildings within radius.
foreach(var buildingInRadius in affectedBuilding.BuildingsInRadius) {
// Do stuff.
}
}
তবে আমি জানি না এটি যথেষ্ট কিনা। সিটিস স্কাইলাইনের মতো গেমগুলিতে খেলোয়াড়ের বড় মানচিত্র থাকলে আরও অনেক বেশি বিল্ডিং পরিচালনা করতে হয়। তারা কীভাবে এই জিনিসগুলি পরিচালনা করবে ?! সমস্ত বিল্ডিং একই সময়ে আপডেট হয় না বলে একটি আপডেট করার সারি হতে পারে।
আমি আপনার ধারণা এবং মন্তব্য প্রতীক্ষিত!
অনেক ধন্যবাদ!