Точность SDL_GetTicks () ниже уровня миллисекунды

Я сейчас что-то программирую с SDL2.
Все отлично работает, но у меня проблема с SDL_GetTicks() метод.
Обычно он должен возвращать общее время приложения в миллисекундах, но большую часть времени он всегда возвращает значение 0, а иногда и значение 1.

Я инициализировал SDL с SDL_INIT_EVERYTHING флаг.

Проблема следующего кода в том, что цикл слишком быстрый, поэтому время дельта меньше 1 мс. Есть ли способ для достижения более высокой точности?

#include "Application.hpp"
void Application::Initialize()
{
int sdl_initialize_result = SDL_Init(SDL_INIT_EVERYTHING);
if(sdl_initialize_result < 0)
{
std::cerr << "Failed to initialize SDL !" << std::endl << SDL_GetError() << std::endl;
}

window = SDL_CreateWindow("Project Unknown", 100, 100, 800, 600, SDL_WINDOW_SHOWN);
if(window == nullptr)
{
std::cerr << "Failed to create  SDL window !" << std::endl << SDL_GetError() << std::endl;
}

last_update_time = SDL_GetTicks();
}

void Application::Dispose()
{
SDL_DestroyWindow(window);
SDL_Quit();
}

void Application::Render()
{
}

void Application::Update()
{
Uint32  current_time = SDL_GetTicks();
Uint32  delta_time = current_time - last_update_time;SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
{
should_close = true;
}
break;

default:
{

}
break;
}
}

// Update game objects with delta_time

last_update_time = current_time;
}void Application::Run()
{
Initialize();

should_close = false;
do
{
Render();
Update();
}
while(should_close == false);

Dispose();
}

4

Решение

Вы не можете использовать SDL_GetTicks (), если вы хотите более высокую точность, но есть много других альтернатив. Если вы хотите быть независимым от платформы, вы должны быть осторожны, но вот портативный пример C ++ 11, который поможет вам начать:

#include <iostream>
#include <chrono>
typedef std::chrono::high_resolution_clock Clock;

int main()
{
auto t1 = Clock::now();
auto t2 = Clock::now();
std::cout << "Delta t2-t1: "<< std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count()
<< " nanoseconds" << std::endl;
}

Запуск этого на ideone.com дал мне:

Delta t2-t1: 282 nanoseconds
5

Другие решения

Ну, конечно, вам нужно подождать, пока> = 1ms пройдет, прежде чем обновлять ваш последний счетчик тиков

void Application::Update()
{
Uint32  current_time = SDL_GetTicks();
Uint32  delta_time = current_time - last_update_time;

SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
{
should_close = true;
}
break;

default:
break;
}
}

if (delta_time >= 1)
{
// Update game objects with delta_time

last_update_time = current_time;
}
}
0

По вопросам рекламы [email protected]