মাল্টিথ্রেডেড ইঞ্জিনে কীভাবে কম বার্তা পাঠাতে পারি?


18

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

থ্রেডগুলি একে অপরের সাথে যোগাযোগ করে ছোট মেসেজ অবজেক্টের মাধ্যমে, যা থ্রেড থেকে থ্রেডে যায়। পদক্ষেপ নেওয়ার আগে একটি থ্রেড তার আগত সমস্ত বার্তাগুলি প্রসেস করে - রূপান্তরিত করতে আপডেট করে, বস্তুগুলি যুক্ত করে এবং মুছে ফেলা ইত্যাদি Sometimes

প্রক্রিয়া শুরুর দিকে এবং আমি কয়েকটি জিনিস লক্ষ্য করেছি:

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

    এই কাজ করতে একটি ভাল উপায় আছে কি? এই স্বয়ংক্রিয়ভাবে তৈরি করতে আমার কি বুস্ট :: বাইন্ডের মতো কিছু ব্যবহার করা উচিত? আমি উদ্বিগ্ন যে আমি যদি এটি করি তবে আমি টাইপ বা কোনও কিছুর উপর ভিত্তি করে বার্তাগুলি বাছাই করার ক্ষমতা হারাব। নিশ্চিত না যে এই ধরণের পরিচালনা এমনকি প্রয়োজনীয় হয়ে উঠবে কিনা।

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

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

এই প্রথম আমার গ্রাউন্ড আপ থেকে মাল্টিথ্রেডিংয়ের সাথে কিছু ডিজাইন করা। এই প্রাথমিক পর্যায়ে আমি আসলে মনে করি এটি সত্যিই ভাল চলছে (বিবেচনা করে) তবে আমি স্কেলিং সম্পর্কে উদ্বিগ্ন এবং নতুন স্টাফ বাস্তবায়নে আমার নিজস্ব দক্ষতা।


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

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

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

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

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

উত্তর:


10

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

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


1
নির্দিষ্ট থ্রেড পুলিংয়ের জন্য কোনও সুপারিশ চেক আউট করার জন্য?
imre

নিক- প্রতিক্রিয়াটির জন্য অনেক ধন্যবাদ। আপনার প্রথম বক্তব্য হিসাবে- আমি মনে করি একটি দুর্দান্ত ধারণা এবং সম্ভবত আমি যে দিকটি সরিয়ে নেব তা এই মুহূর্তে যথেষ্ট পর্যাপ্ত যে আমি এখনও জানি না যে ডাবল-বাফার করার দরকার কী হবে। সময়ের সাথে দৃ that় হওয়ার সাথে সাথে আমি এটি মনে রাখব। আপনার দ্বিতীয় পয়েন্ট- পরামর্শ জন্য ধন্যবাদ! হ্যাঁ, থ্রেড কাজের সুবিধাগুলি স্পষ্ট are আমি আপনার লিঙ্কগুলি পড়ুন এবং এটি সম্পর্কে চিন্তা করব। এটি আমার জন্য কীভাবে কাজ করবে / কীভাবে এটি আমার পক্ষে কাজ করে তা 100% নিশ্চিত নয় তবে আমি অবশ্যই এটি নিয়ে গুরুতর চিন্তাভাবনা করব। ধন্যবাদ!
র‌্যাপিটরম্যাট

1
@ আমি বুস্ট লাইব্রেরিটি পরীক্ষা করে দেখুন - তাদের ফিউচার রয়েছে, যা এই বিষয়গুলির কাছে যাওয়ার এক দুর্দান্ত / সহজ উপায়।
জোনাথন ডিকিনসন

5

আপনি বিভিন্ন মাল্টি-থ্রেডড ডিজাইন সম্পর্কে জিজ্ঞাসা করেছেন। আমার এক বন্ধু আমাকে এই পদ্ধতিটি সম্পর্কে বলেছিল যে আমি ভেবেছিলাম বেশ দুর্দান্ত।

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


4

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

আমি এটির সাথে পুরোপুরি খুশি নই, তবে সমস্ত কোড হাতে হাতে লেখার চেয়ে ভাল।

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

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


চমৎকার সব তথ্যের জন্য ধন্যবাদ! হ্যান্ডলারগুলি সম্পর্কে শেষ বিটটি ফাংশনগুলি পাস করার জন্য বাঁধাই বা ফান্টেক্টর ব্যবহারের বিষয়ে আমি উল্লেখ করেছিলাম তার মতো। আমি মতামতটি পছন্দ করি - আমি এটি চেষ্টা করে দেখতে পারি এবং এটি সফল হয় বা দুর্দান্ত লাগে কিনা তা দেখুন: ডি ক্যালডিলেগেটমেজেজ ক্লাস তৈরি করে আমার পায়ের আঙ্গুলটি পানিতে ডুবিয়ে দিয়ে শুরু করতে পারেন।
র‌্যাপিটরম্যাট

1

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

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

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

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

  • আপডেট থ্রেডগুলি সিঙ্ক করে (একাধিক থ্রেড একই ডেটা সেটটি আপডেট করার চেষ্টা করবেন না তা নিশ্চিত করুন)।
  • পঠন পর্যায়ে কোনও থ্রেড দুর্ঘটনাক্রমে ভাগ করা ডেটা লিখতে পারে না তা নিশ্চিত করে। আমি ভয় করি প্রোগ্রামিং ভুলগুলির জন্য খুব বেশি জায়গা থাকবে এবং আমি নিশ্চিত না যে এগুলির মধ্যে কতটি সহজেই ডিবাগ সরঞ্জামগুলি দ্বারা ধরা পড়তে পারে।
  • কোড লিখন এমনভাবে যাতে আপনি আপনার মধ্যবর্তী ফলাফলগুলি এখনই পড়ার জন্য উপলব্ধ থাকার উপর নির্ভর করতে পারবেন না। অর্থাৎ, x += 2; if (x > 5) ...এক্স ভাগ করা থাকলে আপনি লিখতে পারবেন না । আপনাকে এক্স এর স্থানীয় একটি অনুলিপি তৈরি করতে হবে, বা একটি আপডেটের অনুরোধ তৈরি করতে হবে এবং কেবলমাত্র পরবর্তী রানে শর্তযুক্ত করতে হবে। পরবর্তীটির অর্থ বয়লারপ্লেট কোড সংরক্ষণ করে অতিরিক্ত থ্রেড-স্থানীয় রাজ্যের পুরো অর্থ।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.