সাধারণ গেমসের জন্য গেম লুপের জন্য আলাদা থ্রেড বাধ্যতামূলক?


10

আমি গেম ডেভলপমেন্টে নতুন। শিখতে আমি অ্যান্ড্রয়েড প্ল্যাটফর্মে এই গেমটি পুনরায় তৈরি করছি । আপনি উপরের লিঙ্কে গেম-প্লে ভিডিও পর্যবেক্ষণ করতে পারেন। এটি একটি সহজ খেলা।

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



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

উত্তর:


8

একটি গেম লুপ সাধারণত প্রস্তাবিত হয় কারণ এটি সহজ । একটি লুপ ব্যবহার করে প্রায় কোনও গেম সঠিকভাবে বিকাশ ও পরিচালনা করা যায় এবং বেশিরভাগ গেমের একটি সঠিকভাবে কাজ করতে পারে।

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

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

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


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

সুতরাং আপনি জিজ্ঞাসা করছেন না একটি লুপ প্রয়োজন? আপনার মূল উদ্বেগটি যদি এটি আলাদা থ্রেডে থাকতে হয়, সঠিক?
আতুরস্যাম

1
সঠিক। আমার প্রশ্ন লুপ নয় থ্রেড সম্পর্কে। এ জাতীয় সরল গেমের জন্য (যদিও আমি এ জাতীয় খেলা তৈরি করতে পেরে ভাগ্যবান হব) আমাকে কি নতুন থ্রেড লাগানো দরকার বা মূল থ্রেডে সবকিছু করা যায়?
জ্বিন

1
না, এটি প্রয়োজনীয় নয়। যতক্ষণ না আপনার একটি লুপ থাকে , তারপরে দ্বিতীয় লুপ তৈরি করার দরকার নেই ।

@ জিন আপনার শিরোনাম এবং আপনার প্রশ্নটি কীভাবে লিখবেন তা পরিবর্তন করা উচিত।
ভালান্টিন

5

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

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


মূল প্রশ্নটির "একটি লুপের প্রয়োজন কি?"

না , তবে বিকল্পগুলি আরও জটিল, কার্যকর করা কঠিন এবং খুব কমই ব্যবহৃত হয়।

গেমস সংজ্ঞা ইন্টারেক্টিভ হয়। সর্বনিম্ন, এটি ইনপুট এবং আউটপুট আপডেট করার অপেক্ষায়। এটি করার সহজ উপায় হ'ল লুপ সহ। এটির জন্য একটি নতুন থ্রেড স্পোন করা প্রয়োজন হয় না।

আপনি যে গেমটি উল্লেখ করেছেন তা সহজ বলে মনে হলেও এটির ইন্টারেক্টিভ ভিজ্যুয়াল এবং শব্দ রয়েছে এবং এটি ব্যবহারকারী ইনপুট ভিত্তিক অবিরত আপডেট করে।

গেম লুপের অনেকগুলি বিকল্প নেই। কিছু ধরণের বিঘ্নিত ভিত্তিক সিস্টেম সম্ভব হতে পারে। যাইহোক, এই ধরনের সিস্টেমগুলি জটিলতা বাড়ায় এবং নির্ধারণের মতো অন্যান্য কারণগুলি হ্রাস করে। গেম লুপগুলি এত সাধারণ হওয়ার কারণ রয়েছে, এগুলি কার্যকর করা সহজ, বোঝা সহজ, নমনীয় এবং দুর্দান্ত কাজ করে।


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

2

প্রকৃত প্রশ্নের উত্তর (একটি গেম লুপটি আলাদা থ্রেডে থাকা দরকার):

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

পৃথক থ্রেডগুলিতে কোড রাখার আরেকটি কারণ হ'ল কোডটি মডুলার এবং সহজ রাখা। দুটি সম্পর্কযুক্ত টুকরো টুকরো কোড একসাথে মিশ্রিত হওয়ার কারণে কোডগুলি দীর্ঘমেয়াদে কম পাঠযোগ্য এবং বজায় রাখতে সক্ষম হতে পারে।

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

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

কিছু ফ্রেমওয়ার্কগুলি আপনাকে ব্যবহার এবং ইভেন্ট / বিঘ্নিত ভিত্তিক সিস্টেম যেমন অ্যাকশনস্ক্রিপ্ট ৩.০-তে উত্সাহ দেয় / উত্সাহ দেয়। সেক্ষেত্রে লুপ কোডটি সাধারণত OnEnterFrameইভেন্ট বা অনুরূপ কিছুতে যায় যা 20 - 60 বা 120 বার প্রতি সেকেন্ডে ঘটে।


মূল প্রশ্নের উত্তর (আমার কী একটি মূল লুপ দরকার):

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

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

সুতরাং আপনার আগের প্রশ্নের উত্তর দিতে, আপনার কি একটি লুপ দরকার? হ্যাঁ তুমি কর.


1
যতদূর আমি জানি, এএস 3 এর মতো ইভেন্ট ভিত্তিক ফ্রেমওয়ার্কগুলির এখনও নীচে একটি গেম লুপ চলছে। আমি নিম্ন স্তরের বাধা সম্পর্কে বলছি, এমন কোনও ফ্রেমওয়ার্ক নয় যা কোনও ইভেন্ট সিস্টেম প্রয়োগ করে।
মাইকেলহাউস

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

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

আমি @ বাইট 56 এর সাথে একমত হয়েছি এটি লুপে ফোটে, যদি না আমরা কার্নেল স্তরের ইভেন্টগুলির বিষয়ে কথা না বলি যা IO বাধা ব্যবহার করে।
ধারণার 3 ই

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

0

এখানে অন্যের জবাব যুক্ত করতে, এমন কোনও বিষয় যা স্পষ্টভাবে কেউ উল্লেখ করেনি: আপনি যদি নিজের গেম লুপটি দ্বিতীয় থ্রেডে চালানোর ঝুঁকি নেন এবং এটি প্রতিক্রিয়াহীন হয়ে যায়, আপনি ওএস আপনার অ্যাপ্লিকেশনটি সমাপ্ত করে ঝুঁকিপূর্ণ করবেন। এ কারণেই এটি একটি পৃথক থ্রেড ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। সুতরাং (উদাহরণস্বরূপ) এনডিকে native_app_glue.c/ .hআপনার লুপের জন্য একটি পৃথক থ্রেড তৈরি করে।

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