ওপেনজিএলটি আসলে স্ক্রিনটি আপডেট করতে কত সময় নেয়?


9

আমার সিতে একটি সহজ ওপেনএল পরীক্ষা অ্যাপ্লিকেশন রয়েছে যা কী ইনপুটটির প্রতিক্রিয়ায় বিভিন্ন জিনিস আঁকবে। (মেসা 8.0.4, এনভিআইডিএ জিটিএক্স 650 সহ একটি পিসিতে মেসা-ইজিএল এবং জিএলএফডাব্লু, উবুন্টু 12.04LTS দিয়ে চেষ্টা করেছেন)। আঁকাগুলি বেশ সহজ / দ্রুত (ধীরে ধীরে ত্রিভুজ ধরণের ধরণের জিনিস)। আমার পরীক্ষার কোডটি কোনওভাবেই ফ্রেমরেটকে ইচ্ছাকৃতভাবে সীমাবদ্ধ করে না, এটি কেবল এটির মতো দেখাচ্ছে:

while (true)
{
    draw();
    swap_buffers();
}

আমি এটি খুব সাবধানতার সাথে টাইম করেছি এবং আমি দেখতে পেয়েছি যে পরের দিকে eglSwapBuffers()(বা glfwSwapBuffersএকই জিনিস) কল করার সময়টি 16.6 ডলার is মিলিসেকেন্ড। eglSwapBuffers()পরবর্তী কল করার আগে কল করার পরে ঠিক সেই সময়ের চেয়ে সামান্য কিছুটা কম, যদিও আঁকানোটি খুব সহজ। অদলবদ বাফার কলটি যে সময় নেয় তা 1 মিমি অবধি কম।

যাইহোক, অ্যাপ্লিকেশন থেকে কী পর্দার প্রতিক্রিয়া হিসাবে এটি চিত্র অঙ্কন করছে তার পরিবর্তনের সময়টি আসলে পর্দায় প্রদর্শিত হচ্ছে> 150 মিমি (প্রায় 8-9 ফ্রেমের মূল্য)। এটি 60fps এ স্ক্রিন এবং কীবোর্ডের একটি ক্যামেরা রেকর্ডিং দিয়ে পরিমাপ করা হয়।

অতএব, প্রশ্নগুলি:

  1. বাফারগুলিকে অদলবদল করার কলটির মধ্যে এবং কোথায় আসলে স্ক্রিনে প্রদর্শিত হচ্ছে তার মধ্যে কোথায় আঁকবে? দেরি কেন? এটি নিশ্চিতভাবে দেখে মনে হচ্ছে অ্যাপটি সর্বদা স্ক্রিনের সামনে অনেকগুলি ফ্রেম আঁকছে।

  2. ওপেনজিএল অ্যাপ্লিকেশনটি স্ক্রিনে তাত্ক্ষণিক অঙ্কনের কারণ হতে পারে? (যেমন: কোনও বাফারিং নেই, ড্র শেষ হওয়া অবধি কেবল অবরুদ্ধ করুন; আমার উচ্চ থ্রুপুট লাগবে না, আমার কম বিলম্বের দরকার নেই)

  3. উপরোক্ত তাত্ক্ষণিক অঙ্কনটি যত তাড়াতাড়ি সম্ভব ঘটানোর জন্য একটি অ্যাপ্লিকেশন কী করতে পারে?

  4. কোনও অ্যাপ্লিকেশন কীভাবে জানতে পারে যে এখনই পর্দায় আসলে কী রয়েছে? (বা, বর্তমান বাফারিং বিলম্বটি কতক্ষণ / কত ফ্রেম?)


কীবোর্ডটি আপনার অ্যাপ্লিকেশনটি যে সময়টি প্রয়োগ করতে সময় লাগে তার সাথে সময় দেওয়ার জন্য সময়টি আলাদা করতে পারে?
ThorinII

@ থোরিনিআইআই: ফেয়ার পয়েন্ট অ্যাপ্লিকেশনটি কী কী টিপ দেয় আসলে তার ইঙ্গিত পেতে আমি সম্ভবত একটি সমান্তরাল বন্দর ইত্যাদিতে একটি এলইডি ব্যবহার করে হ্যাকি কিছু সেট আপ করতে পারি। তবুও, এটি কেবল fgetc (স্টিডিন), এটি কত ধীর হতে পারে? : /
অ্যালেক্স আমি

আমি এই ছাপে ছিলাম যে সমস্ত কমান্ডের তাত্ক্ষণিকভাবে ফ্লাশ তৈরি করতে glFlush ব্যবহৃত হয়েছিল।
প্রোগ্রামমুদে


1
@ কনসেপ্ট 3 ডি: হ্যাঁ, এটির মূলত উত্তর দেওয়া হয়েছে, কেবল ভেবেছিলেন আপনি কিছু অতিরিক্ত প্রতিনিধি চাইবেন :) সম্ভবত এটির পুরস্কার দেওয়ার জন্য আমাকে একদিন অপেক্ষা করতে হবে।
অ্যালেক্স আমি

উত্তর:


6

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

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

এবং মনে রাখবেন যে glFlushএবং এর মধ্যে পার্থক্য রয়েছে glFinish

glFlush: ইঙ্গিত দেয় যে জিএল এর আগে প্রেরণ করা সমস্ত কমান্ডের অবশ্যই সীমাবদ্ধ সময় শেষ করা উচিত।

glFinish: পূর্ববর্তী সমস্ত জিএল কমান্ডগুলি সম্পূর্ণ করতে বাধ্য করে। জিএল ক্লায়েন্ট এবং সার্ভারের স্থিতিতে এবং ফ্রেমবফারটিতে পূর্বে জারি করা আদেশগুলি থেকে সমস্ত প্রভাব পুরোপুরি উপলব্ধি না করা অবধি সমাপ্তি ফিরে আসে না। "

glXWwapBuffers এটি ফিরে আসার আগে একটি অন্তর্নিহিত glFlush সম্পাদন করে। পরবর্তী ওপেনএল কমান্ডগুলি glXSwapBuffers কল করার পরে অবিলম্বে জারি করা যেতে পারে, তবে বাফার এক্সচেঞ্জটি শেষ না হওয়া পর্যন্ত কার্যকর করা হয় না।

আসল ফ্রেম সময়টি সম্ভবত সম্ভবত দুটি সিপিইউ / জিপিইউ এর কাজ শেষ করতে আরও বেশি সময় নিচ্ছে তার দ্বারা নির্ধারিত হবে।


এটি খুব সহায়ক। কিছু সম্ভাব্য সংশোধন: ওপেনগল.আর । স্বপ বাফার ফিরে এলে এতে স্টাফ দেয়।
অ্যালেক্স আমি

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

both low framerate (exactly same as monitor refresh rate??আপনি স্পষ্টভাবে ভিএসআইএনসি ব্যবহার না করা না করে অ্যালেক্সআই নেই।
ধারণাগুলি 3

@ অ্যালেক্সআই আমি এও নির্দেশ করতে চাই যে ফ্রেমের সময়টি এফপিএস থেকে আলাদা, আপনার অ্যাপ্লিকেশনটি প্রোফাইল করার জন্য ফ্রেমের সময় ব্যবহার করুন কারণ এটি রৈখিক। অন্যদিকে FPS হ'ল একটি দরিদ্র পরিমাপ যা লিনিয়ার নয় not
ধারণাগুলি

আমি স্পষ্টতই vsync ব্যবহার করছি না। আমি ডিফল্ট ভিএসএনসি সেটিংস পরিবর্তন করতে কিছু করছি না, ওপেনগিএলগুলিতে কোথায় পরিবর্তন করা যায় তা আমি জানি না। আমি ঠিক 60fps পাই (এক শতাংশের মধ্যে)।
অ্যালেক্স আমি

4

ওপেনজিএল প্রযুক্তিগতভাবে স্ক্রিনটি কখনই আপডেট করে না।

GL (যেমন GLX, WGL, CGL, EGL) থেকে পৃথক একটি উইন্ডো সিস্টেম API রয়েছে যা এটি করে does এই এপিআইগুলি ব্যবহার করে বাফার সোয়াপগুলি সাধারণত স্পষ্টভাবে অনুরোধ করে glFlush (...)তবে কিছু বাস্তবায়নে (যেমন উইন্ডোজে জিডিআই রাস্টারাইজার) এটি একটি পূর্ণতা দেয় glFinish (...):

 

    * বাম দিকে, আইসিডি (হার্ডওয়্যার) দিয়ে যাওয়ার পথটি SwapBuffers (...)। ডানদিকে, জিডিআই (সফ্টওয়্যার) পাথ।

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

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


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

"বেশিরভাগ জিএল উইন্ডো সিস্টেম এপিআই (0 টি একক বাফার বা 1 টি ডাবল-বাফার বাদে) দ্বারা ব্যবহৃত ব্যাক বাফারগুলির সংখ্যা স্পষ্টভাবে নিয়ন্ত্রণ করুন" - কীভাবে একজন একক / ডাবল বাফার নিয়ন্ত্রণ করতে পারে?
অ্যালেক্স আমি

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

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

1

আমি ধরে নিই যে আপনি এই পরীক্ষার সাথে পরিচিত ?

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

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