আধুনিক গেমগুলিতে ডাবল বা ট্রিপল বাফারিং কী সমস্যার সমাধান করে?


31

ডাবল (বা ট্রিপল) বাফারিংয়ের কারণগুলির সম্পর্কে আমার বোঝা সঠিক কিনা তা আমি যাচাই করতে চাই:

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

যদি আমি এখন একটি গেম চালনা করি তবে এই গেমটি এই ভিডিও মেমোরিটি নিয়মিত চালাচ্ছে।

যদি এই গেমটি কোনও বাফার কৌশল (ডাবল বাফারিং ইত্যাদি) ব্যবহার না করে তবে নিম্নলিখিত সমস্যাটি ঘটতে পারে:

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

বাফার কৌশল ব্যবহারের ক্ষেত্রে আমার বোঝাপড়াটি কি সঠিক? অন্যান্য কারণ আছে?

উত্তর:


62

মৌলিকভাবে, রেন্ডারিংয়ের মূল লক্ষ্য হ'ল মনিটরে প্রদর্শিত প্রতিটি ফ্রেমের একটি একক, সুসংগত চিত্র উপস্থাপনের জন্য। এটি অর্জনের জন্য কয়েকটি বিভিন্ন কৌশল ব্যবহার করা হয়েছে, বা ছিল।

নীচে, আমি "vsync" উল্লেখ করছি। ভিসিএনসি হ'ল সেই মুহুর্তে মনিটর একটি নতুন স্ক্রিন চিত্র আঁকতে শুরু করে; এটি সেই বিন্দু যেখানে "vblank" একটি aতিহ্যবাহী সিআরটি স্ক্রিনে শুরু হয়, যেখানে স্ক্যানলাইনটি মুহূর্তে অঙ্কন থামিয়ে মনিটরের শীর্ষে ফিরে যায়। এই মুহুর্তটি একত্রিত করার জন্য অনেক পদ্ধতির পক্ষে খুব গুরুত্বপূর্ণ।

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

শূন্য-বাফার

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

একক-বাফার

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

সাধারণভাবে, আপনি স্ক্যানলাইনটি "ল্যাপস" করার আগে আপনি আবার ঘুরে আসার আগে এবং পিক্সেলগুলি যে আপনি আঁকছেন সেগুলি ছাড়িয়ে যাওয়ার আগে , এবং স্ক্যানলাইনটির সামনে কখনই এগিয়ে আসার আগে নেক্সট ফ্রেমের চিত্র অঙ্কন শেষ করার চেষ্টা করছেন your ফ্রেমটি আগের ফ্রেমের কী হওয়া উচিত তা আঁকতে পারে।

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

নোট করুন যে আধুনিক অপারেটিং সিস্টেমে আপনার সাধারণত সাধারণত একক-বাফার আঁকার কোনও সুযোগ নেই, যদিও এটি ত্রিশ বছর আগে মোটামুটি প্রচলিত ছিল। (গোশ আমি এখনই পুরানো বোধ করি - গেম ডেভলপমেন্টে প্রথম যখন শুরু করছিলাম তখন আমি এটি করছিলাম)

ডাবল বাফার

এটি যে কৌশলগুলির আগে এসেছে তার থেকে অনেক বেশি সহজ।

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

আমরা পিছনের বাফারে একটি স্ক্রিন চিত্র অঙ্কন শেষ করার পরে, আমরা vsync না হওয়া পর্যন্ত অপেক্ষা করব এবং তারপরে দুটি বাফারটি স্যুপ করব। এইভাবে, পিছনের বাফারটি সামনের বাফারে পরিণত হয় এবং তদ্বিপরীত হয়ে যায়, এবং মনিটরটি কিছু অঙ্কন না করার সময় পুরো অদলবদল ঘটেছিল।

ট্রিপল বাফার

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

ট্রিপল-বাফার সিস্টেমে আমরা তিনটি বাফার তৈরি করি - একটি ফ্রন্ট বাফার এবং দুটি ব্যাক বাফার। ধারণাটি হ'ল:

মনিটরটি সামনের বাফারটি প্রদর্শন করছে এবং আমরা পিছনে বাফার # 1 এ আঁকছি। যদি আমরা মনিটরটি সামনের বাফারটি অঙ্কন শেষ করার আগে # 1 এর পিছনে অঙ্কন শেষ করি, তবে vsync এর জন্য অপেক্ষা না করে, আমরা তত্ক্ষণাত্ পরবর্তী ফ্রেমটিকে ব্যাক বাফার # 2 এ আঁকতে শুরু করি। যদি আমরা শেষ করি এবং এখনও ভিএনসিএন না আসে তবে আমরা পিছনে বাফার # 1 এ আবার আঁকতে শুরু করি। ধারণাটি হ'ল যখন ভিআইএনসিএন অবশেষে ঘটে, তখন আমাদের বা পিছনের একটি বা অন্যটি সম্পূর্ণ হবে এবং সামনের বাফারের জন্য এটি স্যুপআপ করা যেতে পারে।

ট্রিপল-বাফারিংয়ের সুবিধাটি হ'ল আমরা দ্বিগুণ-বাফারিং পদ্ধতির জন্য ভিএনসিঙ্কের জন্য অপেক্ষা করতে যে সময়টি কাটিয়েছি তা হারাব না এবং সামনের বাফারে যে চিত্রটি স্বেচ্ছাসেবীর জন্য অপেক্ষা করা হয়েছিল তার চেয়ে "নতুন" হতে পারে for 8ms। ট্রিপল-বাফারিংয়ের ডাউন-সাইডটি হ'ল অতিরিক্ত স্ক্রিন চিত্র সংরক্ষণের জন্য আমাদের অতিরিক্ত মেমরি দরকার এবং আমাদের সিপিইউ / জিপিইউ ব্যবহার আরও বেশি হবে (আবার, যেহেতু আমরা ভিএসএনসি অপেক্ষা করতে ধীর করি না)।

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

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


7
এটি একটি অবিশ্বাস্যভাবে বিস্তৃত উত্তর, এবং ব্যাখ্যা করে যে কেন অনেক কিছুই সেভাবে করা হয় (পর্দার স্থানাঙ্কের জায়গার মতো)। এছাড়াও আমার প্রশ্নের উত্তর দিয়েছিল "বাফার চতুর্থাংশ কেন নয়? কুইন্টুপল?" আমি বুঝতে পারি নি যে বাফার অদলবদলটি পটভূমিতে ঘটেছিল যার অর্থ দুটি ব্যাক বাফার সর্বাধিক প্রয়োজনীয়। সম্মত।
লাঞ্চমিট317

আসলে এখানে কোয়াড বাফারিং রয়েছে। এটি স্টেরিওস্কোপিক দেখার জন্য ডাবল বাফারিং। swiftless.com/tutorials/opengl/smooth_rotation.html
Narek

@ নরেক নং আপনার লিঙ্কটি থেকে উদ্ধৃত: "কম্পিউটার গ্রাফিক্স পরিবেশে আপনি প্রকৃত কোয়াড বাফারিং সত্যিই সক্ষম করতে পারবেন না কারণ এর আসল বিন্দু নেই"। একই সাথে দুটি ভিন্ন ভিউতে ডাবল বাফারিং করা "কোয়াড বাফারিং" হবে বলে মনে হচ্ছে কেবল মজাদার ওয়ার্ডপ্লে; বাস্তব কিছু না।
ট্রেভর পাওয়েল

@ ট্র্যাভারপোয়েল অংশটি যুক্ত করতে ভুলে গিয়েছিলেন: "ভাল, সাধারণত কোয়াড বাফারিং বলতে একটি স্টেরিওস্কোপিক পরিবেশে ডাবল বাফারিং বোঝায় Eg এখন প্রসঙ্গটি আরও পরিষ্কার হতে পারে।
নেরেক

@ ট্রেভরপওয়েল আপনার বক্তব্যটি পুরোপুরি পরিষ্কার clear একটি রেন্ডার বাফারের জন্য 3 টিরও বেশি বাফার থাকার অর্থ নেই।
নেরেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.