পটভূমি:
আমি C ++ এবং ওপেনএল ব্যবহার করে কোনও সত্তা উপাদান সিস্টেম ধরণের আর্কিটেকচারের জন্য একটি সাধারণ 3 ডি রেন্ডার সিস্টেম ডিজাইন করছি। সিস্টেমটিতে একটি উপস্থাপক এবং একটি দৃশ্য গ্রাফ থাকে। আমি যখন রেন্ডারারের প্রথম পুনরাবৃত্তিটি শেষ করি তখন আমি দৃশ্য গ্রাফটি ইসিএস আর্কিটেকচারে বিতরণ করতে পারি। আপাতত এটি একরকম বা অন্য কোনও স্থানধারক। যদি সম্ভব হয় তবে নীচে রেন্ডারারের জন্য আমার লক্ষ্যগুলি:
- সরলতা । এটি একটি গবেষণা প্রকল্পের জন্য এবং আমি সহজেই আমার সিস্টেমগুলি পরিবর্তন করতে এবং প্রসারিত করতে সক্ষম হতে চাই (অতএব ইসিএস পদ্ধতির)।
- পারফরম্যান্স । আমার দৃশ্যে অনেকগুলি জ্যামিতি সহ অনেক ছোট মডেল এবং বৃহত পরিমাণে থাকতে পারে। ওজিএল প্রসঙ্গ এবং আইফোনগুলি বাফার জ্যামিতি থেকে প্রতিটি রেন্ডার ফ্রেমকে অর্জন করা গ্রহণযোগ্য নয়। ক্যাশে মিস করা এড়াতে আমি ডেটা লোকালটির লক্ষ্য করছি।
- নমনীয়তা । এটি অবশ্যই স্প্রাইটস, মডেল এবং ভলিউম (ভক্সেল) রেন্ডার করতে সক্ষম হবে।
- উদ্বিগ্ন । আমি আমার রেন্ডারার লেখার পরে দৃশ্যের গ্রাফটি মূল ইসিএস আর্কিটেকচারে পুনরুদ্ধার করা যেতে পারে।
- মডুলার । আমার দৃশ্যের গ্রাফটি পরিবর্তন না করেই বিভিন্ন রেন্ডারারগুলিতে অদলবদল করতে সক্ষম হব বলে ভাল লাগবে।
- রেফারেনশিয়াল স্বচ্ছতা , মানে যে কোনও সময় আমি এটিকে কোনও বৈধ দৃশ্য দিতে পারি এবং এটি সেই দৃশ্যের জন্য সর্বদা একই চিত্র সরবরাহ করে nder বিশেষত এই লক্ষ্যটি অগত্যা প্রয়োজনীয় নয়। আমি ভেবেছিলাম এটি দৃশ্যের সিরিয়ালাইজেশনকে সহজতর করতে সহায়তা করবে (আমার দৃশ্যাবলী সংরক্ষণ এবং লোড করতে সক্ষম হবে) এবং পরীক্ষার / পরীক্ষামূলক উদ্দেশ্যে রানটাইম চলাকালীন আমাকে বিভিন্ন দৃশ্যে অদলবদল করার নমনীয়তা দেয়।
সমস্যা এবং ধারণা:
আমি চেষ্টা করার জন্য কিছু ভিন্ন পদ্ধতির সাথে হাজির হয়েছি তবে প্রতিটি রেন্ডার নোডের জন্য কীভাবে ওজিএল সংস্থানগুলি (ভিএও, ভিবিও, শেডার, ইত্যাদি) ক্যাশে করবেন তা নিয়ে আমি লড়াই করছি। নীচে আমি এখনও অবধি চিন্তা করি এমন বিভিন্ন ক্যাশেগ ধারণাটি রইল:
- সেন্ট্রালাইজড ক্যাশে। প্রতিটি দৃশ্যের নোডের একটি আইডি থাকে এবং রেন্ডারারের কাছে একটি ক্যাশে থাকে যা নোডগুলি সরবরাহ করতে আইডি মানচিত্র করে। প্রতিটি রেন্ডার নোডে জ্যামিতির সাথে সম্পর্কিত VAO এবং VBO থাকে। একটি ক্যাশে মিস সংস্থানগুলি অর্জন করে এবং জ্যামিতিটিকে ক্যাশে একটি রেন্ডার নোডে মানচিত্র করে। জ্যামিতি পরিবর্তন করা হলে, একটি নোংরা পতাকা সেট করা হয়। দৃশ্যের নোডগুলির মাধ্যমে পুনরাবৃত্তি করার সময় যদি রেন্ডারার কোনও নোংরা জ্যামিতির পতাকা দেখে তবে এটি রেন্ডার নোড ব্যবহার করে ডেটাটিকে প্রত্যাখ্যান করে। যখন কোনও দৃশ্যের নোড সরিয়ে ফেলা হয়, তখন একটি ইভেন্ট সম্প্রচারিত হয় এবং সংস্থানকারী সংস্থানগুলি রিসোর্স করার সময় ক্যাশে থেকে সম্পর্কিত রেন্ডার নোডটিকে সরিয়ে দেয়। বিকল্পভাবে, নোড অপসারণের জন্য চিহ্নিত করা হয় এবং এটি অপসারণের জন্য রেন্ডার দায়ী। আমি মনে করি এই পদ্ধতির সর্বাধিক ঘনিষ্ঠভাবে 6 লক্ষ্য অর্জন করা হয়েছে যখন 4 এবং 5 বিবেচনা করার সময়ও 2 অ্যারে অ্যাক্সেসের পরিবর্তে মানচিত্রের অনুসন্ধানের সাথে অতিরিক্ত জটিলতা এবং ডেটা লোকালটির ক্ষতিতে ভুগছে।
- বিতরণ ক্যাশে । প্রতিটি দৃশ্য নোড ব্যতীত উপরের অনুরূপ রেন্ডার নোড রয়েছে। এটি মানচিত্রের অনুসন্ধানকে বাইপাস করে। ডেটা লোকালটির ঠিকানা দেওয়ার জন্য, রেন্ডার নোডগুলি রেন্ডারারে সংরক্ষণ করা যেতে পারে। তারপরে দৃশ্য নোডগুলির পরিবর্তে নোডগুলি রেন্ডার করতে পয়েন্টার থাকতে পারে এবং রেন্ডারার একটি ক্যাশে মিসে পয়েন্টার সেট করে। আমি মনে করি যে এই জাতীয় কোনও সত্তা উপাদানগুলির পদ্ধতির নকল করে, তাই এটি অন্য স্থাপত্যের সাথে সামঞ্জস্যপূর্ণ হবে। এখানে সমস্যা হ'ল এখন দৃশ্যের নোডগুলি রেন্ডারার-বাস্তবায়ন-নির্দিষ্ট ডেটা ধারণ করে। যদি আমি পরিবর্তন করি যে কীভাবে জিনিসগুলি রেন্ডারারে রেন্ডার করা হয় (স্প্রেটস বনাম ভলিউম রেন্ডার করার মতো) এখন আমাকে রেন্ডার নোড পরিবর্তন করতে হবে বা দৃশ নোডে আরও "উপাদান" যুক্ত করতে হবে (যার অর্থ দৃশ্যের গ্রাফ পরিবর্তন করাও)। প্লাস দিকে, এটি আমার প্রথম-পুনরাবৃত্তি রেন্ডারারকে আপ এবং চলমান পাওয়ার সহজ উপায় বলে মনে হচ্ছে।
- বিতরণ করা মেটাডাটা । একটি রেন্ডারার ক্যাশে মেটাডেটা উপাদান প্রতিটি দৃশ্যের নোডে সঞ্চয় করা হয়। এই ডেটা বাস্তবায়ন-নির্দিষ্ট নয় বরং একটি আইডি, টাইপ এবং ক্যাশে প্রয়োজনীয় অন্য কোনও প্রাসঙ্গিক ডেটা ধারণ করে। তারপরে ক্যাশে চেহারাটি আইডি ব্যবহার করে সরাসরি অ্যারেতে করা যেতে পারে এবং প্রকারটি নির্দেশ করতে পারে যে কোন ধরণের রেন্ডারিং পদ্ধতির ব্যবহার করতে হবে (স্প্রাইটস বনাম ভলিউমের মতো)।
- দর্শক + বিতরণ ম্যাপিং । রেন্ডারার দর্শনার্থী এবং দৃশ্যের নোডগুলি ভিজিটর প্যাটার্নের উপাদান। প্রতিটি দৃশ্যের নোডে ক্যাশে কী (যেমন মেটাডাটা তবে কেবল একটি আইডি) থাকে যা কেবলমাত্র রেন্ডারার দ্বারা চালিত হয়। আইডিটি সাধারণ মানচিত্রের চেহারাটির পরিবর্তে অ্যারের জন্য ব্যবহার করা যেতে পারে। রেন্ডারার দৃশ্য নোডের ধরণের উপর ভিত্তি করে দৃশ্য নোডকে একটি ভিন্ন রেন্ডারিং ফাংশন প্রেরণের অনুমতি দিতে পারে এবং আইডিটি কোনও ক্যাশে ব্যবহার করতে পারে। একটি ডিফল্ট বা সীমার বাইরে আইডি একটি ক্যাশে মিস নির্দেশ করবে।
আপনি কীভাবে এই সমস্যার সমাধান করবেন? নাকি আপনার কোনও পরামর্শ আছে? আমার পাঠ্য প্রাচীর পড়ার জন্য ধন্যবাদ!