【问题标题】:SDL_RenderPresent() updates the screen irregularlySDL_RenderPresent() 不定期更新屏幕
【发布时间】:2015-12-09 20:51:08
【问题描述】:

我写了一个程序来围绕一个矩形反弹。我使用 SDL_RenderFillRect 绘制一个矩形并使用 SDL_RenderPresent 呈现该矩形,然后 SDL_RenderClear 清除渲染器以重新执行此操作。我使用 SDL_GetTicks 和 SDL_Delay 让它每秒更新 60 次,但不知何故,矩形的速度是不规则的,而不是平滑的。过去几天我尝试了不同的方法,但没有任何帮助。我应该使用 SDL_RenderPresent 让我的窗口定期更新吗?

#include <SDL.h>
#include <math.h>
#include <iostream>
#include <stdio.h>

const int width = 1200;
const int height = 800;
const double PI = 3.141592653589793;

void init();
void quit();

double x = width / 2;
double y = height / 2;
double r = 25;
double vx = 1;
double vy = 1;
double s = 4;
double tickStart = SDL_GetTicks();
double tickEnd = 0;
double tickDelta = 0;
double frameTime = 1001.0 / 60.0;
double delayTime = 0;

int c = 0;

SDL_Window* window;
SDL_Renderer* renderer;
SDL_Event *event;
SDL_Rect rect;

int main(int argc, char* argv[]) {
    init();

    // main loop
    bool running = true;
    while (running) {
        event = new SDL_Event;

        while (SDL_PollEvent(event) != 0) {
            if (event->type == SDL_QUIT) {
                running = false;
                break;
            }
        }

        //renderer
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
        SDL_RenderClear(renderer);
        SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);

        // update position
        x = x + vx*s;
        y = y + vy*s;

        // check wall collision
        if (x - r <= 0) {
            vx = -vx;
            x = r;
        }
        else if (x + r >= width) {
            vx = -vx;
            x = width - r;
        }

        if (y - r <= 0) {
            vy = -vy;
            y = r;
        }
        else if (y + r >= height) {
            vy = -vy;
            y = height - r;
        }

        // rect     
        rect.h = rect.w = 2 * r;
        rect.x = x - r;
        rect.y = y - r;
        SDL_RenderFillRect(renderer, &rect);

        // present everything at the right time
        tickEnd = SDL_GetTicks();
        tickDelta = tickEnd - tickStart;
        delayTime = frameTime - tickDelta;
        std::cout << tickDelta << std::endl;

        if (delayTime > 0)
            SDL_Delay(delayTime);

        tickStart = SDL_GetTicks();
        SDL_RenderPresent(renderer);

        c++;
    }

    quit();
    return 0;
}

void init()
{
    SDL_Init(SDL_INIT_EVERYTHING);
    window = SDL_CreateWindow("test", 200, 100, width, height, SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
}

void quit()
{
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);
    SDL_QUIT;
}

【问题讨论】:

    标签: c++ sdl sdl-2 lag


    【解决方案1】:

    根据具体情况,调用 SDL_Delay() 似乎需要大约 15 毫秒。可以通过分配正确的标志来垂直同步渲染器:renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 2016-05-13
      • 2013-11-12
      相关资源
      最近更新 更多