Sign in to follow this  

[SOLVED] Choppyness even with interpolation

This topic is 2541 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

----------------------------------------------
Edit: Nevermind, solved it. In case anyone ever stumbles on the same problem: Apparently GetTickCount() is unreliable, it's best to use QueryPerformanceCounter() or QueryPerformanceFrequency() instead.
----------------------------------------------


Hello again everyone!

I'm here again with a (hopefully) small issue I'm having.

I'm having some choppyness in my game project, using C++ and SFML as library for graphics.
I wasn't sure where the choppyness came from, it could have been the forced vsync by calling UseVerticalSync( true );, or limiting the frames to 60 by calling SetFramerateLimit( 60 );.

I read a lot about game loops lately, about fixing your timestep and interpolation.
I have given it a try several times but kept getting stuck and it not working properly.

However today I thought I'd put together a very bare project displaying nothing but 1 scrolling sprite. Did that, and added a "Constant Game Speed independent of Variable FPS" game loop going at 60 frames per second.

I was surprised to find that, having the exact same choppyness my game project had. So here I am again, hoping that one of the pros/gurus could once again point out what I'm perhaps doing wrong.

This is the source of the small sample I put together that has the choppyness.


int main()
{
// Create main window
sf::RenderWindow App(sf::VideoMode( 800, 600 ), "Interpolation Test");

const int TICKS_PER_SECOND = 60;
const int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
const int MAX_FRAMESKIP = 5;
DWORD next_game_tick = GetTickCount();
int loops;
float interpolation;

// Create the Image/Sprite
sf::Sprite sprite;
sf::Image spriteImage;
spriteImage.LoadFromFile( "data/images/entity.png" );
sprite.SetImage( spriteImage );

// Set the sprite's variables
float spritevelx = 0;
float spritevely = 0;
float spriteposx = 0;
float spriteposy = 400;
float speed = 2;
spritevelx = speed;

// Start game loop
while (App.IsOpened())
{
// Get Input
const sf::Input& Input = App.GetInput();
left_pressed = Input.IsKeyDown(sf::Key::Left);
right_pressed = Input.IsKeyDown(sf::Key::Right);
up_pressed = Input.IsKeyDown(sf::Key::Up);
down_pressed = Input.IsKeyDown(sf::Key::Down);
z_pressed = Input.IsKeyDown(sf::Key::Z);
z_released = Input.IsKeyDown(sf::Key::Z);
x_pressed = Input.IsKeyDown(sf::Key::X);

// Process events
sf::Event Event;
while (App.GetEvent(Event))
{
// Close window : exit
if( Event.Type == sf::Event::Closed ){ App.Close(); }
}

// The Loop where we do the movement of the sprite (and or other logic/ai/movement/etc)
loops = 0;
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
{
// Determine whether to bounce back or not
if( ( spriteposx + spriteImage.GetWidth() ) >= 800 )
{
//spritevelx = -speed;
spriteposx = 0;
}
if( spriteposx <= 0 )
{
//spritevelx = speed;
}

// Move the sprite further and set it's position
spriteposx += spritevelx;
sprite.SetPosition( spriteposx, spriteposy );

next_game_tick += SKIP_TICKS;
loops++;
}

interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick ) / float( SKIP_TICKS );

// Draw the sprite (as often as we can, like the guide says?)
sprite.SetPosition( ( spriteposx + ( interpolation * speed ) ), spriteposy );
App.Draw( sprite );

// Show the buffer
App.Display();

// Clear screen
App.Clear();
}

return EXIT_SUCCESS;
}








The sprite I used is a simple blue square block included below;
image

Edit: Changed TICKS_PER_SECOND to 60, it was set to 200 when I was testing something quick, forgot to change it back before pasting it in here.

[Edited by - Auriya on December 31, 2010 12:55:07 AM]

Share this post


Link to post
Share on other sites

This topic is 2541 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this