首页 > 解决方案 > c++ SDL2 固定更新动作

问题描述

我正在尝试学习制作游戏(我是 C++ 新手),但我陷入了这个问题:

我有 2 个线程,一个用于渲染(我没有延迟,所以它会尽可能快地渲染帧),另一个线程用于更新和处理诸如按键等事件(我将延迟保持 8 毫秒,所以它将修复更新,因此在计算机 fps 上无关紧要),现在这个线程在每次更新中将播放器向右移动 1 个像素。

编码 :

#include <iostream>
#include "SDL.h"
#include "GameM.h"
#include <thread>
#undef main

GameM *game = nullptr;



void rendering() {
    while (game->running()) {
        game->render();
    }
}
void updating() {
    while (game->running()) {
        game->handleEvents();
        game->update();
        SDL_Delay(8);
    }
}

int main()
{
    game = new GameM();
    game->init("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640,400,SDL_WINDOW_SHOWN|SDL_WINDOW_BORDERLESS);

    //thread initialize
    std::thread rendering(rendering);
    std::thread updating(updating);

    //Makes main thread to wait to the threads to finish
    rendering.join();
    updating.join();

    //cleans
    game->clean();
    return 0;
}

虽然当我运行程序时:

  1. 有时玩家会被卡住一秒钟,然后继续正常移动。
  2. 当我运行程序时,鼠标会转到等待图标,有时程序会崩溃,说程序没有响应。

需要你的帮助聪明人:)

编辑3:

GameM *game = nullptr;
const float FPS = 60.0;
const float desFPS = 1000.0 / 60.0;
Uint32 firstframe;
float delta;

void updating() {
    while (game->running()) {
        firstframe = SDL_GetTicks();
        game->handleEvents();
        game->update();
        delta = SDL_GetTicks() - firstframe;
        if (desFPS > delta) {
            SDL_Delay(desFPS - delta);
        }
    }
}
int main()
{
    game = new GameM();
    game->init("Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640,400,SDL_WINDOW_SHOWN|SDL_WINDOW_BORDERLESS);

    std::thread updating(updating);

    while (game->running()) {
        game->render();
    }

    updating.join();

    game->clean();
    return 0;
}
void GameM::handleEvents() {
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
        switch (event.type) {
        case SDL_QUIT:
            isRunning = false;
            std::cout << "STOP" << std::endl;
            break;
        }
    }
}
void GameM::update(){
    dstR.x += 1;

}
void GameM::render() {
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, tex, NULL, &dstR); // render asset to window
    SDL_RenderPresent(renderer);
}

标签: c++sdl

解决方案


推荐阅读