আমার কয়টি থ্রেড থাকা উচিত এবং কী জন্য?


81

রেন্ডারিং এবং লজিকের জন্য আমার আরও আলাদা থ্রেড থাকা উচিত, বা আরও কিছু?

আমি ডেটা সিঙ্ক্রোনাইজেশন দ্বারা সৃষ্ট প্রচুর কর্মক্ষমতা ড্রপ সম্পর্কে সচেতন (যে কোনও মিটেক্স লক্সকে ছেড়ে দেওয়া হোক)।

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


6
কোন প্ল্যাটফর্ম? পিসি, নেক্সটজেন কনসোল, স্মার্টফোন?
এলিস

একটি জিনিস আছে যা আমি ভাবতে পারি এটির জন্য মাল্টি-থ্রেডিংয়ের প্রয়োজন হবে; নেটওয়ার্কিং।
সাবান

এক্সেজেশনগুলি ছেড়ে দিন, লকগুলি জড়িত থাকার সময় কোনও "অপরিমেয়" ধীরগতি হয় না। এটি একটি শহুরে কিংবদন্তি এবং একটি কুসংস্কার।
v.oddou

উত্তর:


61

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

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

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

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


"কোনও থ্রেডের কোনও কাজের ফলাফলের সাথে সাথেই, টাস্কটি সম্পন্ন হলে এটি ফলাফল পেতে পারে এবং তা না হলে এটি নিরাপদে সারি থেকে টাস্কটি সরিয়ে নিয়ে এগিয়ে যেতে পারে এবং নিজেই সেই কাজটি সম্পাদন করতে পারে"। আপনি কি একই থ্রেড দ্বারা তৈরি কোনও টাস্কের কথা বলছেন? যদি তাই হয়, তবে সেই টাস্কটি থ্রেড দ্বারা সম্পাদন করা হয়েছে যা টাস্কটি নিজেই তৈরি করেছে তা যদি আরও বোঝা যায় না?
jmp97

অর্থাত, থ্রেডটি, কার্য নির্ধারিত ছাড়াই, সরাসরি এই কাজটি সম্পাদন করতে পারে।
jmp97

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

এই থ্রেডে ফিরে আসতে এত দীর্ঘ সময় দেওয়ার জন্য দুঃখিত আমি ইদানীং গেমদেবের প্রতি মনোযোগ দিচ্ছি না। এটি সম্ভবত সেরা উত্তর, ভোঁতা তবে বিন্দু এবং বিস্তৃত।
j রিভ

1
আপনি যে অর্থে সঠিকভাবে I / O- ভারী কাজের চাপ সম্পর্কে কথা বলতে অবহেলা করেছেন তা সঠিক। আমার প্রশ্নের ব্যাখ্যাটি হ'ল এটি ছিল কেবলমাত্র সিপিইউ-ভারী কাজের চাপ।
জেক ম্যাকআ

30

দুটি বিষয় বিবেচনা করার আছে। থ্রেড-প্রতি-সাবসিস্টেম রুটটি সম্পর্কে চিন্তা করা সহজ, যেহেতু কোড বিচ্ছিন্নতাটি গোয়েন্দাগুলি থেকে বেশ স্পষ্ট। যাইহোক, আপনার সাবসিস্টেমগুলির কতটা আন্তঃযোগাযোগ প্রয়োজন তার উপর নির্ভর করে আন্তঃ থ্রেড যোগাযোগ সত্যই আপনার কার্য সম্পাদনকে হত্যা করতে পারে। এছাড়াও, এটি কেবলমাত্র এন কোরগুলিতে স্কেল করে যেখানে এন থ্রেডগুলিতে বিমূর্তভাবে সাব-সিস্টেমের সংখ্যা এন is

যদি আপনি কেবল একটি বিদ্যমান গেমটি মাল্টিথ্রেডের দিকে তাকিয়ে থাকেন তবে এটি সম্ভবত সর্বনিম্ন প্রতিরোধের পথ। তবে, আপনি যদি কয়েকটি নিম্ন স্তরের ইঞ্জিন সিস্টেমে কাজ করছেন যা বেশ কয়েকটি গেম বা প্রকল্পের মধ্যে ভাগ করা যায় তবে আমি অন্য পদ্ধতির বিষয়টি বিবেচনা করব।

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

সুতরাং মূলত, আপনি যদি কোনও বিদ্যমান প্রকল্পের সাথে কিছুটা সমান্তরালতার কথা বলছেন তবে আমি সাবসিস্টেমগুলিতে সমান্তরাল করব। যদি আপনি সমান্তরাল স্কেলিবিলিটিটি মাথায় রেখে স্ক্র্যাচ থেকে একটি নতুন ইঞ্জিন তৈরি করে থাকেন তবে আমি একটি কাজের সারি সন্ধান করব।


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

3
কোনও কাজের সারি এবং কর্মী থ্রেড কীভাবে সেট করবেন সে সম্পর্কে একটি সম্প্রদায় উইকি চমৎকার হবে।
বট_বট

23

এই প্রশ্নের কোনও সর্বোত্তম উত্তর নেই, কারণ এটি আপনি কী অর্জন করার চেষ্টা করছেন তার উপর নির্ভর করে।

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

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

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

রাগের জন্য তৈরি করা আইডিটেক 5 ইঞ্জিন আসলে যে কোনও সংখ্যক থ্রেড ব্যবহার করে এবং এটি গেম টাস্কগুলিকে 'জবস' -তে ভেঙে ফেলে যা কোনও টাস্কিং সিস্টেম দিয়ে প্রক্রিয়াজাত করা হয়। যখন গড় গেমিং সিস্টেমের কোরের সংখ্যা লাফ দেয় তখন তাদের স্পষ্ট লক্ষ্য তাদের গেম ইঞ্জিন স্কেলটি সুন্দরভাবে করা।

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

এটি আপনার চূড়ান্ত লক্ষ্যের উপর নির্ভর করে।


একটি শিডিং সিস্টেমের উল্লেখের জন্য +1 .. সাধারণত থ্রেড / সিস্টেম যোগাযোগের জন্য একটি ভাল জায়গা :)
জেমস

ডাউন ডাউন ভোট কেন?
jcora

12

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

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

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


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

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

@DaveO। আপনার "প্লাস" পয়েন্টটি তাই, সত্য।
ইঞ্জিনিয়ার

11

আপনি ঠিক বলেছেন যে সবচেয়ে গুরুত্বপূর্ণ অংশটি যেখানেই সম্ভব সিঙ্ক্রোনাইজেশন এড়ানো। এটি অর্জনের কয়েকটি উপায় রয়েছে।

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

  2. ডেটা জন্য স্পষ্ট অ্যাক্সেস সময় সংজ্ঞা। আপনি আপনার মূল টিকটিকে এক্স পর্যায়ে আলাদা করতে পারেন। আপনি যদি নিশ্চিত হন যে থ্রেড এক্স কেবলমাত্র একটি নির্দিষ্ট পর্যায়ে ডেটা পড়েন তবে আপনি এটিও জানেন যে এই ডেটা অন্য থ্রেডের দ্বারা অন্য একটি পর্যায়ে পরিবর্তন করা যেতে পারে।

  3. আপনার ডেটা ডাবল-বাফার করুন। এটি সর্বাধিক সহজ পদ্ধতির তবে থ্রেড এক্স শেষ ফ্রেমের ডেটা নিয়ে কাজ করছে বলে থ্রেড এক্স পরবর্তী ফ্রেমের জন্য ডেটা প্রস্তুত করছে।

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

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


3

কোনও অ্যাপ্লিকেশন থ্রেডিংয়ের জন্য থাম্বের সাধারণ নিয়ম: সিপিইউ কোর প্রতি 1 থ্রেড। কোয়াড কোর পিসিতে তার মানে 4 4. পিএস 3 এর মতো সিস্টেমে ... সেই জন্য শুভকামনা :) লোকেরা এখনও এটি বের করার চেষ্টা করছে।

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

আপনি যদি আপনার ইঞ্জিনের সিস্টেমগুলি যথেষ্ট পরিমাণে ডিজাইন করেন তবে প্রতি গেমের ভিত্তিতে এবং তার মতো আরও উপযুক্তভাবে আপনার ইঞ্জিনের ভারসাম্যকে ভারসাম্য লোড করতে তাদের যে কোনও একটি থ্রেড থেকে থ্রেডে সরানো যেতে পারে। তাত্ত্বিকভাবে আপনি আপনার ইঞ্জিনকে বিতরণ সিস্টেমেও ব্যবহার করতে পারেন যেখানে প্রয়োজন হয় যেখানে সম্পূর্ণ পৃথক কম্পিউটার সিস্টেম প্রতিটি উপাদানকে চালিত করে।


2
Xbox360 এর কোর প্রতি 2 টি হার্ডওয়্যার
স্ট্রেড রয়েছে

আহ, +1 :) আমি সর্বদা 360 এবং PS3 এর নেটওয়ার্কিং অঞ্চলে সীমাবদ্ধ ছিলাম, তিনি :)
জেমস

0

আমি লজিক্যাল কোর প্রতি এক থ্রেড তৈরি করি (মাইনাস ওয়ান, মেইন থ্রেডের অ্যাকাউন্টে, যিনি ঘটনাক্রমে রেন্ডারিংয়ের জন্য দায়ী, তবে অন্যথায় ওয়ার্কার থ্রেড হিসাবেও কাজ করে)।

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

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

এটি উল্লেখ করার মতো বিষয় যে যে কোনও কাজ একই অগ্রাধিকারের সারিতে সাবমজবস (যা সূক্ষ্ম, এবং পারমাণবিকতার কাছে) জারি করতে পারে বা যেটি উচ্চতর (পরে ফ্রেমে পরিবেশিত) হতে পারে issue

আমার কাছে এই জাতীয় তিনটি সারি রয়েছে, একটি ব্যতীত অন্য সমস্ত থ্রেড সম্ভাব্যভাবে ফ্রেম প্রতি ঠিক তিনবার স্টল করতে পারে (অন্য থ্রেডের অপেক্ষায় বর্তমান অগ্রাধিকার স্তরে প্রদত্ত সমস্ত অসামান্য কাজ শেষ করার জন্য)।

এটি থ্রেড নিষ্ক্রিয়তার একটি গ্রহণযোগ্য স্তর বলে মনে হচ্ছে!


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

0

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

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