ভিবিওগুলি আপডেট করতে এবং একই সাথে সেগুলি ব্যবহার করতে কীভাবে একটি মাল্টি-থ্রেড ওপেনজিএল অ্যাপ্লিকেশন ব্যবহার করবেন?


11

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

এখন আমি যা চাই: একটি থ্রেড ভিবিওর প্রথমার্ধ থেকে কিছু তথ্য উপস্থাপন করছে এবং দ্বিতীয় থ্রেড ভিবিওর দ্বিতীয় অংশটি আপডেট করছে।

আমি যখন ভিবিও আপডেট করি না, এটি ঠিকঠাক কাজ করছে।

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

আমি ব্যবহার করার চেষ্টা করেছি glMapBufferRange, যা ব্যবহার করে GL_MAP_UNSYNCHRONIZED_BIT। এর অর্থ হওয়া উচিত, "অপেক্ষা করুন এবং আপনি যেমন চান VBO ব্যবহার করবেন না, আমি (প্রোগ্রাম) এটি নিজেই সিঙ্ক্রোনাইজ করব"। এছাড়াও, আমি যখন অনেকগুলি ভিবিওর মানচিত্র তৈরি করি এবং অন্য অংশ থেকে ডেটা উপস্থাপন করি তখন এটি অপেক্ষা করা উচিত নয়, তবে আমি যেমন একই সমস্যাটি করছি তেমনি অভিজ্ঞতা করছি glMapBuffer

কেউ আমাকে এটি ঠিক করতে বা কেন এটি ঘটে তা ব্যাখ্যা করতে সহায়তা করতে পারে?

উত্তর:


6

যদি কেউ এই সমস্যায় আগ্রহী হন তবে আপনি ওপেনজিএল ফোরামে সমাধান পেতে পারেন । মূলত, বাফারগুলি একই সাথে দুটি থ্রেড বা প্রসঙ্গ দ্বারা অ্যাক্সেস করা যায় না, না পড়া বা লেখার জন্য। সুতরাং, মত একটি লকিং প্রক্রিয়া std::mutexপ্রয়োজন।


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