আপডেট করার জন্য টার্ন-বেসড (আরপিজি) গেমগুলিতে অলস সময় ব্যবহার করা


9

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

যাইহোক, এটি অবিলম্বে মনে হয় যে এটি থ্রেড করা প্রয়োজন। এই ধরণের নকশাটি কি একক থ্রেডে সম্ভব?

loop:  
if not check_something_pressed:  
    update_a_very_small_amount  
else  
  keep going

তবে আমরা যদি বলি যে 'a_very_small_amount' প্রতিটি লুপটিতে কেবল একটি একক অবজেক্ট আপডেট করে, এটি আপডেট করা খুব ধীর হতে চলেছে।

আপনি কীভাবে এই সম্পর্কে যাবেন, পছন্দসই এক থ্রেডে?

সম্পাদনা: আমি এই ভাষা-অজ্ঞাতকে ট্যাগ করেছি যেহেতু বোধগম্য জিনিস মনে হচ্ছে যদিও পাইথনের আরও নির্দিষ্ট কিছু দুর্দান্ত হতে পারে। ;-)

দ্বিতীয় সম্পাদনা: এই গেমটি কোনও অ্যানিমেটেড উপাদান রাখার পরিকল্পনা করছে না; অর্থাৎ, আমি বর্তমানে এটি অপেক্ষারত প্লেয়ার-ইনপুট হিসাবে চালিয়ে যাচ্ছি তারপরে সবকিছু আপডেট করুন এবং আঁকুন। এক্স এক্সপিএসের পরিবর্তে এটি ব্যবহারকারীর গতির উপর নির্ভর করে।

উত্তর:


7

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

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

ফ্রেমটি প্রক্রিয়া শেষ করার পরে, পরবর্তী ফ্রেমের শেষ কোথায় হওয়া উচিত তা জানতে শেষ ফ্রেমের শেষের জন্য সঞ্চিত সময়টিতে 16.667 এমএস যোগ করুন। আপনি যদি বর্তমান সময় + 16.667 এমএস ব্যবহার করেন এবং প্রসেসিং শেষ হয়ে যায়, শেষ ফ্রেমটি শেষ হয়ে যাওয়ার পরে পরবর্তী ফ্রেমের শেষটি বাইরে চলে যাবে।

উত্তর: দ্বিতীয় সম্পাদনা

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


2

জন্য পাইথন বিশেষভাবে আপনি চেষ্টা এবং ব্যবহার করতে পারেন Coroutines একাধিক আপডেটের কলগুলির মাধ্যমে গণনার না।

... কর্টাইনগুলি এমন প্রোগ্রামের উপাদান যা কিছু স্থানে স্থগিতকরণ এবং পুনরায় শুরুকরণের জন্য একাধিক এন্ট্রি পয়েন্টগুলিকে অনুমতি দেওয়ার জন্য সাবরোটাইনগুলিকে সাধারণীকরণ করে ...

পিইপি -0342 পাইথনে কর্টিন প্রয়োগের বিশদ।

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


1

হ্যাঁ এটা সম্ভব। আপনার গেমটিতে এক ধরণের প্রধান গেম লুপ থাকবে। এটার মতো কিছু:

while(gameRunning)
{
  checkUserInput()
  updateGame()
  renderGame()
}

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

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

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

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


1

আপনার প্রশ্নটি আমি যেভাবে বুঝতে পারি তা হ'ল মূলত আপনি সমবায় মাল্টিটাস্কিংয়ের বিষয়ে জিজ্ঞাসা করছেন।

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

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

আমার মতে আরও ভাল সমাধান হ'ল সহজভাবে ফলন / ঘুমানো এবং কম্পিউটারের পাওয়ার ম্যানেজমেন্টকে তার কাজটি করতে দেওয়া। ল্যাপটপ ব্যবহারকারীরা এর জন্য আপনাকে আরও ভাল পছন্দ করবে।

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