কিভাবে এসডিএল দিয়ে ব-দ্বীপ সময় গণনা?


11

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

    Uint64 NOW, LAST;
    double deltaTime = 0;

    while (somebool)
    {
       LAST = SDL_GetPerformanceCounter();
       NOW = SDL_GetPerformanceCounter();
       LAST = NOW;

       deltaTime = (NOW - LAST) / (double)SDL_GetPerformanceFrequency();

       /**Rendering**/
    }

আমার কাছে এই কোডটি রয়েছে তবে আমি যখনই ডেল্টটাইম প্রিন্ট আছি বা এটি ব্যবহার করার চেষ্টা করি এটি সর্বদা কিছু সত্যই র্যান্ডম এবং উন্মাদ সংখ্যার সমান হয়। এটা কি সঠিক?


2
প্রদর্শিত কোডটি সর্বদা ডেল্টার সময়কে 0 তে সেট করে রাখবে, তাই না? (এখন = শেষ, এখন - শেষ।)
ডেভিড ভ্যান কিনারা

উত্তর:


13

এসডিএল_গেটপরিফরম্যান্স ফ্রিকোয়েন্সি এসডিএলে প্রদত্ত কোড-উদাহরণটি পড়ার সময় আমি সহজেই জানতে পারি যে এই ফাংশনগুলি ব্যবহার করে আপনি কীভাবে একটি ডেল্টাটাইম গণনা করতে পারেন।

এটি আপনার কাছে মূলত এইটিতে নেমে আসা উচিত:

Uint64 NOW = SDL_GetPerformanceCounter();
Uint64 LAST = 0;
double deltaTime = 0;

while (somebool)
{
   LAST = NOW;
   NOW = SDL_GetPerformanceCounter();

   deltaTime = (double)((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );

   /**Rendering**/
}

দ্রষ্টব্য: প্রথম ফ্রেমের সর্বদা 0 এর ডেলটাটিম বা এর খুব কাছাকাছি কিছু থাকবে

এটি ডিল্টটাইমটি মিলিসেকেন্ডে পূরণ করতে হবে, এটি 0.001 দিয়ে চূড়ান্ত ফলাফলকে গুণ করে সহজেই সেকেন্ডে রূপান্তর করা যায় can

রেফারেন্স: https://wiki.libsdl.org/SDL_GetPerformanceFre वारंवारता


6
এটি আরও নির্ভুল হবে: deltaTime = ((NOW - LAST)*1000 / (double)SDL_GetPerformanceFrequency() );যেহেতু এটি পূর্ণসংখ্যা বিভাগের কারণে নম্বরটি ক্ল্যাম্পিং এড়ায়।
মর্টেনোবেল

2

তারা যেভাবে আমি ব-দ্বীপের সময় গণনা করতে গিয়েছি তার মধ্যে দিয়ে গেছে SDL_GetTicks():

struct Clock
{
    uint32_t last_tick_time = 0;
    uint32_t delta = 0;

    void tick()
    {
        uint32_t tick_time = SDL_GetTicks();
        delta = tick_time - last_tick_time;
        last_tick_time = tick_time;
    }
};

তারপরে আমি Clockমূল লুপে কেবল একটি উদাহরণ টিকাই।


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