ওপেনগল: গ্লোফ্লাশ () বনাম গ্লফিনিশ ()


105

কলিং glFlush()এবং এর মধ্যে ব্যবহারিক পার্থক্যটি আলাদা করতে আমার সমস্যা হচ্ছে glFinish()

দস্তাবেজগুলি এটি বলে glFlush()এবং glFinish()সমস্ত বাফার অপারেশনগুলিকে ওপেনজিএলে চাপ দেবে যাতে একজনকে নিশ্চিত করা যায় যে তাদের সকলের মৃত্যুদণ্ড কার্যকর করা হবে, glFlush()তফাতটি তত্ক্ষণাত্ ফিরে আসে যেখানে glFinish()সমস্ত অপারেশন সম্পূর্ণ হওয়া অবধি অবরুদ্ধ হয়ে যায় as

সংজ্ঞাগুলি পড়ে, আমি বুঝতে পেরেছিলাম যে আমি যদি এটি ব্যবহার glFlush()করতে পারি তবে আমি সম্ভবত ওপেনজিএল সম্পাদন করার চেয়ে আরও বেশি অপারেশন জমা দেওয়ার সমস্যায় পড়তে চাই। সুতরাং, কেবল চেষ্টা করার জন্য, আমি আমার এবং একবারের glFinish()জন্য নিজেকে সরিয়ে ফেললাম glFlush()এবং দেখুন, আমার প্রোগ্রামটি চলছে (ঠিক যতদূর আমি বলতে পারি), ঠিক একই; ফ্রেম রেট, রিসোর্সের ব্যবহার, সবকিছু একই ছিল।

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

আমার কোডটি সাধারণত গেম লুপ:

while (running) {
    process_stuff();
    render_stuff();
}

উত্তর:


93

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

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

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


1
আপনার অর্থ কী যে glFlush "অবশ্যই FINITE টাইমে শেষ করতে হবে" এবং তারপরে পরে বলতে হবে যে glFlush শ্বাসরোধ করবে না কারণ "আপনার আদেশগুলি প্রসেস করতে এটি কোনও সময় নিতে পারে"? (ক্যাপস মাইন) সেগুলি কি পারস্পরিক একচেটিয়া নয়?
প্রেক্সাইটেলস

1
যতক্ষণ না এটি কোনও পর্যায়ে শেষ হয় এটি FINITE সময়ের মানদণ্ড পূরণ করে। কিছু ড্রাইভার পুরোপুরি এই কলটি কোনও বিকল্প নেই।
খ্রিস্টবার্জ

অদলবদল প্রসঙ্গ নির্দিষ্ট এবং শুধুমাত্র কলিং থ্রেড প্রসঙ্গে ফ্লাশ করা প্রয়োজন। যদি একাধিক প্রসঙ্গ রেন্ডার করা হয় তবে ম্যানুয়ালি প্রতিটি ফ্ল্যাশ করা উচিত কারণ এটি অন্য প্রসঙ্গের মাধ্যমে বাফারদের অদলবদল করার সময় ঘটে যাওয়া গ্যারান্টিযুক্ত নয়।
Andreas

22

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


18

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

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

নীচে আমরা ব্যবহার করে একটি উদাহরণ দেখতে পাচ্ছি glFinish()। এটি প্রায় একইরকম কাজ করে glFlush(), ব্যতীত এটি কলিং থ্রেডটিকে হার্ডওয়্যার দ্বারা সমস্ত কমান্ড প্রক্রিয়া না করা পর্যন্ত অপেক্ষা করে তোলে।

"ওপেনজিএল ব্যবহার করে অ্যাডভান্সড গ্রাফিক্স প্রোগ্রামিং" বইটি থেকে নেওয়া চিত্র।


আমি আসলে কী glFlushএবং কী জানি এবং glFinishসেই চিত্রটি কী বলছে তা আমি বলতে পারি না। বাম দিকে এবং ডানদিকে কি আছে? এছাড়াও, সেই চিত্রটি কি পাবলিক ডোমেনে প্রকাশ করা হয়েছিল বা কোনও লাইসেন্সের অধীনে যা আপনাকে এটি ইন্টারনেটে পোস্ট করতে দেয়?
নিকল বোলাস

আমার কিছুটা ব্যাখ্যা করা উচিত ছিল। লাইসেন্স সম্পর্কে: আমি আসলে বেশ নিশ্চিত নই। আমি গুগলে পিডিএফকে হোঁচট খেয়েছি, গবেষণা করার সময়।
তারা

7

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

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

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

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

পার্শ্ব নোট হিসাবে, ডাইরেক্ট 3 ডি এর মতো এপিআইগুলি কোনও ফিনিশ ধারণাটি সমর্থন করে না।


5
"এখন, আপনি ঠিক তখনই কেন glFinish ডাকবেন" তে। যদি আপনি এক থ্রেডে রিসোর্সগুলি (যেমন: টেক্সচার) লোড করছেন এবং wglShareLists বা সিমিলারগুলির মাধ্যমে ভাগ করে অন্যটি রেন্ডার করতে তাদের ব্যবহার করছেন, আপনাকে রেন্ডারিং থ্রেডের সিগন্যাল দেওয়ার আগে glFinish কল করতে হবে যে এটি অ্যাসিঙ্ক্রোনালি লোড হয়েছে তা রেন্ডার করতে বিনামূল্যে।
মার্কো এমপি

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

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

1
আপনার glFinish কল করতে "দরকার নেই", আপনি সিঙ্ক অবজেক্ট ব্যবহার করতে পারেন।
chrisvarnz

কেবল যুক্ত করার জন্য, আসল উত্তরটি: কিছু জিএল বাস্তবায়নগুলি বিভিন্ন থ্রেডে ভাগ করা প্রসঙ্গগুলির মধ্যে সিঙ্ক করতে ফ্লাশ / ফিনিস ব্যবহার শুরু করেছে: বিকাশকারী.অ্যাপল. com/ লাইব্রেরি / আইস / ডকুমেন্টেশন / 3 ডি ড্রয়িং / - - উল্লেখযোগ্যভাবে অ্যাপল আইওএস। আমি মনে করি এটি মূলত এপিআই এর অপব্যবহার। তবে এটি আমার আসল উত্তরের একটি সতর্কতামূলক বিষয়: কিছু বাস্তবায়নের জন্য সমাপ্তি / ফ্লাশের প্রয়োজন। তবে কীভাবে এবং কেন বাস্তবায়ন সংজ্ঞায়িত করা হয়, ওপেনজিএল অনুমান নয়।
স্টারমোল

7

glFlush সত্যিই একটি ক্লায়েন্ট সার্ভার মডেল ফিরে। আপনি একটি জিপি সার্ভারে পাইপের মাধ্যমে সমস্ত gl কমান্ড প্রেরণ করেন। যে পাইপ বাফার হতে পারে। ঠিক যেমন কোনও ফাইল বা নেটওয়ার্ক i / o বাফার করতে পারে। glFlush কেবলমাত্র "বাফারটি এখনই প্রেরণ করুন, এমনকি এটি এখনও পূর্ণ না হলেও!"! স্থানীয় সিস্টেমে এটির প্রায়শই প্রয়োজন হয় না কারণ স্থানীয় ওপেনজিএল এপিআই নিজেই বাফার করতে পারে না এবং কেবল কমান্ড সরাসরি দেয়। এছাড়াও প্রকৃত রেন্ডারিংয়ের কারণ হিসাবে সমস্ত কমান্ড একটি অন্তর্নিহিত ফ্লাশ করবে।

অন্যদিকে glFinish পারফরম্যান্স পরিমাপের জন্য তৈরি হয়েছিল। জিএল সার্ভারে এক ধরণের পিং এটি একটি কমান্ডকে বৃত্তাকারে ছড়িয়ে দেয় এবং সার্ভারটি "আমি অলস" সাড়া না দেওয়া পর্যন্ত অপেক্ষা করে।

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

সুতরাং সংক্ষেপে: আপনি যদি কোনও প্রাচীন দূরবর্তী এসজিআই ওপেনজিএল সার্ভারের জন্য কোডিং না করেন তবে glFinish এবং glFlush উভয়ই অনুশীলনে কোনও বিকল্প হিসাবে বিবেচনা করবেন না।


4
ভুল। উপরের উত্তরে আমি যে মন্তব্যে রেখেছি: যেমন আপনি যদি একটি থ্রেডে রিসোর্সগুলি (যেমন: টেক্সচার) লোড করে এবং অন্যটি রেন্ডার করতে wglShareLists বা সিমিলারগুলির মাধ্যমে ভাগ করে ব্যবহার করছেন তবে রেন্ডারিং থ্রেডে সংকেত দেওয়ার আগে আপনাকে গ্লফিনিশ কল করতে হবে এটি অ্যাসিঙ্ক্রোনালি লোড হয়েছে যা রেন্ডার বিনামূল্যে। এবং এটি আপনি বলেছিলেন এমন কোনও নো-অপশন নয়।
মার্কো এমপি

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

2
দূষিত টেক্সচারের সাথে ডিল করার ব্যক্তিগত অভিজ্ঞতা, আরও এটি: হাইয়ারর্ডারফুন.com / blog / 2011 / 05 / 26/… আপনি যদি এটির বিষয়ে চিন্তা করেন তবে তা বোধগম্য হয়, কারণ এটি মুটেক্সস বা অন্যান্য সংযোগের থেকে খুব আলাদা নয়। থ্রেডগুলির মধ্যে এপিআই - প্রসঙ্গটি কোনও ভাগ করা সংস্থান ব্যবহার করার আগে অন্যটিকে সেই সংস্থানটির লোডিং সম্পূর্ণ করতে হয়, সুতরাং বাফারটি খালি করা হয়েছে তা নিশ্চিত করার প্রয়োজন। আমি বরং স্প্যাগের কোণার ক্ষেত্রে আরও বেশি বাগ মনে করি, তবে এই বিবৃতিটির জন্য আমার কাছে কোনও প্রমাণ নেই :)
মার্কো এমপি

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

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

5

এখানে দেখুন । সংক্ষেপে, এটি বলে:

glFinish () এর গ্লাফ্লিশ () এর মতোই প্রভাব রয়েছে, সংযোজন সমস্ত কমান্ড কার্যকর না হওয়া পর্যন্ত glFinish () অবরুদ্ধ হবে।

অন্য একটি নিবন্ধ অন্যান্য পার্থক্য বর্ণনা:

  • অদলবদল ফাংশন (ডাবল-বাফার অ্যাপ্লিকেশনগুলিতে ব্যবহৃত) স্বয়ংক্রিয়ভাবে আদেশগুলি ফ্লাশ করে, তাই কল করার দরকার নেই glFlush
  • glFinish ওপেনজিএলকে অসামান্য কমান্ডগুলি সম্পাদন করতে বাধ্য করে, যা একটি খারাপ ধারণা (যেমন ভিএসআইএনসি সহ)

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


হ্যাঁ ঠিকই, তবে নথিতে বলা হয়েছে যে উদাহরণস্বরূপ উইন্ডো সিস্টেম সম্পর্কিত কয়েকটি মাত্র পার্থক্য নিয়ে উভয়ের একই প্রভাব রয়েছে। তবে যাইহোক আমি আমার উত্তর সম্পাদনা করেছি;)
অ্যান্ডিডগ

উপকারের জন্য চমৎকার ডাক। এটা তোলে সুস্পষ্ট কিনা এটা glFlush () এবং তারপর glFinish () কল করার প্রয়োজন - (। একটি প্রশ্ন আমরা উপরোক্ত সবকিছু পড়ার পর ছিল)
Praxiteles

4

বাফারের স্থিতি অনুসন্ধানের কোনও উপায় বলে মনে হচ্ছে না। এই অ্যাপল এক্সটেনশনটি একই উদ্দেশ্যটি পরিবেশন করতে পারে তবে এটি ক্রস প্ল্যাটফর্ম বলে মনে হচ্ছে না (এটি চেষ্টা করে flushদেখেনি quick) দ্রুত নজরে দেখে মনে হয় আপনি বেড়া কমান্ডটি আগে ঠেলে দিয়েছিলেন; তারপরে আপনি সেই বেড়ার স্থিতিটি জিজ্ঞাসা করতে পারেন যেমন এটি বাফারের মধ্য দিয়ে যায়।

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

আমি এটি চেষ্টা করি নি, তবে আমি শীঘ্রই করব।

আমি এটি একটি পুরানো অ্যাপ্লিকেশনটিতে চেষ্টা করেছি যা এমনকি এমনকি সিপিইউ এবং জিপিইউ ব্যবহার করে। (এটি মূলত ব্যবহৃত হয়েছে finish))

আমি যখন এটিকে flushশেষে এবং finishশুরুতে পরিবর্তন করেছি তখন তাত্ক্ষণিক সমস্যা হয়নি। (সবকিছু ঠিকঠাক লাগছিল!) প্রোগ্রামটির সাড়া জাগানো কারণ সম্ভবত সিপিইউ জিপিইউতে অপেক্ষা করতে থামেনি। অবশ্যই একটি ভাল পদ্ধতি।

তুলনা করার জন্য, আমি finishedফ্রেমটির শুরু থেকে সরে গিয়েছিলাম flushএবং চলে এসেছি এবং এটি একই সম্পাদন করেছিল।

সুতরাং আমি বলব ব্যবহার করুন flushএবং finish, কারণ যখন কলটিতে কলিতে বাফারটি খালি থাকে তখন finishকোনও পারফরম্যান্স হিট হয় না। এবং আমি অনুমান করছি যে আপনি finishযেভাবে যাই হোক না কেন বাফারটি পূর্ণ ছিল ।


0

প্রশ্নটি হ'ল: আপনি কি চান যে আপনার কোডটি ওপেনজিএল কমান্ডগুলি কার্যকর হওয়ার সময় চলতে থাকবে বা কেবল পরে চালানো হবে? আপনার ওপেনএল কমান্ডগুলি কার্যকর চালানো হবে?

নেটওয়ার্কের বিলম্বের মতো কিছু ক্ষেত্রে ইমেজগুলি আঁকার পরে যেমন নির্দিষ্ট কনসোল আউটপুট পাওয়া যায় তবে এটি এর ক্ষেত্রে গুরুত্বপূর্ণ।

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