c++ - 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;
}
虽然当我运行程序时:
- 有时玩家会被卡住一秒钟,然后继续正常移动。
- 当我运行程序时,鼠标会转到等待图标,有时程序会崩溃,说程序没有响应。
需要你的帮助聪明人:)
编辑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);
}
解决方案
推荐阅读
- javascript - `this` 未设置为猴子修补原型方法中的当前对象
- java - shopify-api-java-wrapper:什么是节点地址?
- plantuml - 有没有办法在 PlantUML 中将节点名称放在右侧?
- influxdb - 在influxdb中创建一个不能删除数据的用户?
- ruby - 在 Ruby 中将命名参数与块一起使用
- ios - 在显示 UIContextMenu 时从 UICollectionView 删除项目时出现奇怪的动画
- javascript - 带有 cookie 的 JS 预选下拉选项创建不可见的下拉选项
- r - 如何在 MLR 包中使用 Leave one out 调整分类阈值?
- excel - Excel VBA匹配不同工作簿上的标题名称并将列复制到主工作簿
- excel - 输出到 csv 时的 Powershell 奇怪行为