当前位置: 首页 > 知识库问答 >
问题:

SDL_GetTicks()精度低于毫秒级

太叔航
2023-03-14

我现在用SDL2编程。所有这些都可以正常工作,但我对SDL\u GetTicks()方法有一个问题。通常,它应该以毫秒为单位返回应用程序的总时间,但它总是在大部分时间返回值0,有时返回值1。

我用SDL_INIT_EVERYTHING标志初始化SDL。

以下代码的问题是循环太快,因此增量时间小于1 ms。是否有方法实现更高的精度?

#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();
}

共有2个答案

郎灿
2023-03-14

当然,你需要等到

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;
    }   
}
水铭晨
2023-03-14

如果希望获得更高的精度,则不能使用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
 类似资料:
  • 我在代码中使用倒计时。问题是,倒计时不准确。onTick方法并不总是每秒执行一次,它可能需要几毫秒的时间。当试图基于millisUntilFinished执行某项任务时,这会成为一个问题。当我的20秒计时器超过10秒时,我正在尝试登录: 以下是相关代码: 这里出现了一个问题,因为countDownTimer可能永远不会有millisUntilFinished==10000,它可能等于1001,因此

  • sleep(500)将挂起当前线程至少500毫秒,我知道它可能会比500多一点,但绝不会少于这个时间。现在,1毫秒=1000000纳秒,我想暂停当前线程500毫秒,即=500*1000000纳秒,但当我运行以下代码时,它有时睡眠时间少于指定的纳秒值。这是为什么呢?以及如何至少睡500*1000000纳秒。 有时输出是

  • 问题内容: 因此,我刚刚发现MySQL中最令人沮丧的错误。 显然,该字段及其支持功能不支持比秒更高的精度! 所以我正在使用PHP和Doctrine,我真的需要那些微秒(我正在使用属性)。 我发现我可以使用一个字段来存储值。但是学说会增加毫秒吗?我认为它只是将NOW()分配给该字段。我还担心通过代码散布的日期操作功能(在SQL中)会中断。 我还看到了有关编译UDF扩展的内容。这是不可接受的,因为我或

  • 在Java 8中有可能获得微秒吗?Java 8类有一个方法,该方法旨在返回,但在Linux(Ubuntu)和OS X(10.11.5)上,它只返回(当我运行它时,它返回,它等于),我确实需要能够获得。 因为javascript方法返回一个精确值,所以可以在我的计算机上获得(因此可以从中获得)。 在任何人开始精确与精确的争论之前,我知道纳秒在线程之间是完全不可靠的,不应该用于比较。 编辑: 所以我意

  • 我在用BigDecimal做一些计算。最近我遇到: 这个问题的答案贴在这里:算术异常:“非终止十进制扩展;没有精确可表示的十进制结果” 这意味着,有一些除法有无限的小数,所以BigDecimal告诉我它不能精确计算结果。为了避免这种情况,我必须调用

  • Spring启动版本“2.3.4.release” Java 11 org.springframework.Boot:spring-boot-starter-jdbc org.springframework.Boot:spring-boot-starter-data-jpa spring-data-jpa-2.3.4.release 运行时(mysql:mysql-connector-java)