সব কিছুর জন্য ইনস্ট্যান্সিং ব্যবহার করছেন?


16

একবারে একই জালের একাধিক (হন্ডার? হাজার?) অনুলিপি সরবরাহ করার সময় ইনস্ট্যান্সিং কর্মক্ষমতা উন্নত করে (উল্লেখযোগ্যভাবে)। কিন্তু একটি ড্র কল সহ ঠিক একটি অনুলিপি সরবরাহ করার সময় এর কত ওভারহেড থাকে? ইঞ্জিন দ্বারা রেন্ডার করা সমস্ত জ্যামিতির জন্য ইনস্ট্যান্সিং ব্যবহার করা কি ভাল বা খারাপ ধারণা হবে?

সম্পাদনা: ধরা যাক আমরা একটি এফপিএস গেম তৈরি করছি। বেশিরভাগ সামগ্রীর কেবল একটি উদাহরণ রয়েছে: একটি ছুরি, একটি বন্দুক, একটি মেশিনগান, একটি বিল্ডিং এবং একটি রেডিও টাওয়ার। তবে একাধিক উদাহরণ সহ কিছু বস্তুও রয়েছে: গাছ (উদাহরণস্বরূপ শত শত উদাহরণ সহ 3 প্রকারের গাছ), ঘাস এবং আরও ... আমার অর্থ হ'ল: এক-দৃষ্টিকোণ বস্তুর প্রতিস্থাপন না করে "traditionalতিহ্যবাহী" উপায় এবং গাছগুলি এবং ঘাস তাত্ক্ষণিক ব্যবহার করে, আমরা ইনস্ট্যান্সিং ব্যবহার করে তাদের সমস্ত রেন্ডার করি । সুতরাং আমাদের রেডিও টাওয়ারের একটি মাত্র উদাহরণ রয়েছে (যার তথ্য আমরা একটি তথ্য উপাত্তের বাফারে সংরক্ষণ করি) এবং আমরা সেই টাওয়ারটিকে DrawInstanced()উদাহরণ হিসাবে সমান গণনা সহ একরকম কল ব্যবহার করে রেন্ডার করি 1। অন্যান্য সমস্ত বস্তুর সাথে একই (অবশ্যই গাছ এবং ঘাসের একাধিক উদাহরণ রয়েছে)।

সুতরাং আমার প্রশ্নটি হল: ইনস্ট্যান্সিং ব্যবহার করে কোনও অবজেক্টের একক উদাহরণ আঁকাই কি খারাপ ধারণা? ইনস্ট্যান্সিংয়ের কি খুব বেশি ওভারহেড থাকে (মেমরি- এবং কার্য সম্পাদন অনুসারে) বা এটি কোনও উপায়ে একক-দৃষ্টিকোণ অবজেক্টের জন্য অনাকাঙ্ক্ষিত?

উত্তর:


19

এক্সপিডিএম সহ ডি 3 ডি 9 এর অধীনে আপনি সম্ভবত অবশ্যই যেখানেই সম্ভব উদাহরণস্বরূপ চান। কল ওভারহেড আঁকুন ঠিক এতটাই বেশি যে এটি উপলব্ধি করে। সেই দৃশ্যে ক্রসওভার পয়েন্ট 2 বা 3 টি উদাহরণের চেয়ে কম হতে পারে।

যদি আপনি কেবল কোনও প্রদত্ত জালটির একটি উদাহরণ পেয়ে থাকেন, তবে পৃষ্ঠের উপরে এটি উদাহরণহীনভাবে আঁকতে লোভজনক বলে মনে হতে পারে। তবে কী জড়িত তা দেখুন:

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

এমনকি যদি আপনি কেবল একটি একক জাল পেয়েছেন (কোনও এফপিএসে বন্দুকের মডেলের মতো) এমন কিছু ক্ষেত্রে রয়েছে যেখানে ইনস্ট্যান্সিং দরকারী। ধরা যাক আপনি একটি ফরোয়ার্ড রেন্ডারারে এবং জেড-প্রিপাসের সাহায্যে মাল্টিপাস লাইট জমেশন করছেন। প্রতিটি আলোর জন্য অতিরিক্ত পাসের পরিবর্তে, আপনি প্রতি লাইট প্রতি লাইট তৈরি করেন এবং আপনি এটি উদাহরণস্বরূপ আঁকেন।

প্রথম দৃশ্যের ভিত্তিতে, গল্পটির নৈতিকতাটি হ'ল যে কোনও বস্তু শ্রেণি যদি আদৌ ইনস্ট্যান্সিং ব্যবহার করতে পারে তবে that শ্রেণীর সমস্ত বস্তুর জন্য ইনস্ট্যান্সিংটি সর্বদা ব্যবহার করা বোধগম্য।

দ্বিতীয় দৃশ্যের উপর ভিত্তি করে, গল্পটির নৈতিকতাটি হ'ল ইনস্ট্যান্সিংয়ের অ-স্পষ্ট ব্যবহার থাকতে পারে যা "আমার 20 টি গাছ আঁকার দরকার" বলার বাইরে চলে যায়।


আপনি যে কারণগুলি দিয়েছেন তা হ'ল একই কারণ যা আমাকে এই প্রশ্নটি প্রথম স্থানে জিজ্ঞাসা করেছিল। ধন্যবাদ.
এনপিএস

12

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

আমি কয়েক মাস আগে একটি ব্যবহারিক প্রয়োগে এটি পরীক্ষা করেছি। আমি ক্রিটেক স্পঞ্জার দৃশ্যে কয়েকটি বৈশ্বিক আলোকসজ্জা অ্যালগরিদমকে কোড করেছিলাম, যার মধ্যে প্রায় 350 বা তার বেশি মিশ্র (ঠিক মনে থাকে না) থাকে, যার মধ্যে একটি দম্পতি কয়েকটি মুঠো ঘটনা ভাগ করে দেয়। আপনার পরামর্শ অনুসারে শুরুতে আমি এটি করেছি, কেবল উদাহরণস্বরূপ এবং 1 টির উদাহরণ গণনা সহ বাকী আঁকুন, যেহেতু এটি রেন্ডারিং কোডটি কিছুটা সহজ করেছে।

পরে রেন্ডারারের অনুকূলকরণের সময়, কেবল গণনা = 1 অবজেক্টগুলিকে স্বাভাবিকভাবে জমা দেওয়ার জন্য ইনস্ট্যান্স করা থেকে ফিরে স্যুইচ করা আমাকে একটি আই 7 3770 কে (এবং জিটিএক্স 770) এর সময় প্রতি ফ্রেমের প্রায় 3.5 মিলিসেকেন্ডে বাঁচিয়েছিল । একাধিক উদাহরণ দিয়ে মিশ্রণগুলি স্যুইচ করা theতিহ্যবাহী উপায়ে আমাকে আরও 0.5 মিমি বাঁচিয়েছে। সামগ্রিকভাবে অ্যাপ্লিকেশনটি ~ 120 এফপিএস থেকে প্রায় 230 এফপিএসে গেছে।

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


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

2

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


2

এটি 4 বছর হয়ে গেছে ... এবং আমি এটি নিরাপদ বলে মনে করি যে 1 সাথে "উদাহরণস্বরূপ" কলগুলি জমা দেওয়া পুরোপুরি ঠিক you আপনি লক্ষ্য করেছেন যে, নতুন APIs DX12 এবং Vk উভয়েরই একটি উদাহরণ গণনা রয়েছে যা 0 থেকে 0 পর্যন্ত হতে পারে NUM_INSTANCES । এছাড়াও দ্রষ্টব্য যে কোনও ড্রইন্ডেক্সড (...) নেই

সম্পাদনা

সতর্কতার নোট হিসাবে, উপরেরটি সম্ভবত এই আধুনিক এপিআইগুলির সাথে ঠিক আছে, সম্ভবত গ্ল << 3.3 বা ডিএক্স 11 এর মতো পুরানো কিছু ব্যবহার করার জন্য অন্যান্য ব্যবহারকারীর দ্বারা উল্লিখিত কিছু প্রোফাইলের প্রয়োজন হবে।

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