ভার্টেক্স বাফার অবজেক্টস কেন কর্মক্ষমতা উন্নত করে?


10

আমার প্রাথমিক বোঝাপড়া থেকে, একটি ভার্টেক্স বাফার অবজেক্ট এই জাতীয় কিছু ব্যবহার করে (সিউডো কোড):

সাধারণত, যদি কেউ বলতে চান, একটি স্কোয়ার আঁকুন, কেউ লাইন অঙ্কন কমান্ড জারি করতে পারে।

line (0, 0) -> (1, 0)
line (1, 0) -> (1, 1)
line (1, 1) -> (0, 1)
line (0, 1) -> (0, 0)

একটি ভিবিও ব্যবহার করে, যদি আমি সঠিকভাবে বুঝতে পারি তবে শীর্ষগুলি কোনও ভিবিওতে লোড করা হবে।

define VBO
load (0,0) -> VBO
load (1,0) -> VBO
load (1,1) -> VBO
load (0,1) -> VBO
load (0,0) -> VBO

তারপরে আপনি একটি ড্রয়িং কমান্ড জারি করতে পারেন।

draw VBO vertices

যদিও আমি বুঝতে পারি যে ভিবিওরা কীভাবে কাজ করে, কেন জানি না যে তারা কেন কার্য সম্পাদন করে।

তারা কীভাবে পারফরম্যান্সের উন্নতি করবে?

উত্তর:


11

সাধারণভাবে, আপনি যখন তাত্ক্ষণিক মোডে কোনও বস্তু রেন্ডার করেন instance উদাহরণস্বরূপ লাইন অঙ্কন কমান্ড জারি করে — আপনি অঙ্কন করার জন্য গ্রাফিক্স কার্ডে জমা দিয়েছিলেন এমন একটি কমান্ড তৈরি করে। যদি আপনি প্রচুর ডেটা আঁকেন বা খুব ঘন ঘন আঁকেন তবে আপনি বার বার এই ডেটা প্রেরণে অনেক সময় নষ্ট করতে পারেন।

একটি ভার্টেক্স বাফার আপনাকে গ্রাফিক্স কার্ডে একবার জমা দেওয়ার পরে এমন একক বস্তু তৈরি করতে দেয়। যদি আপনার জ্যামিতি পরিবর্তন করার প্রয়োজন না হয় তবে আপনি এটিকে গ্রাফিক্স কার্ডে রেখে দিতে পারেন এবং গ্রাফিক্স কার্ডটি কেবল সেই বস্তুটি আঁকার অনুরোধ পাঠাতে পারেন। যেহেতু প্রতিবার আপনি আঁকলে প্রতিলিপিটি এড়ানো হয় তাই প্রতিটি ড্রয়ের জন্য ওভারহেডের পরিমাণ কম।

মনে রাখবেন যে একটি ভার্টেক্স বাফার অবজেক্ট ব্যবহার করা সর্বদা খুব গুরুত্বপূর্ণ গতিবেগ সরবরাহ করে না। যদি আপনি কেবল ফ্রেম প্রতি একবার জিনিসটি আঁকেন, এবং আপনি প্রতিটি ফ্রেমের মধ্যে জ্যামিতিটি প্রতিস্থাপন করছেন, তবে প্রতিটি ফ্রেম অনুলিপি এড়িয়ে যাওয়ার সুবিধা পাবেন না।

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


10

দুটি পদক্ষেপ রয়েছে যা ভিবিওকে তাত্ক্ষণিক মোডের চেয়ে আরও দক্ষ করে তোলে।

  1. তাত্ক্ষণিক মোড ( glBegin / glEnd , glVertex * , ইত্যাদি) এর অর্থ হ'ল প্রতিটি ফ্রেমে আপনি চালকের জন্য অনুভূমিক প্রতি বৈশিষ্ট্য (বৈশিষ্ট্য, স্বাভাবিক, রঙ ইত্যাদি) খাওয়ান, যা তাদের পুনরায় রূপান্তর করে এবং অবশেষে প্রেরণ করে জিপিইউতে কমান্ড হিসাবে পুরো প্যাকেজ। যে প্রতিটি ফ্রেম উপর ভার্টেক্স প্রতি ফাংশন অনেক কল।
    (নোট করুন যে ওপেনজিএল ৩.০ থেকে তাত্ক্ষণিক মোড অবমুক্ত করা হয়েছে এবং এটি পুরোপুরি ৩.২ থেকে অপসারণ করা হয়েছে ।)

  2. ভার্টেক্স অ্যারে ব্যবহার করে ( glDrawArrays , glDrawElements , glVertexPointer , ইত্যাদি দেখুন) আপনি ড্রাইভারটিকে একবারে পুরো জিনিসটি দিতে পারেন এবং এটি শীর্ষে পুনর্নির্মাণের বোঝা বাঁচাতে পারেন। আপনি পুরো জালটির জন্য কয়েক মুঠো কল দিয়ে কার্যকরভাবে ভার্টেক্সে বেশ কয়েকটি ফাংশন কলগুলি প্রতিস্থাপন করছেন। তবে আপনাকে এখনও একবার ফ্রেমে তা করতে হবে।

  3. প্রান্তবিন্দু বাফার অবজেক্ট বা VBO (দেখুন glGenBuffers , glBindBuffer আরও এক ধাপ যান এবং জিপিইউ পাশ ডেটা জমা ইত্যাদি): আপনি কি এটিকে শুধুমাত্র একবার পাঠাতে এবং তারপর একটি হ্যান্ডল করে এটি পড়ুন। আপনি প্রতিটি ফ্রেমে একই ডেটা বার বার প্রেরণ না করে ব্যান্ডউইথকে সংরক্ষণ করেন।


6

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

একটি ভার্টেক্স বাফার অবজেক্টটি ব্যবহার করে, আপনি যখন ড্রাইভারটি ব্যবহার করার প্রয়োজন হবে তার আগে একটি (আশায়) বড় পরিমাণের ডেটা সরবরাহ করছেন। এটি বেশ কয়েকটি অপ্টিমাইজেশন (পুনরায় ফর্ম্যাট করা, ভিডিও মেমোরিতে রেখে) করতে পারে পাশাপাশি জিপিইউ টুকরোয়াল খাওয়াতে না পারে।

অনুশীলনে আপনি যদি কেবলমাত্র কয়েকটি সংখ্যক আদিম অঙ্কন করেন তবে সম্ভবত এটি খুব বেশি তাত্পর্যপূর্ণ হবে না, তবে আপনি যদি বহু মিলিয়নের ত্রিভুজ জাল আঁকেন তবে ভিডিও মেমোরিতে VBOs যাওয়ার উপায়।

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