目次 - API(機能別) - タイマ - SDL_GetPerformanceFrequency

# SDL_GetPerformanceFrequency

1秒あたりの高分解能カウンタを得る

## 構文

`Uint64 SDL_GetPerformanceFrequency(void)`

## 戻り値

環境に依存した1秒あたりのカウント数を得る.

## サンプルコード

``

    #include "SDL.h"

    #define DEFAULT_RESOLUTION  1

    static int ticks = 0;

    static Uint32 SDLCALL
    ticktock(Uint32 interval, void *param)
    {
        ++ticks;
        return (interval);
    }

    static Uint32 SDLCALL
    callback(Uint32 interval, void *param)
    {
        SDL_Log("タイマ %d : パラメータ = %d", interval, (int) (uintptr_t) param);
        return interval;
    }

    int
    main(int argc, char *argv[])
    {
        int i, desired;
        SDL_TimerID t1, t2, t3;
        Uint32 start32, now32;
        Uint64 start, now;

        /* 通常のアプリケーションログを有効にする */
        SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);

        if (SDL_Init(SDL_INIT_TIMER) < 0) {
            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDLを初期化できなかった: %s", SDL_GetError());
            return (1);
        }

        /* タイマを開始する */
        desired = 0;
        if (argv[1]) {
            desired = SDL_atoi(argv[1]);
        }
        if (desired == 0) {
            desired = DEFAULT_RESOLUTION;
        }
        t1 = SDL_AddTimer(desired, ticktock, NULL);

        /* 10秒間待つ */
        SDL_Log("10秒間待つ");
        SDL_Delay(10 * 1000);

        /* タイマを停止する */
        SDL_RemoveTimer(t1);

        /* 結果を表示する */
        if (ticks) {
            SDL_Log("タイマ分解能: 要求 = %d ms, 実際 = %f ms",
                    desired, (double) (10 * 1000) / ticks);
        }

        /* 複数のタイマのテスト */
        SDL_Log("複数のタイマのテスト...");
        t1 = SDL_AddTimer(100, callback, (void *) 1);
        if (!t1)
            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"タイマ1を生成できなかった: %s", SDL_GetError());
        t2 = SDL_AddTimer(50, callback, (void *) 2);
        if (!t2)
            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"タイマ2を生成できなかった: %s", SDL_GetError());
        t3 = SDL_AddTimer(233, callback, (void *) 3);
        if (!t3)
            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"タイマ3を生成できなかった: %s", SDL_GetError());

        /* 10秒間待つ */
        SDL_Log("10秒間待つ");
        SDL_Delay(10 * 1000);

        SDL_Log("タイマ1を削除し, さらに5秒間待つ");
        SDL_RemoveTimer(t1);

        SDL_Delay(5 * 1000);

        SDL_RemoveTimer(t2);
        SDL_RemoveTimer(t3);

        start = SDL_GetPerformanceCounter();
        for (i = 0; i < 1000000; ++i) {
            ticktock(0, NULL);
        }
        now = SDL_GetPerformanceCounter();
        SDL_Log("100万回のticktock関数の呼び出しには %f ms を要した", (double)((now - start)*1000) / SDL_GetPerformanceFrequency());

        SDL_Log("1秒あたりの高分解能カウンタ: %"SDL_PRIu64"", (unsigned long long) SDL_GetPerformanceFrequency());
        start32 = SDL_GetTicks();
        start = SDL_GetPerformanceCounter();
        SDL_Delay(1000);
        now = SDL_GetPerformanceCounter();
        now32 = SDL_GetTicks();
        SDL_Log("SDL_Delay(1000) = %d ms, 高分解能では %f", (now32-start32), (double)((now - start)*1000) / SDL_GetPerformanceFrequency());

        SDL_Quit();
        return (0);
    }

## バージョン

SDL 2.0.0以降

## 関連項目(関数)

SDL_GetPerformanceCounter

## SDL Wikiへのリンク

SDL_GetPerformanceFrequency - SDL Wiki