কিভাবে ডেল্টা সময় পাবেন এবং ব্যবহার করবেন


14

আমার খেলতে ইঁদুর দেখতে এবং হাঁটা রয়েছে তবে এগুলি খুব ধীর এবং ব্যবহারে শক্ত। আমি মনে করি এটি কারণ আমি স্থির গতি ব্যবহার করছি। আমি শুনেছি যে বড় প্রকল্পগুলিতে বিকাশকারীরা ব-দ্বীপের সময় ব্যবহার করে। আমি কি পেটুকুতে ডেল্টার সময় গণনা করব? আমি ডেল্টার সময় ব্যবহার করে গতি কীভাবে গণনা করব?


সি 11 এবং সি ++ 11 এও এখন ন্যানোসেকেন্ডের ঘড়ি রয়েছে: স্ট্যাকওভারফ্লো.com / a / 36095407 / 895245 || stackoverflow.com/a/5524138/895245
Ciro Santilli 新疆 改造 中心 法轮功 六四

উত্তর:


18

"ডেল্টা সময়" দুটি ফ্রেম আপডেটের মধ্যে সময় অতিবাহিত হত (তবে এটি অন্যান্য প্রসঙ্গেও ব্যবহৃত হতে পারে; এটি সাধারণত একটি সময়ের বিয়োগের ফলাফল)।

আপনি গ্লুটগেট পদ্ধতি এবং GLUT_ELAPSED_TIME পরামিতি, কিছু কিছু ক্রিয়াকলাপ ব্যবহার করে ডেল্টার সময় পেতে পারেন ।

নিম্নলিখিত লাইনটি যেহেতু গ্লুটআইনিট ডাকা হয়েছিল (বা গ্লুটগেটে প্রথম কল (GLUT_ELAPSED_TIME)) হয়েছে তার পর থেকে মিলিসেকেন্ডের সংখ্যা ফিরে আসে:

int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);

সুতরাং আপনি যদি প্রতিটি রেন্ডারিং লুপে বর্তমান সময়সিনস্ট স্টার্টটি নিবন্ধন করেন তবে আপনি পুরানোটিকে নতুনটিতে বিয়োগ করে ডেল্টটাইমটি জানতে পারবেন।

int oldTimeSinceStart = 0;

while( ... )
{
     int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
     int deltaTime = timeSinceStart - oldTimeSinceStart;
     oldTimeSinceStart = timeSinceStart;

     //... stuff to update using deltaTime
}

আপনি এটি প্রায় একইভাবে করতে পারেন, ঘড়ির সাথে সি / সি ++ সিটিএম লাইব্রেরি ব্যবহার করে () এবং ম্যাক্রো ধ্রুবক অভিব্যক্তি CLOCKS_PER_SEC যা একটি ঘড়ির টিক এবং সেকেন্ডের মধ্যে সম্পর্ক নির্দিষ্ট করে।


মূলত, আপনি একটি স্থায়ী সময়ের মানটি ব্যবহার না করে এই বিচ্ছিন্ন সময়ের সাথে অনুপাতের সাথে আপনার চলনগুলি আপডেট করতে ডেল্টটাইম ব্যবহার করতে পারেন। এইভাবে, আপনার প্রোগ্রামটি 60 fps বা 10 fps এ চলে যদি আপনার চরিত্রের চলনের গতি প্রায় একই হওয়া উচিত almost


এখানে একটি ছোট উদাহরণ রয়েছে: ধরুন আপনি x অক্ষের উপর প্রতি সেকেন্ডে 10 ইউনিট দিয়ে কিছু সরিয়ে নিতে চান। আপনি এর মতো কিছু করতে পারেন (যদি ডেল্টটাইম প্রকৃতপক্ষে মিলিসেকেন্ড ব্যবহার করে)।

Position.x += 10/1000 * deltaTime;

এইভাবে, আপনার প্রোগ্রামটি 2 বার বা 100 বার আপডেট হয়েছে কিনা, 1 সেকেন্ড পরে অবস্থানটি প্রায় একই রকম হওয়া উচিত এবং গেম-প্লেতে কোনও নির্দিষ্ট কম্পিউটারের নীচের fps দ্বারা এটি নির্দিষ্ট মান ব্যবহার না করে কম প্রভাবিত করে।

  • স্থির মান সহ ==> কম fps = কম আপডেট = ধীর গতিবিধি যেখানে উচ্চ fps = আরও আপডেট = খুব দ্রুত গতিবিধি।

  • ডেল্টটাইম সহ ==> একই ধরণের আন্দোলন "প্রায়"।


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


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

@ ਸੀিয়ান আমি জিএলইউটিও ব্যবহার করি না, তবে এটি প্রশ্নের প্যারামিটারে ছিল তাই আমি এই বিষয়টি মাথায় রেখে উত্তর দিয়েছিলাম;) তবে, গেমসে মিলিসেকেন্ডগুলি পরিচালনা করতে ইন্টের "অপর্যাপ্ততা" সম্পর্কে আমি আপনার অবস্থান সম্পর্কে আগ্রহী । একটি positive intস্বাক্ষরিত হলে সাধারণত 2.147.483.647 এ যায় এবং স্বাক্ষরিত না হলে 4.294.967.295 পর্যন্ত চলে যায় ... সুতরাং আমরা যদি ছোটটিকেও বিবেচনা করি তবে, 2.147.483.647 মিলি সেকেন্ড প্রায় 25 দিনের ... বেশিরভাগ গেমটি পরিচালনা করার জন্য এটি যথেষ্ট পর্যাপ্ত হওয়া উচিত টাইমার এবং এটি পর্যাপ্ত না হলেও আমরা এখনও যুক্তিসঙ্গতভাবে ব্যবহার করতে পারি unsigned int(~ 50 দিন) বা একটি long long(যেমন আমি সাধারণত করি)।
ভালকিয়া

1
@ ভালকেয়া পয়েন্টটি সর্বোচ্চ নয়, এটি নিম্ন প্রান্তে রেজোলিউশন। যেহেতু 60 এফপিএসে একটি একক ফ্রেমটি কেবল 16 2 / 3rds এমএস, 1 মিমি যথার্থতা (মিলের সেকেন্ড হিসাবে পূর্ণসংখ্যার হিসাবে উপস্থাপন করা) 5% এরও বেশি ত্রুটির মার্জিন উপস্থাপন করে - সিমুলেশনগুলিকে দূরে ফেলে দেওয়ার পক্ষে যথেষ্ট। মাইক্রোসেকেন্ডগুলির একটি পূর্ণসংখ্যা গণনাটি বহনযোগ্য হবে, তবে মিলিসেকেন্ডগুলি খুব বেশি মোটা।
স্টিভেন স্টাডনিকি

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

এই জাতীয় নির্ভুলতা সমস্ত গেমের জন্য কার্যকর নয়। তবে এটি একটি খুব আকর্ষণীয় ব্যাখ্যা যা আপনার জিজ্ঞাসা এবং ঘড়ি সম্পর্কে আপনার দৃষ্টিভঙ্গি সম্পর্কে আমার জিজ্ঞাসাবাদকে পুরোপুরি জবাব দেয়। আমার এখনও কখনও উচ্চ নির্ভুল ঘড়ির প্রয়োজন হয়নি, তবে আমার ধারণা, বিষয়টি সম্পর্কে আমার জ্ঞানকে আরও গভীর করার to আপনাকে ধন্যবাদ;)
ভালকিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.