গেম লজিক থ্রেড এবং রেন্ডারিং থ্রেডের মধ্যে সিঙ্ক্রোনাইজেশন


16

কীভাবে একটি আলাদা গেম যুক্তি এবং উপস্থাপনা করতে পারে? আমি জানি যে ইতিমধ্যে এখানে জিজ্ঞাসা করা প্রশ্নগুলি ঠিক আছে তবে উত্তরগুলি আমার কাছে সন্তোষজনক নয়।

আমি এতক্ষণ যা বুঝতে পেরেছি সেগুলি থেকে তাদের আলাদা আলাদা থ্রেডে বিভক্ত করার বিষয়টিটি হ'ল যাতে গেম লজিকটি পরবর্তী ভিস্কের জন্য অপেক্ষা না করে তাত্ক্ষণিকভাবে পরবর্তী টিকের জন্য দৌড় শুরু করতে পারে যেখানে অবশেষে রেকর্ডিং সোয়াপবফার থেকে ফিরে আসে এটি ব্লক করে দেওয়া হয়।

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

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


1
আমি কেবল একটি লিঙ্ক স্প্যাম করতে ঘৃণা করি, তবে আমি মনে করি এটি খুব ভাল পড়া এবং এটি আপনার সমস্ত প্রশ্নের উত্তর দেওয়া উচিত: altdevblogaday.com/2011/07/03/threading- এবং- your
রায় টি।


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

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

যে কেউ লিখেছেন যে ইন্টেল নিবন্ধটি শীর্ষ স্তরের থ্রেডিং খুব খারাপ ধারণা তা জানেনা। কেউ বোকা এমন কিছু করে না। হঠাৎ পুরো অ্যাপ্লিকেশনটির বিশেষায়িত চ্যানেলের মাধ্যমে যোগাযোগ করতে হবে এবং সর্বত্র লক এবং / বা বিশাল সমন্বিত রাষ্ট্রীয় এক্সচেঞ্জ রয়েছে। প্রেরণ করা ডেটা কখন প্রসেস হবে তা বলার অপেক্ষা রাখে না তাই কোড কী করে তা নিয়ে যুক্তি করা অত্যন্ত কঠিন। প্রাসঙ্গিক দৃশ্যের ডেটা (রেফকাউন্টেড পয়েন্টার হিসাবে অপরিবর্তনীয়, পরিবর্তিত - মান অনুসারে) এক পর্যায়ে অনুলিপি করা খুব সহজ এবং সাবসিস্টেমটি এটি চাইলে সাজানোর চেষ্টা করুন it
সাপ 5

উত্তর:


1

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

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

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

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


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

1

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

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

এটি আপনি কোন প্ল্যাটফর্মটি ব্যবহার করছেন তার উপর নির্ভর করে। উদাহরণ স্বরূপ:

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

    glutDisplayFunc (myFunctionForGraphicsDrawing);

    glutIdleFunc (myFunctionForUpdatingState);

  • জাভাস্ক্রিপ্টে, আপনি ওয়েব ওয়ার্কার্স ব্যবহার করতে পারেন যেহেতু কোনও মাল্টি-থ্রেডিং নেই (যে আপনি প্রোগ্রামমেটিকালিতে পৌঁছাতে পারেন) , আপনি যখন নতুন গ্রাফিক্স রেন্ডারিং নির্ধারিত হবে তখন বিজ্ঞপ্তি পেতে "অনুরোধআনিমেশন ফ্রেম" প্রক্রিয়াটিও ব্যবহার করতে পারেন এবং সেই অনুযায়ী আপনার গেমের স্টেট আপডেট করুন ।

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


0

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

জাভা:

synchronized(a){
    //code using a
}

সি ++:

mutex a_mutex;

void f(){
    a_mutex.lock();
    //code using a
    a_mutex.unlock();
}

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


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

0

আমি লজিক / থ্রেড যোগাযোগ রেন্ডার করতে সাধারণত যা দেখেছি তা হ'ল আপনার ডেটা ট্রিপল বাফার করা। এইভাবে রেন্ডার থ্রেডটি বলেছে বালতি 0 এটি পড়ে reads লজিক থ্রেডটি বালতি 1টিকে পরবর্তী ফ্রেমের ইনপুট উত্স হিসাবে ব্যবহার করে এবং ফ্রেম ডেটা বালতি 2 তে লেখে।

সিঙ্ক পয়েন্টগুলিতে, তিনটি বালতির প্রত্যেকটির অর্থের সূচকগুলি অদলবদল করা হয় যাতে পরবর্তী ফ্রেমের ডেটা রেন্ডার থ্রেডকে দেওয়া হয় এবং লজিক থ্রেড এগিয়ে যেতে পারে।

তবে তাদের নিজ নিজ থ্রেডে রেন্ডারিং এবং লজিককে বিভক্ত করার কোনও কারণ নেই। আপনি প্রকৃতপক্ষে গেম লুপ সিরিয়াল রাখতে এবং আপনার রেন্ডার ফ্রেম রেটকে ইন্টারপোলেশন ব্যবহার করে লজিক স্টেপ থেকে ডিকপল করতে পারেন। এই ধরণের সেটআপ ব্যবহার করে মাল্টি-কোর প্রসেসরের সুবিধা গ্রহণ করার জন্য আপনার কাছে এমন একটি থ্রেড পুল রয়েছে যা কাজের গোষ্ঠীতে কাজ করে। এই কাজগুলি কেবল জিনিস হতে পারে যেমন 0 থেকে 100 পর্যন্ত অবজেক্টের তালিকার পুনরাবৃত্তি না করে আপনি 5 টি থ্রেড জুড়ে 20 টি 5 বালতিতে তালিকার পুনরাবৃত্তি কার্যকরভাবে আপনার কার্যকারিতা বাড়িয়ে তোলেন তবে মূল লুপটিকে জটিল করে তোলেন না।


0

এটি একটি পুরানো পোস্ট তবে এটি এখনও পপ আপ তাই আমার 2 সেন্ট এখানে যোগ করতে চেয়েছিল।

প্রথম তালিকার ডেটা যা ইউআই / ডিসপ্লে থ্রেড বনাম লজিক থ্রেডে সংরক্ষণ করা উচিত। ইউআই থ্রেডে আপনি 3 ডি জাল, টেক্সচার, হালকা তথ্য এবং অবস্থান / রোটেশন / দিকনির্দেশের ডেটার একটি অনুলিপি অন্তর্ভুক্ত করতে পারেন।

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

আপনি যদি দুটি তালিকার তুলনা করেন তবে দেখতে পাবেন যে কেবল অবস্থান / ঘূর্ণন / দিকনির্দেশের তথ্যের অনুলিপিটি যুক্তি থেকে UI থ্রেডে পাস করা দরকার। এই ডেটাটি কোন গেমের অবজেক্টের অন্তর্ভুক্ত তা নির্ধারণ করতে আপনার কোনও ধরণের সম্পর্ক সম্পর্কিত ID প্রয়োজন হতে পারে।

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

থ্রেডগুলির মধ্যে ডেটা ভাগ করে নেওয়ার আগে আপনাকে আসলে কতটা ডেটা পাস করতে হবে তা নিয়ে কাজ করে। যদি আপনার অষ্ট্রি আপনার 3 ডি স্পেসটিকে বিভাজন করে থাকে এবং আপনি 10 টি অবজেক্টের মধ্যে 5 টি গেম অবজেক্ট দেখতে পাচ্ছেন, এমনকি যদি আপনার যুক্তিটি 10 ​​টি আপডেট করার প্রয়োজন হয় তবে আপনি কেবল 5 দেখতে পাচ্ছেন red আরও পড়ার জন্য এই ব্লগটি পরীক্ষা করে দেখুন : http://gameprogrammingpatterns.com/game-loop.html এটি সিঙ্ক্রোনাইজেশন সম্পর্কিত নয় তবে এটি দেখায় যে গেম যুক্তি প্রদর্শন থেকে কীভাবে পৃথক হয় এবং আপনার কী চ্যালেঞ্জগুলি কাটিয়ে উঠতে হবে (এফপিএস)। আশাকরি এটা সাহায্য করবে,

ছাপ

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