我正在尝试使用SFML编程我的第一个游戏(以及我的第一个整体游戏),但我遇到了一个问题,我每秒钟都会出现口吃。在这样的口吃期间,Frametime比正常情况高3到4倍,这是非常明显的,因为我没有运行真正高的FPS(300+)。
没有问题(至少是atm)因为性能不是问题,但是:
当我这样做的时候,我的运动方法真的很吓人,并且移动的方式比它应该做的慢。
我的运动方法:
void Player::Update(float frametime){
mMovementSpeedTimefactor = frametime * 60 / 1000.0f;
setMovementVector(sf::Vector2f( mMovementVector.x * mMovementSpeedTimefactor, mMovementVector.y *mMovementSpeedTimefactor));
validateMovement();
//std::cout << mTestClock->restart().asMilliseconds() << std::endl;
moveObject();
this->updateAnimation();
}
frametime是以毫秒为单位的帧时间,i乘以60,因为我的movingpeed设置为像素/秒的值而不是每帧。
movespeed是5,因此角色应该每秒移动5 px,无论FPS(以及因此的帧时间)我都有。
但是:这给了我真正的跳跃运动,因为那些“stutterframes”导致跳跃,而在nto口吃框架上,palyer移动的速度比它应该慢得多。
我的主循环很简单,只是
while(mMainWindow->isOpen()){
HandleEvents();
Update();
Render();
}
虽然使用inbuild framelimiter(尝试编写我自己的,但我得到了相同的结果,只要我使用sf:sleep来调节FPS,因为没有cpu核心以100%负载运行)到300 FPS。
所以是的,我可以将标准速度设置为1而不是5,但是 setframeratelimit不是很准确,所以我得到了一些变速,我真的不喜欢。
任何人都有一个想法,我最能做什么?也许我没有看到所有树木的森林(我实际上不知道你是否用英语说:P)但是因为这是我的第一场比赛,我没有经验可以回顾。
答案 0 :(得分:2)
类似的问题:Movement Without Framerate Limit C++ SFML。
您真正需要的是固定时间步骤。 看一下SFML游戏开发书籍source code。以下是来自Application.cpp的有趣摘录:
const sf::Time Game::TimePerFrame = sf::seconds(1.f/60.f);
[...]
sf::Clock clock;
sf::Time timeSinceLastUpdate = sf::Time::Zero;
while (mWindow.isOpen())
{
sf::Time elapsedTime = clock.restart();
timeSinceLastUpdate += elapsedTime;
while (timeSinceLastUpdate > TimePerFrame)
{
timeSinceLastUpdate -= TimePerFrame;
processEvents();
update(TimePerFrame);
}
updateStatistics(elapsedTime);
render();
}
编辑:如果这不是您想要的,请参阅“Fix your timestep!”Laurent Gomila自己在SFML论坛中链接的内容。
答案 1 :(得分:1)
当frametime
非常高或非常低时,由于浮点精度问题,您的计算可能无法正常工作。我建议将标准速度设置为500
和mMovementSpeedTimeFactor
至frametime * 60 / 10.0f
并检查问题是否仍然存在。