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


9

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

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

কেন? ঠিক আছে, আমার কাছে 200 (বা আরও) গেম অবজেক্ট রয়েছে এবং সেগুলি প্রতি সেকেন্ডে 60 বার আপডেট হয়। প্রতিটি ফ্রেমে আমাকে সিপিইউতে উল্লম্বের জন্য নতুন অবস্থান (অনুবাদ এবং রোটেশন) গণনা করতে হবে (মোবাইল প্ল্যাটফর্মের জিপিইউ তাত্ক্ষণিক সমর্থন করে না তাই আমি এটি করতে পারি না), এবং প্রতি সেকেন্ডে 48000 করে (২০০ * 60 * 4) প্রতিটি স্প্রাইটের 4 টি শীর্ষ বিভাজন রয়েছে) কেবল খুব ধীর বলে মনে হচ্ছে।

পারফরম্যান্স উন্নত করতে আমি কী করতে পারি? সমস্ত গেমের অবজেক্টগুলি প্রতিটি ফ্রেমে চলন্ত / ঘোরানো (প্রায়) হয় তাই আমাকে সত্যই ভার্টেক্স অবস্থানগুলি পুনরায় গণনা করতে হবে। কেবলমাত্র অপ্টিমাইজেশন যা আমি ভাবতে পারি তা ঘূর্ণনের জন্য একটি সারণী যা আমি তাদের গণনা করতে না পারি। স্প্রেটসকে সহায়তা করবে? কোন কদর্য হ্যাক? আর কিছু?

ধন্যবাদ।

উত্তর:


5

আপনি কি অ্যান্ড্রয়েডের জন্য আমার পোর্ট ইরিলিচটি ব্যবহার করেছেন? অ্যান্ড্রয়েড এবং আইফোনে 2 ডি স্প্রিটের জন্য আমি আপনার মতো একই কৌশল ব্যবহার করি: ব্যাচিং। আমি ওপেনজিএল ইএস 1.x এবং 2.x এ অনেকগুলি সমাধান চেষ্টা করি:

  • জেড (প্যারাল্যাক্স) এবং টেক্সচার অনুসারে বাছাই করুন, সিপিইউতে ট্রান্সফর্মেশন করুন এবং glDrawArrays বা glDrawElements (দ্রুততম উপায়) কল করুন। আপনি যদি পারেন তবে একটি বড় টেক্সচার ব্যবহার করুন।
  • ভিবিওর সাথে একই কৌশল, দ্রুত নয় কারণ প্রতিটি ফ্রেমের জন্য আপনি সমস্ত তথ্য রিফ্রেশ করেন। এটি স্ট্যাটিক্স স্প্রাইটের জন্য কার্যকর হতে পারে।
  • ওপেনজিএল ইএস ২.x ব্যবহার করুন এবং গণনা পজিশনে ভার্টেক্স শ্যাডার ব্যবহার করুন (ধীর)
  • পয়েন্টস্প্রিটস ব্যবহার করুন (এটি কোনও বর্গক্ষেত্র না হলে এবং কোনও সমাধান নয়) অনেকগুলি স্বচ্ছ পিক্সেল পূরণ করতে পারে)
  • gldrawtexoes এক্সটেনশন ব্যবহার করুন ...
  • প্রতিটি স্প্রাইটের জন্য একটি ড্রয়াকল ব্যবহার করুন (ধীরতম পদ্ধতি)

সুতরাং আপনার মতো, সমস্ত রূপান্তরগুলি সিপিইউ দ্বারা ওজলেএস 1.x বা ওজিএলএস 2.x এর জন্য সম্পন্ন হয়েছে। আপনার যদি নিয়ন নির্দেশনা থাকে তবে আপনি এটি আপনার কম্পিউটারের গতি বাড়ানোর জন্য ব্যবহার করতে পারেন।

পিএস: আইফোন বা অ্যান্ড্রয়েড ডিভাইসে, আমি সিপিইউ সীমাবদ্ধ নই তবে পূরণের হার সীমাবদ্ধ। সুতরাং ওভারড্র সীমাবদ্ধ করা খুব গুরুত্বপূর্ণ।


দুর্দান্ত, এটি এমন কিছু যা আমি খুঁজছিলাম। আমি আপনার ইরলিচ্ট বন্দর সম্পর্কে অবগত ছিলাম না তবে ইতিমধ্যে আইওএস-এ চালানো ইরলিখিটের আমার সংস্করণটি রয়েছে। আপনি বলছেন আপনি সিপিইউ সীমাবদ্ধ নন - আপনি কত স্প্রিট আঁকছেন? আইফোনটিতে 100 টি স্প্রিটের জন্য কী বলুন আপনার ফ্রেমরেটগুলি কী? আমার যদি 200 টি অবজেক্ট থাকে তবে আমি প্রতি সেকেন্ডে 48000 গণনা করে শেষ করব। পূরণ সম্পর্কে আপনার বক্তব্য ভাল।
user4241

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

আমি একটি কণা ইঞ্জিনে কাজ করছি, যা আমি সিপিইউতে সমস্ত পজিশন কম্পিউটিংয়ের সাথে 20,000 অবধি পার্টিকুলস ব্যবহার করতে পারি এবং আমার চরম সেটিংসের সাথে 10fps রয়েছে (3 জিএস এবং আইফোন 4 এ)। সুতরাং ভাল ফ্রেমরেট সহ 3 জি এস বা আইফোন 4 এ 1000 স্প্রাইট অবশ্যই পাওয়া সম্ভব।
এলিস

আপনাকে অনেক ধন্যবাদ! আপনি আপনার কণা ইঞ্জিন বাস্তবায়ন করছেন? আমি মনে করি আপনি ছায়ার সাথে খেলছেন?
user4241

আমি শেডারগুলি ব্যবহার করি কারণ প্রতিটি কণার আকার সেটআপ করতে আমার গ্লোপয়েন্টিন্ট সাইজ প্রয়োজন। আমি OGLES 1.x নিয়ে আর কাজ করি না কারণ পুরানো ফোনগুলি আমার লক্ষ্য নয়। প্রথমত, আমার সমস্ত কোডটি ছিল OGLES 1.x, তারপরে OGLES 1.x এবং OGLES 2.x (কোনও কার্যকারিতা উন্নতি নয়) এবং এখন OGLES 2.x (রেন্ডারিং উন্নতি)।
এলিস

1

আমি কোনও ভিবিও রাখার পরামর্শ দিচ্ছি, প্রতিটি রেন্ডার অবজেক্টের অবস্থান / ঘূর্ণন এবং প্রতিটি টেক্সচারের উপর ভিত্তি করে ব্যাচিংয়ের মতো ভার্টেক্স সহ আপনি যা করছেন তার উপর ভিত্তি করে। আমি ogl ES এর সাথে খুব বেশি পরিচিত নই, তাই এটি glsl এর কোন সংস্করণ সমর্থন করে তা আমি নিশ্চিত নই, তবে আপনি এমনকি টেক্সচারের একটি সেটের উপর ভিত্তি করে ব্যাচ করতে সক্ষম হতে পারেন এবং আপনি যে 4 বা তত টেক্সচারগুলি পাশ করছেন তা সংরক্ষণ করতে পারেন আপনি ভার্টেক্স এর ভিতরে ব্যবহার করা চাই। পয়েন্ট স্প্রাইটগুলি অবশ্যই আপনার পারফরম্যান্সকে উন্নত করবে কারণ এটি আপনাকে যে পরিমাণ ডেটা পাঠিয়ে দিচ্ছে তা হ্রাস করবে এবং আপনি যদি সঠিকভাবে এটি করছেন তবে ব্যাচিং কখনই কর্মক্ষমতা হ্রাস করে না। এছাড়াও, আপনি শেডারে ঘূর্ণন গণনা করে এবং কেবল প্যারামগুলিতে বা ভার্টেক্সের অভ্যন্তরে কেবল কোনও ইনট / ফ্লোট মানটি দিয়ে পারফরম্যান্সকে কিছুটা উন্নত করতে পারেন। (প্যারামগুলি দ্রুত হবে,


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

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

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

1

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

সেক্ষেত্রে আপনি এখনও সিউডো ইনস্ট্যান্সিং করতে পারেন, এটি খুব দ্রুত। কোণার পয়েন্টগুলি (স্প্রাইটের কেন্দ্র বিন্দুর সাথে সম্পর্কিত, যেমন -1 / -1, 1 / -1, 1/1, -1/1) এবং আপনার প্রয়োজনীয় কোনও টেক্সচার সমন্বয় সহ একটি ভিবিও (GL_STATIC_DRAW) করুন ।
তারপরে স্প্রাইটের কেন্দ্রবিন্দুতে প্রতিটি ড্র কলের জন্য একটি জেনেরিক শীর্ষ শীর্ষ বৈশিষ্ট্য সেট করুন এবং বাফার বাউন্ডের সাথে দুটি ত্রিভুজ আঁকুন। ভার্টেক্স শ্যাডারের অভ্যন্তরে, জেনেরিক ভার্টেক্স গুণাবলী পড়ুন এবং ভার্টেক্সের স্থানাঙ্কগুলি যুক্ত করুন।

এটি আপনাকে প্রতিটি স্প্রাইটের জন্য ডেটা স্থানান্তর করতে বাধা দেবে এবং এটি আরও দ্রুত হওয়া উচিত। ড্র কলগুলির আসল সংখ্যাটি এত মারাত্মক গুরুত্বপূর্ণ নয়, এর মধ্যে ব্লকিং / স্টলিং হয়।


ওপেনজিএল ইএস 2.0 এর জন্য এটি ভাল সমাধান বলে মনে হচ্ছে। দুর্ভাগ্যক্রমে আমি ইএস 1 ব্যবহার করছি যা শেডারগুলিতে মোটেই নেই।
user4241

0

আপনি প্রতিটি ফ্রেমে জিপিইউতে যে পরিমাণ ডেটা পাঠাচ্ছেন তাতে সমস্যাটি থাকে। প্রতিটি ব্যাচের জন্য কেবল একটি ভিবিও তৈরি করুন এবং এটি একবার পপুলেট করুন, তারপরে ব্যাচগুলি আঁকানোর সময় সংশ্লিষ্ট ট্রান্সফর্মেশন ম্যাট্রিকগুলি প্রয়োগ করুন (glMultMatrix এর মাধ্যমে, বা একটি শেডার আপনি যদি ES 2.0 ব্যবহার করছেন)।


আমি বুঝতে পারি না যখন আমার 200 টি পৃথক গেম অবজেক্টের সাথে অনন্য রূপান্তর রয়েছে তখন এটি কীভাবে সাহায্য করবে? GlMultMatrix ব্যবহার করে সমস্ত বস্তুর ক্ষেত্রে একই রূপান্তর প্রয়োগ করা হবে যা আমি চাই না। এছাড়াও, জিপিইউতে ডেটা প্রেরণ কোনও বাধা নয়; যদি আমি সিপিইউ-সাইড ট্রান্সফর্মেশনগুলি সরিয়ে ফেলি তবে পারফোনেন্স খুব ভাল।
ব্যবহারকারী4241

হ্যাঁ, তবে কোনও ভিবিও সঠিকভাবে প্রয়োগ করা থাকলে কর্মক্ষমতা উন্নত করতে পারে। আপনি বর্তমানে কীভাবে আপনার 200 টি জিনিস সরবরাহ করছেন? আপনি কি glBegin / glEnd ব্যবহার করছেন?
দ্যBuzzSaw

1
আমি কাস্টম সিন নোডের সাথে ইরলিচ্ট 3 ডি ইঞ্জিন ব্যবহার করছি তাই আমি সরাসরি ওপেনএল ব্যবহার করছি না (তবে আমি মনে করি এটি এ ক্ষেত্রে সহজ গ্লোবেগিন / গ্ল্যান্ড ব্যবহার করছে)। আমাকে কি প্রতিটি ফ্রেমে পুরো বাফারটি সংশোধন করতে হবে তাই ভিবিও সত্যই সহায়তা করবে? এছাড়াও, এটি ভার্টেক্স ট্রান্সফর্ম গণনার কারণে সিপিইউ-আবদ্ধ হওয়া সম্পর্কে মৌলিক সমস্যার সমাধান করে না। তবে যাইহোক আপনার উত্তরগুলির জন্য আপনাকে ধন্যবাদ!
user4241
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.