কেন এই জ্যামিতি শেডার আমার প্রোগ্রামটিকে এত ধীর করে দেয়?


27

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

আমি জ্যামিতি শেডার যুক্ত করার আগে, যখন আমি কেবল পাইপলাইনের খণ্ড এবং ভার্টেক্স শেডিং পদক্ষেপগুলি প্রোগ্রাম করছিলাম, আমি প্রায় 30+ ফ্রেমরেট পাচ্ছিলাম। যথেষ্ট যে আমি কোনও চপ্পল লক্ষ্য করতে পারি না। জ্যামিতি শেডার যুক্ত করার পরে, আমি প্রতি সেকেন্ডে প্রায় 5 ফ্রেম পাই। কেন? এটি জ্যামিতি শেডারের সম্পূর্ণতা:

#version 420

layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;

void main()
{
    for (int i = 0; i < gl_in.length(); i++)
    {
        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
    }
    EndPrimitive();
}

জ্যামিতির শেডার ব্যতীত ওপেনজিএল এটি কি করছিল?

উত্তর:


40

জ্যামিতির শেডার ব্যতীত ওপেনজিএল এটি কি করছিল?

না, তা নয়। জিএস একটি হল ঐচ্ছিক ধাপ, না একটি পদক্ষেপ একটি ডিফল্ট রয়েছে।

ওপেনজিএল জ্যামিতি শেডার চালিত করার জন্য , এটি অবশ্যই " আদিম সমাবেশ " নামে পরিচিত যা করতে হবে । যখন আপনি এর মাধ্যমে ত্রিভুজগুলির একটি সিরিজ রেন্ডার করেন GL_TRIANGLE_STRIP, ওপেনজিএল প্রতিটি 3 সংলগ্ন শীর্ষকে একটি পৃথক ত্রিভুজে রূপান্তর করতে অভ্যন্তরীণ স্টাফ করবে, ঘুরানো ক্রমটি যথাযথভাবে পরিবর্তন করে।

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

সুতরাং এখন আপনি সিস্টেমটি তৈরি করছেন মূলত কিছুই না করে একগুচ্ছ অতিরিক্ত কাজ। সর্বোপরি, ওপেনজিএল ধরে নিতে পারে না যে আপনার জিএস কিছুই করছে না (এটি একটি অনির্বচনীয় সমস্যা)।

তদ্ব্যতীত, জিএসের উপস্থিতিতে বেশ কয়েকটি অপ্টিমাইজেশন কাজ করে না। সূচিকৃত রেন্ডারিং বিবেচনা করুন।

একটি উপাদান অ্যারে বাফার থেকে প্রতিটি সূচী একটি ভার্টেক্স শ্যাডার থেকে একই আউটপুট উত্পাদন করবে। সুতরাং জিপিইউ প্রায়শই এই ফলাফলগুলি পোস্ট-টি ও এল ক্যাশে ক্যাশে রাখে । যদি এটি ইতিমধ্যে ক্যাশে থাকা কোনও সূচকটি দেখে তবে ভিএস আবার চালানো হবে না; এটি কেবল ক্যাশে থেকে ডেটা আনে।

এটা কি"? "এটি" হ'ল ... আদিম সংসদীয় ইউনিট । হ্যাঁ, আপনি যখন জিএস ব্যবহার করেন তখন যা সেই জিনিসটি দুবার চালিত হয়। সূচি ক্যাচিং স্টাফ? এটি কেবল জিএস এর ইনপুটগুলির জন্য কাজ করে।

তাহলে জিএস এর ফলাফলগুলি কী ঘটে? ওয়েল, এটি হার্ডওয়্যার নির্ভর। তবে এটি কোনও ধরণের মেমরি বাফারে যেতে হবে। এবং এর মধ্যে সমস্যাটি রয়েছে: যে বাফারটি মোটেই সূচিযুক্ত নয়। এটি একটি glDrawArrays পরিস্থিতি মত।

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

এটি অকেজো ছিল না, তবে এটি আঘাত করে।

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

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

জিএস-প্ররোচিত মন্দা সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটি পড়ুন

জিএস সম্পর্কে থাম্বের একটি প্রাথমিক নিয়ম: এখানে কখনও জিএস ব্যবহার করবেন না কারণ আপনি মনে করেন এটি দ্রুততর উপস্থাপন করবে । আপনি যখন চেষ্টা করার চেষ্টা করছেন তখন এটি আপনার ব্যবহার করা উচিত আপনি যা করতে চেষ্টা করছেন তা যদি একটি অপ্টিমাইজেশন হয় তবে অন্য কিছু ব্যবহার করুন।

এর সাধারণ ব্যতিক্রমগুলি হ'ল:


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

1
@ অবি দ্রষ্টব্য যে একটি ত্রিভুজের সর্বোচ্চ এবং সর্বনিম্ন পয়েন্টগুলি আপনাকে এর খাড়াতা দেবে না; আপনার তিনটি পয়েন্ট দরকার।
সাম হোচেভার

2
ব্যক্তিগতভাবে আমি সর্বদা জিএসের চেয়ে পয়েন্ট স্প্রাইটের জন্য আরও দরকারী উপকারী খুঁজে পেয়েছি।
ম্যাক্সিমাস মিনিমাস

1
পয়েন্ট স্প্রেটসের ব্যতিক্রমগুলি ছায়ার ছায়ায় জেনারেল করে layout(points) in;? নাকি এটি স্থির আউটপুট আকার? নাকি সম্ভবত দুজনেই?
ফিলিপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.