গেম লুপ এবং ওপেনজিএল এর মধ্যে মাল্টিথ্রেডিংয়ের সুবিধা গ্রহণ করা


10

ওপেনজিএল রেন্ডারারের উপর ভিত্তি করে একটি গেমের প্রসঙ্গে কথা বলা:

ধরে নেওয়া যাক দুটি থ্রেড রয়েছে:

  1. গেম অবজেক্টগুলিতে গেমের লজিক এবং ফিজিক্স ইত্যাদি আপডেট করে

  2. গেমের অবজেক্টগুলিতে ডেটার ভিত্তিতে প্রতিটি গেমের অবজেক্টের জন্য ওপেনজিএল কল করে (যে থ্রেডটি 1 আপডেট করে চলেছে)

গেমের বর্তমান অবস্থায় প্রতিটি গেমের অবজেক্টের দুটি অনুলিপি না থাকলে থ্রেড 1 থামাতে হবে যখন থ্রেড 2 ড্র কলগুলি করেছে অন্যথায় গেম অবজেক্টগুলি সেই অবজেক্টের জন্য একটি ড্র কলের মাঝখানে আপডেট হবে, যা অবাঞ্ছিত!

তবে থ্রেড 2 থেকে নিরাপদে কল করতে থ্রেড 1 বন্ধ করা মাল্টিথ্রেডিং / কনক্যুরেন্সির পুরো উদ্দেশ্যকে হত্যা করে

শত বা হাজার বা সিঙ্ক অবজেক্টস / বেড়া ব্যবহার করা ছাড়াও এর জন্য কি আরও ভাল পদ্ধতির যাতে মাল্টিকোর আর্কিটেকচারটি পারফরম্যান্সের জন্য কাজে লাগানো যায়?

আমি জানি যে আমি এখনও টেক্সচার লোড করার জন্য মাল্টিথ্রেডিং এবং শ্যাডারগুলি সংকলনের জন্য ব্যবহার করতে পারি যা এখনও বর্তমান গেমের অঙ্গ হতে পারে তবে ড্র এবং আপডেটের সাথে দ্বন্দ্ব না ঘটিয়ে আমি কীভাবে সক্রিয় / দৃশ্যমান বস্তুর জন্য এটি করব?

আমি যদি প্রতিটি গেমের অবজেক্টে পৃথক সিঙ্ক লক ব্যবহার করি? পুরো আপডেট / আঁকার চক্রের পরিবর্তে কোনও থ্রেড কেবলমাত্র একটি বস্তুর (আদর্শ কেস) ব্লক করবে! তবে কীভাবে ব্যয় হচ্ছে প্রতিটি বস্তুর উপর লক নেওয়া (গেমটিতে হাজার জিনিস থাকতে পারে)?


1. ধরে নিচ্ছি যে কেবল দুটি থ্রেড ভাল স্কেল করে না, 4 টি কর্ণ খুব সাধারণ এবং কেবল বৃদ্ধি পাবে। ২. সর্বোত্তম অনুশীলনের কৌশল উত্তর: কমান্ড ক্যোয়ারীর দায়বদ্ধতা বিভাজন এবং অভিনেতা মডেল / উপাদান উপাদান সত্ত্বার প্রয়োগ করুন। ৩. বাস্তবের উত্তর: কেবলমাত্র লক এবং স্টাফ দিয়ে এটি প্রচলিত সি ++ উপায় হ্যাক করুন।
ডেন

একটি সাধারণ ডাটাস্টোর, একটি লক।
জাস্টিন

@ ঠিক করুন ঠিক যেমনটি আমি একটি সিঙ্ক লক দিয়ে বলেছিলাম মাল্টিথ্রেডিংয়ের একমাত্র সুবিধাটি দিনের আলোতে নির্মমভাবে হত্যা করা হবে, আপডেট থ্রেডটি সমস্ত বস্তুর জন্য থ্রেড থ্রেড না হওয়া পর্যন্ত অপেক্ষা করতে হবে তবে আপডেট থ্রেড আপডেট লুপ আপডেট করার স্টাফ সম্পূর্ণ না হওয়া পর্যন্ত অপেক্ষা করবে ! যা একক থ্রেডেড পদ্ধতির চেয়েও কঠিন অপরাধ
Allahjane

1
দেখে মনে হচ্ছে অ্যাসিঙ্ক গ্রাফিক্স এপিআই (যেমন ওপেনজিএল) সহ গেমগুলিতে মাল্টিথ্রেডেড পদ্ধতির বিষয়টি এখনও সক্রিয় বিষয় এবং এর কোনও মানক বা নিখুঁত সমাধান নেই
আল্লাহজানে

1
আপনার ইঞ্জিনে এবং আপনার রেন্ডারারের মধ্যে সাধারণ যে ডেটাস্টোরটি আপনার গেমের বিষয় নয়। এটি এমন কিছু উপস্থাপনা হওয়া উচিত যা রেন্ডারার যত তাড়াতাড়ি প্রক্রিয়া করতে পারে।
জাস্টিন

উত্তর:


13

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

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

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

শেষ পর্যন্ত, আমি পড়ার পরামর্শ দিচ্ছি:


উৎসুক! আপনি কীভাবে জানেন যে ডুম 3 এই পদ্ধতিটি ব্যবহার করেছে? আমি ভেবেছিলাম বিকাশকারীরা কৌশলগুলি কখনই ছাড়তে দেয় না!
আল্লাহ্জনে

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

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