আমার হোমব্রিউ রেন্ডারিং সিস্টেমে কীভাবে সংস্থানগুলি ক্যাশে করবেন


10

পটভূমি:

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

  1. সরলতা । এটি একটি গবেষণা প্রকল্পের জন্য এবং আমি সহজেই আমার সিস্টেমগুলি পরিবর্তন করতে এবং প্রসারিত করতে সক্ষম হতে চাই (অতএব ইসিএস পদ্ধতির)।
  2. পারফরম্যান্স । আমার দৃশ্যে অনেকগুলি জ্যামিতি সহ অনেক ছোট মডেল এবং বৃহত পরিমাণে থাকতে পারে। ওজিএল প্রসঙ্গ এবং আইফোনগুলি বাফার জ্যামিতি থেকে প্রতিটি রেন্ডার ফ্রেমকে অর্জন করা গ্রহণযোগ্য নয়। ক্যাশে মিস করা এড়াতে আমি ডেটা লোকালটির লক্ষ্য করছি।
  3. নমনীয়তা । এটি অবশ্যই স্প্রাইটস, মডেল এবং ভলিউম (ভক্সেল) রেন্ডার করতে সক্ষম হবে।
  4. উদ্বিগ্ন । আমি আমার রেন্ডারার লেখার পরে দৃশ্যের গ্রাফটি মূল ইসিএস আর্কিটেকচারে পুনরুদ্ধার করা যেতে পারে।
  5. মডুলার । আমার দৃশ্যের গ্রাফটি পরিবর্তন না করেই বিভিন্ন রেন্ডারারগুলিতে অদলবদল করতে সক্ষম হব বলে ভাল লাগবে।
  6. রেফারেনশিয়াল স্বচ্ছতা , মানে যে কোনও সময় আমি এটিকে কোনও বৈধ দৃশ্য দিতে পারি এবং এটি সেই দৃশ্যের জন্য সর্বদা একই চিত্র সরবরাহ করে nder বিশেষত এই লক্ষ্যটি অগত্যা প্রয়োজনীয় নয়। আমি ভেবেছিলাম এটি দৃশ্যের সিরিয়ালাইজেশনকে সহজতর করতে সহায়তা করবে (আমার দৃশ্যাবলী সংরক্ষণ এবং লোড করতে সক্ষম হবে) এবং পরীক্ষার / পরীক্ষামূলক উদ্দেশ্যে রানটাইম চলাকালীন আমাকে বিভিন্ন দৃশ্যে অদলবদল করার নমনীয়তা দেয়।

সমস্যা এবং ধারণা:

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

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

আপনি কীভাবে এই সমস্যার সমাধান করবেন? নাকি আপনার কোনও পরামর্শ আছে? আমার পাঠ্য প্রাচীর পড়ার জন্য ধন্যবাদ!


1
আপনি কোন অগ্রগতি করেছেন?
Andreas

এটি একটি অত্যন্ত জটিল প্রশ্ন এবং সম্ভবত বিভিন্ন পৃথক প্রশ্নে বিভক্ত হওয়া উচিত। এটি মূলত জিজ্ঞাসা করছে "আমার ইঞ্জিনটি কীভাবে ডিজাইন করব?" আমার পরামর্শটি হ'ল এমন কিছু নকশা করা যা প্রথমে সহজ উপাদানগুলিকে সমর্থন করে, তারপরে আপনি যেমন যান তেমন বৈশিষ্ট্য যুক্ত করুন এবং রিফ্যাক্টর করুন। এছাড়াও, 3 ডি গেম ইঞ্জিন ডিজাইনের বইগুলি সন্ধান করুন, যাতে আপনি অনুসন্ধান করছেন এমন অনেকগুলি তথ্য কভার করা উচিত।
ইয়ান ইয়ং

উত্তর:


2

আপনার প্রশ্নটি পুনরায় পড়ার পরে, আমি দৃ strongly়ভাবে অনুভব করছি যে আপনি সমস্যাটিকে অতিরিক্ত জটিল করে তুলছেন। কারণটা এখানে:

  1. কেবলমাত্র দুটি ধরণের রেন্ডারিং সিস্টেম রয়েছে: ফরোয়ার্ড এবং ডিফার্ড, যার কোনটি কোনও দৃশ্যের গ্রাফের উপর নির্ভর করে না।

  2. কেবলমাত্র যে কোনও রেন্ডারিং সিস্টেমের সাথে আপনার কার্য সম্পাদন করা উচিত, উচ্চ পলি কাউন্ট এবং অকার্যকর শেডার এবং ক্লায়েন্ট কোড থেকে আসা উচিত।

  3. ক্যাশে মিসগুলি কার্য সম্পাদনকে হ্রাস করে, তবে তারা সম্ভবত তাদের মনে করে যে দানবগুলি। আপনার পারফরম্যান্সের 80% উন্নতি হবে আরও কার্যকর অ্যালগরিদম থেকে। আপনার কোডটি প্রাক-অনুকূলকরণের ভুল করবেন না।

বলেছিল:

আপনি যদি হোমব্রিউ সিনগ্রাফ ব্যবহার করছেন তবে আপনার দৃশ্যের কোডের রেন্ডারিং অংশটি ডিজাইনের জন্য আপনার ইতিমধ্যে একটি "রেন্ডারার" ইন্টারফেস (বা বেস ক্লাস) ব্যবহার করা উচিত। ডাবল প্রেরণের সাহায্যে দর্শনার্থীর প্যাটার্ন এটির জন্য একটি ভাল পদ্ধতির কারণ আপনি বিভিন্ন ধরণের গ্রাফ নোড যেমন রঙ, টেক্সচার, জাল, রূপান্তর ইত্যাদি ব্যবহার করতে পারেন এইভাবে রেন্ডার চক্রের সময় সমস্ত রেন্ডারারের কাজটি করতে হয় দৃশ্যের কাঠামো গভীরতার সাথে হাঁটুন - প্রথমে নিজেকে যুক্তি হিসাবে পাস করুন। এই উপায়ে রেন্ডারারটি মূলত কেবল শেডারের সংগ্রহ এবং সম্ভবত একটি ফ্রেম বাফার বা দুটি। এর ফলাফল হ'ল অনুসন্ধান / অপসারণ কোডটি আর রেন্ডারিং সিস্টেমের জন্য প্রয়োজন হয় না, কেবল দৃশ্য চিত্র।

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

তারপরে আপনাকে একটি অবগত সিদ্ধান্ত নিতে ভালভাবে রাখা হবে।

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