কখন আমার একটি স্থির বা পরিবর্তনশীল সময়ের পদক্ষেপ ব্যবহার করা উচিত?


257

কোনও গেম লুপটি স্থির বা পরিবর্তনশীল সময়ের ধাপের ভিত্তিতে হওয়া উচিত? এক কি সর্বদা উচ্চতর, বা সঠিক পছন্দটি খেলা অনুসারে আলাদা হয়?

পরিবর্তনশীল সময় পদক্ষেপ

পদার্থবিজ্ঞানের আপডেটগুলি "শেষ আপডেটের পর থেকে সময় কেটে যায়" আর্গুমেন্ট কেটে যায় এবং তাই ফ্রেমরেট-নির্ভর। এর অর্থ হিসাবে গণনা করা position += distancePerSecond * timeElapsed

পেশাদাররা : মসৃণ, সহজ কোড করার জন্য
কনস : খুব ছোট বা বড় পদক্ষেপ এ অ নির্ণায়ক অনিশ্চিত

ডিওয়াইটারগুলির উদাহরণ:

while( game_is_running ) {
    prev_frame_tick = curr_frame_tick;
    curr_frame_tick = GetTickCount();
    update( curr_frame_tick - prev_frame_tick );
    render();
}

স্থির সময় পদক্ষেপ

আপডেটগুলি একটি "সময় অতিবাহিত" এমনকি গ্রহণও করতে পারে না, কারণ তারা ধরে নেয় যে প্রতিটি আপডেট নির্দিষ্ট সময়সীমার জন্য। হিসাবে গণনা করা যেতে পারে position += distancePerUpdate। উদাহরণস্বরূপ রেন্ডার চলাকালীন একটি অন্তরঙ্গকরণ অন্তর্ভুক্ত।

পেশাদাররা : পূর্বাভাসযোগ্য, ডিটারমিনিস্টিক (নেটওয়ার্ক সিঙ্ক করা সহজ?), পরিষ্কার গণনা কোড
কনস : ভি-সিঙ্ক নিরীক্ষণের জন্য সিঙ্ক করা হয়নি (আপনি বিভাজন না করলে জিটারি গ্রাফিক সৃষ্টি করে), সীমিত সর্বাধিক ফ্রেম রেট (যদি আপনি বিভাজন না করেন), ফ্রেমওয়ার্কের মধ্যে কাজ করা শক্ত পরিবর্তনশীল সময়ের পদক্ষেপগুলি ( পাইগলেট বা ফ্লিক্সেলের মতো ) ধরে নিন

ডিওয়াইটারগুলির উদাহরণ:

while( game_is_running ) {
    while( GetTickCount() > next_game_tick ) {
        update();
        next_game_tick += SKIP_TICKS;
    }
    interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
                    / float( SKIP_TICKS );
    render( interpolation );
}

কিছু সংস্থান


6
আপনার গেমের জন্য ভেরিয়েবল টাইমস্টেপ এবং পদার্থবিজ্ঞানের জন্য স্থির পদক্ষেপগুলি ব্যবহার করুন
ড্যানিয়েল লিটল

7
আমি বলব না যে ভেরিয়েবল টাইম স্টেপ ঠিক কোড করা সহজ কারণ নির্দিষ্ট সময় পদক্ষেপের সাথে আপনাকে "সর্বত্র গণনা সময় পরিবর্তিত ভেরিয়েবলের সাথে বিভ্রান্ত করতে হবে না"। এটি এতটা কঠিন নয়, তবে আমি প্রো হিসাবে "কোডে আরও সহজ" যুক্ত করব না।
pek

সত্য, আমি মনে করি যে আমি আপনাকে পরিবর্তনশীল সময়ের পদক্ষেপগুলিকে কীভাবে বিভক্ত করতে হবে না তা উল্লেখ করছি।
নিক সনেভেল্ড

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

আপনি এই সরঞ্জামটি থেকে এই ভিজুয়ালটি পরীক্ষা করতে পারেন: s3.amazonaws.com/picobots/assets/unity/jerky-motion/… যদিও ফ্রেম রেট পরিবর্তিত হয় তখন তারা কীভাবে দেখায় সে সম্পর্কে ধারণা দেয় না
বুডি

উত্তর:


135

প্রশ্ন সম্পর্কিত দুটি বিষয় আছে।

  • পদার্থবিজ্ঞানের ধাপের হারটি ফ্রেমের হারের সাথে আবদ্ধ হওয়া উচিত?
  • পদার্থবিজ্ঞানের ধ্রুবক ডেল্টাস দিয়ে পদক্ষেপ নেওয়া উচিত?

গ্লেন ফিল্ডারের ফিক্স আপনার সময় পদক্ষেপে তিনি "ফ্রি ফিজিক্স" বলেছিলেন। তার অর্থ আপনার পদার্থবিজ্ঞানের আপডেটের হারটি আপনার ফ্রেম হারের সাথে আবদ্ধ হওয়া উচিত নয়

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

বক্স 2 ডি এর জন্য এরিন ক্যাটোর সুপারিশগুলিতে তিনি এটিকেও সমর্থন করেন।

সুতরাং সময় ফ্রেম আপনার ফ্রেমের হারের সাথে বেঁধে রাখবেন না (যদি না আপনি সত্যিই সত্যই করতে চান)।

পদার্থবিজ্ঞানের ধাপের হারটি কি আপনার ফ্রেমের হারের সাথে আবদ্ধ হওয়া উচিত? না।


স্থির পদক্ষেপ বনাম চলক পদক্ষেপের বিষয়ে ইরিনের চিন্তাভাবনা:

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

স্থির বনাম পরিবর্তনশীল পদক্ষেপের বিষয়ে গ্লেনের চিন্তাভাবনা:

আপনার টাইমস্টেপ বা বিস্ফোরণ ঠিক করুন

... আপনার যদি গাড়ী সিমুলেশনে শক শোষণকারীদের জন্য সত্যিকারের কঠোর বসন্তের সীমাবদ্ধতা থাকে তবে ডিটি-র ক্ষুদ্র পরিবর্তনগুলি আসলে সিমুলেশনটি বিস্ফোরিত করতে পারে। ...

পদার্থবিজ্ঞানের ধ্রুবক ডেল্টাস দিয়ে পদক্ষেপ নেওয়া উচিত? হ্যাঁ.


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

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

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


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

55

আমি মনে করি সত্যিকার অর্থে 3 টি বিকল্প রয়েছে তবে আপনি তাদের কেবল 2 হিসাবে তালিকাবদ্ধ করছেন:

বিকল্প 1

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

বিকল্প 2

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

https://stackoverflow.com/questions/153507/calculate-the-position-of-an-accelerating-body-after-a-certain-time

বিকল্প 3

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

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


বিকল্প 2 সম্পর্কিত: আমি নিশ্চিত নই যে পাইথাগোরাস দূরত্বের চেকগুলির তুলনায় কোনও রেইসকাস্ট কখনও দ্রুত হতে পারে, যদি আপনি পাইথাগোরাস প্রয়োগের ক্ষেত্রে খুব জোরদার হয়ে থাকেন তবে আপনি যদি ব্রডফেজ যোগ না করেন তবে রাইকাস্টও খুব ব্যয়বহুল হবে।
কাজ

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

বিকল্প 3 - এক্সএএনএ পদ্ধতির জোয়েল মার্টিনেজের বর্ণনার মতো শোনাচ্ছে।
শীর্ষস্থানীয়

1
এটি সত্যিই ভাল উত্তর। তিনটি বিকল্পেরই তাদের জায়গা রয়েছে এবং তারা কখন উপযুক্ত হবে তা বোঝা গুরুত্বপূর্ণ।
অ্যাডাম নায়লার

আমি যে সমস্ত এমএমওতে কাজ করেছি (EQ, ল্যান্ডমার্ক / EQNext [কান্না], PS2 [সংক্ষেপে], এবং ESO), আমরা সবসময় ভেরিয়েবল ফ্রেম সময় ব্যবহার করেছি। আমি কখনই সেই নির্দিষ্ট সিদ্ধান্তে অংশ নিতে পারি না, কেবল সত্যের পরে প্রকাশিত হয়েছিল এবং অন্যেরা কী সিদ্ধান্ত নিয়েছে তা কাজে লাগিয়েছে।
মার্ক স্টোর

25

এক্সএনএ ফ্রেমওয়ার্ক যেভাবে নির্দিষ্ট সময় পদক্ষেপটি প্রয়োগ করে তা আমি সত্যিই পছন্দ করি । যদি প্রদত্ত একটি ড্র কলটি খুব বেশি সময় নেয় তবে এটি "ক্যাচ আপ" না হওয়া পর্যন্ত বারবার আপডেট কল করবে। শন হারগ্রিভস এখানে এটি বর্ণনা করে:
http://blogs.msdn.com/b/shawnhar/archive/2007/11/23/game-timing-in-xna-game-studio-2-0.aspx

২.০-তে, অঙ্কনের আচরণটি পরিবর্তিত হয়েছে:

  • বর্তমান সময়ের জন্য যতবার প্রয়োজন কল আপডেট করুন
  • কল করুন একবার
  • পরবর্তী আপডেটের সময় না হওয়া পর্যন্ত অপেক্ষা করুন

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

দ্রষ্টব্য: এক্সএনএ পাশাপাশি চলক টাইমস্টেপ সমর্থন করে, এটি কেবল একটি সেটিংস।


এটি গেম লুপটি করার সবচেয়ে সাধারণ উপায়। যাইহোক, মোবাইল ডিভাইসগুলির সাথে কাজ করার সময় এটি ব্যাটারি লাইফের পক্ষে দুর্দান্ত নয়।
নাইট 666

1
@ knight666; আপনি কি পরামর্শ দিচ্ছেন যে একটি দীর্ঘ সময়সীমা ব্যবহার করে, পুনরাবৃত্তির হ্রাসমান পরিমাণটি ব্যাটারলাইফ বাঁচাবে?
ফালস্ট্রো

এটি এখনও একটি পরিবর্তনশীল আপডেট - কিছু স্থির মান (যেমন, এক সেকেন্ডের 1/30 তম) চেয়ে ফ্রেম রেন্ডার করতে কত সময় নেয় তার উপর ভিত্তি করে আপডেট ডেল্টা পরিবর্তিত হয়।
ডেনিস মুন্সি

1
@ ডেনিস: আমি বুঝতে পেরেছি, আপডেট ফাংশনটি একটি নির্দিষ্ট ব-দ্বীপের সাথে ডাকা হয় ...
আরসিআইএক্স ২

3
@ নাইট 66666 উহ - আপনি এটি কীভাবে দেখবেন? আপনার যদি ভাইসাইক থাকে এবং তোতলা না হয় - এই পদ্ধতিগুলি অভিন্ন হওয়া উচিত! এবং যদি আপনার ভাইসাইক বন্ধ থাকে তবে আপনি প্রয়োজনের চেয়ে বেশি বার আপডেট করছেন এবং সম্ভবত সিপিইউ (এবং তাই ব্যাটারি) নষ্ট না করে নষ্ট করবেন!
অ্যান্ড্রু রাসেল 5

12

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

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

এটি বাস্তবায়নের পক্ষে তুচ্ছ নয়, তবে এটি ভবিষ্যতের প্রমাণ প্রমাণ করতে পারে।


8

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

আমার গেম লুপগুলি আপডেট করার জন্য ফ্রেমের পরিমাণ গণনা করে (আসুন এই এফ কল করুন), এবং তারপরে এফ ডিগ্রিযুক্ত লজিক আপডেটগুলি সম্পাদন করুন। প্রতিটি যুক্তি আপডেট আপডেটের একটি ধ্রুবক ইউনিট ধরে রাখে (যা প্রায়শই আমার গেমগুলির মধ্যে 1 সেকেন্ডের 100 তম হয়)। প্রতিটি আপডেট ক্রমানুসারে সঞ্চালিত হয় যতক্ষণ না সমস্ত এফ ডিস্ট্রিট লজিক আপডেট সম্পাদিত হয়।

যুক্তিযুক্ত পদক্ষেপগুলিতে বিযুক্ত আপডেট কেন? ঠিক আছে, যদি আপনি চেষ্টা করে যান এবং অবিচ্ছিন্ন পদক্ষেপগুলি ব্যবহার করেন এবং হঠাৎ আপনার পদার্থবিজ্ঞানের বিভ্রান্তি রয়েছে কারণ গণনা করা গতি এবং দূরত্ব দূরত্বের এফ এর বিশাল মান দ্বারা গুণিত হয় because

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

আমার গেমটিতে, আমি "মসৃণ" (ধরণের) ধীর গতিতে দুটি ড্রয়ের মধ্যে সম্ভব হওয়া উচিত এমন লজিক ক্যাচআপের পরিমাণ সীমাবদ্ধ করার অনুমতি দিই। আমি ক্ল্যাম্পিং করে এটি করছি: এফ = মিনিট (এফ, ম্যাক্স_ফ্রেমে_ডেলটিএ) যার সাধারণত MAX_FRAME_DELTA = 2/100 * গুলি বা 3/100 * গুলি থাকে। সুতরাং গেম যুক্তি থেকে অনেক দূরে থাকাকালীন ফ্রেমগুলি এড়িয়ে যাওয়ার পরিবর্তে, কোনও বৃহত ফ্রেম ক্ষতি (যা জিনিসকে ধীর করে দেয়) বাতিল করুন, কয়েকটি ফ্রেম পুনরুদ্ধার করুন, আঁকুন এবং আবার চেষ্টা করুন।

এটি করার মাধ্যমে, আমি এও নিশ্চিত করেছিলাম যে প্লেয়ারের নিয়ন্ত্রণগুলি স্ক্রিনে আসলে যা দেখানো হয়েছে তার সাথে ঘনিষ্ঠভাবে সমন্বয় সাধন করে।

ফাইনাল প্রোডাক্ট সিউডোকোড হ'ল এরকম কিছু (ব-দ্বীপটি F এর আগে উল্লেখ করা হয়েছে):

// Assume timers have 1/100 s resolution
const MAX_FRAME_DELTA = 2
// Calculate frame gap.
var delta = current time - last frame time
// Clamp.
delta = min(delta, MAX_FRAME_RATE)
// Update in discrete steps
for(i = 0; i < delta; i++)
{
    update single step()
}
// Caught up again, draw.
render()

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


দৃ last়ভাবে এই শেষ পয়েন্টের সাথে একমত; প্রায় কাছাকাছি মধ্যে সব গেম, ইনপুট 'মন্দীভূত' should যখন ফ্রেমরেট ড্রপ। যদিও এটি কিছু গেমগুলিতে (যেমন মাল্টিপ্লেয়ার) সম্ভব নয়, তবুও এটি সম্ভব হলে আরও ভাল হত। : পি এটি দীর্ঘ ফ্রেম থাকা এবং তারপরে গেম ওয়ার্ল্ডকে 'সঠিক' অবস্থায় 'লাফিয়ে' রাখার চেয়ে আরও ভাল লাগে।
Ipsquiggle

কোনও আরকেড মেশিনের মতো স্থির হার্ডওয়্যার ছাড়াই, যখন হার্ডওয়ারটি ধরে রাখতে না পারে তখন আরকেড গেমস সিমুলেশনটি ধীর করে দেয় ধীর মেশিনের সাথে প্রতারণা করে।

জো কেবলমাত্র যদি আমরা "প্রতারণা" সম্পর্কে চিন্তা করি তবে তা গুরুত্বপূর্ণ। সর্বাধিক আধুনিক গেমগুলি খেলোয়াড়দের মধ্যে প্রতিযোগিতার বিষয়ে নয়, কেবল একটি মজাদার অভিজ্ঞতা তৈরি করে।
আয়ান

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

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

6

এই সমাধানটি সমস্ত কিছুর জন্য প্রযোজ্য না, তবে ভ্যারিয়েবল টাইমস্টেপের আরও একটি স্তর রয়েছে - বিশ্বের প্রতিটি বস্তুর জন্য ভেরিয়েবল টাইমস্টেপ।

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

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

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

while (game_is_running)
{
   world.draw_to_screen(); 
   world.get_player_input(); 
   world.consume_events_until(current_time + time_step); 
   current_time += time_step; 
}

স্পেস সিমুলেটারে একটি ব্যবহারের মূল কারণ হ'ল যথাযথতা হ্রাস ব্যতীত নির্বিচার সময়-ত্বরণ সরবরাহ করা। এক্সফলাইটের কিছু মিশনগুলি গেম-বছরগুলি সম্পূর্ণ হতে পারে এবং এমনকি একটি 32x ত্বরণ বিকল্প অপর্যাপ্ত হবে। ব্যবহারযোগ্য সিমের জন্য আপনার 1,000,000 এরও বেশি ত্বরণ প্রয়োজন, যা টাইম-স্লাইস মডেলটিতে করা কঠিন। ইভেন্ট-ভিত্তিক মডেলটির সাথে, আমরা 1 এস = 7 এমএস থেকে 1 এস = 1 ইয়ার পর্যন্ত নির্বিচারে সময় রেট পাই।

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

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

কনস: জটিলতা এবং এই মডেলটিকে সমর্থন করে এমন কোনও অফ-শেল্ফ পদার্থবিজ্ঞানের ইঞ্জিনের অভাব :)


5

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

এটি কোডের একটি সহজ টুকরো তাই এটি চেষ্টা করে দেখতে এবং এটি আপনার গেমের জন্য কার্যকর কিনা তা দরকারী।

now = currentTime
frameTime = now - lastTimeStamp // time since last render()
while (frameTime > updateTime)
    update(timestep)
    frameTime -= updateTime     // update enough times to catch up
                                // possibly leaving a small remainder
                                // of time for the next frame

lastTimeStamp = now - frameTime // set last timestamp to now but
                                // subtract the remaining frame time
                                // to make sure the game will still
                                // catch up on those remaining few millseconds
render()

একটি নির্দিষ্ট সময়ের পদক্ষেপ ব্যবহারের মূল সমস্যাটি হ'ল একটি দ্রুত কম্পিউটার সহ প্লেয়াররা গতির ব্যবহার করতে সক্ষম হবে না। গেমটি যখন 30fps এ আপডেট হয় তখন 100fps এ রেন্ডারিং ঠিক 30fps এ রেন্ডারিংয়ের সমান।

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


2
গেমটি সাবধানে তৈরি করা হলে, রেন্ডার পদ্ধতি 30fps আপডেটগুলি আসলে 30fps এ রেন্ডারিংয়ের মতো নয় এমন প্রসারণ করতে পারে।
রিকিট

3

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

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

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


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

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

0

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

ব্যক্তিগতভাবে, আমি অপশন 1 পছন্দ করি যখন আমি এটির সাথে চলে যেতে পারি এবং যখন রিয়েল টাইমে সিঙ্ক করতে হয় তখন অপশন 3। আমি শ্রদ্ধা করি যে আপনি কী করছেন তা আপনি যখন জানবেন তখন বিকল্প 2 একটি ভাল বিকল্প হতে পারে তবে আমি আমার সীমাবদ্ধতাগুলি এটি থেকে ভাল থাকার জন্য যথেষ্ট জানি know


আপনি যদি উত্তর চুরি করতে চান তবে কমপক্ষে সেই ব্যক্তিকে ক্রেডিট করুন!
প্রাইমরক

0

আমি খুঁজে পেয়েছি যে স্থির টাইমস্টেপগুলি 60fps এ সিঙ্ক্রোনাইজ করা মিরর মসৃণ অ্যানিমেশন দেয়। এটি ভিআর অ্যাপ্লিকেশনগুলির জন্য বিশেষত গুরুত্বপূর্ণ। অন্য যে কোনও কিছুই শারীরিকভাবে বমি বমি ভাব করছে।

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

নিয়মটি হল যদি আপনার 3 ডি গেমটি ভিআর মোডে মসৃণ হয় তবে এটি নন-ভিআর মোডে দুর্দান্ত হবে be

এই দুটি তুলনা করুন (কার্ডবোর্ড ভিআর অ্যাপ্লিকেশন)

(পরিবর্তনশীল টাইমস্টেপ)

(স্থির টাইমস্টেপগুলি)

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

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

বিকাশের সময় আপনার ফ্রেমরেট সর্বদা প্রদর্শিত রাখুন। আসল খেলাটি এটি 60fps এ স্থির রাখা। এটি বেশিরভাগ স্ক্রিনের জন্য এবং বেশিরভাগ চক্ষুর জন্য নেটিভ সিঙ্ক রেট।

আপনি যে ফ্রেমওয়ার্কটি ব্যবহার করছেন তা আপনাকে একটি সিঙ্ক অনুরোধ সম্পর্কে অবহিত করতে বা টাইমার ব্যবহার করতে সক্ষম হওয়া উচিত। এটি এড়াতে ঘুম /োকা / অপেক্ষা করতে দেরি করবেন না - এমনকি সামান্য বৈচিত্রগুলি লক্ষণীয়।


0

পরিবর্তনশীল সময়ের পদক্ষেপগুলি প্রক্রিয়াগুলির জন্য যা যত তাড়াতাড়ি চালানো উচিত: রেন্ডার সাইকেল, ইভেন্ট হ্যান্ডলিং, নেটওয়ার্ক স্টাফ ইত্যাদি for

আপনার যখন ভবিষ্যদ্বাণীযোগ্য এবং স্থিতিশীল হওয়ার জন্য কিছু দরকার তখন নির্দিষ্ট সময়ের পদক্ষেপগুলি। এর মধ্যে রয়েছে, তবে পদার্থবিজ্ঞান এবং সংঘর্ষ সনাক্তকরণের মধ্যে সীমাবদ্ধ নয়।

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

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

সময়সীমার একটি গুরুত্বপূর্ণ বিষয় তৈরি করে, বাকি সমস্ত কিছুই অবিচ্ছিন্নভাবে পরিচালনা করা যায়।

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