Page 1 of 1

Jittery 2D Scrolling

Posted: Thu Oct 19, 2017 7:35 pm
by noegddgeon
Hello all,

I've noticed that simple 2D scrolling in my various projects seems to be a bit jittery on my Macbook Pro (which has decent specs; 2.8 GHz i7, 16 GB RAM, Intel Iris 1.5 GB). I'll link a couple of the files from GitHub here on a simple RPG engine I'm working on that are pertinent to the rendering:

https://github.com/coltonoscopy/jrpg-en ... e.lua#L316
https://github.com/coltonoscopy/jrpg-en ... p.lua#L116

I don't think the engine is doing anything too fancy that would cause it to be jittery? I'm using the Push library to help with virtual resolution handling and using math.floor to round down floating-point coordinates during the rendering phase where needed so as to avoid glitchy rendering since it's using a limited-resolution texture, which causes funkiness for non-integral positioning when drawing, but the jerkiness seems present if not worse even if that's not happening. The frame rate seems to be hovering around 60 FPS without any difficulty too, so I'm a bit stumped as to what might be going on :o. Any help is greatly appreciated! :)

Best,
Colton

Re: Jittery 2D Scrolling

Posted: Fri Oct 20, 2017 5:33 pm
by erasio
I've seen this a while ago already. Also when using floor.

My first guess would be that floor is messing with you.

Assuming you scroll 1.3 pixels per frame. Flooring will result in the location being:

0
1
2
3
5
6
7
9

Every now and then jumping two pixels instead of one. No guarantees. I don't have any visuals here to go by. So I can't tell for sure. But it might be part of the issue. Especially with minor framespikes.

You could try to use love.timer.getAverageDelta( ) instead. Which samples dt across a second and gives you the average. So your game time is slightly off real time. But time within a frame will be more consistent and you'll never completely drift away from the real time passed. It'll just be minorly distorted when frame spikes happen.

Also check out if you have vsync enabled. If not. Try that too!

Re: Jittery 2D Scrolling

Posted: Fri Oct 20, 2017 6:20 pm
by zorg
You do a wonderful job math.floor-ing the camera position with which you translate the coordinate system by... then fail to do so here:

Code: Select all

-- ExploreState.lua#L326
-- render the map around the player center
self.map:render(self.player.x, self.player.y)
Now if your rebuttal would be that you already floor those two when you calculate the logic, then you're doing it wrong; logic should be accurate, you only round rendered things.

Re: Jittery 2D Scrolling

Posted: Fri Oct 20, 2017 10:06 pm
by noegddgeon
Hi erasio,

Thanks so much for the reply! I implemented using an average delta time and turned on vsync per your suggestions, as well as fine-tuned the movement speed of the player, and that actually did help! However, I'm noticing that now the problem has gotten a little more refined: smooth scrolling works perfectly, but only when moving right and down; moving up and to the left is still a little bit jerky for some reason. Do you know why this might be? Currently movement is implemented using tweens between tile positions, so that the player is essentially locked to a grid in the style of classic Final Fantasy games, etc. Thanks for your time and help!

Best,
Colton

Re: Jittery 2D Scrolling

Posted: Fri Oct 20, 2017 10:21 pm
by noegddgeon
zorg wrote: Fri Oct 20, 2017 6:20 pm You do a wonderful job math.floor-ing the camera position with which you translate the coordinate system by... then fail to do so here:

Code: Select all

-- ExploreState.lua#L326
-- render the map around the player center
self.map:render(self.player.x, self.player.y)
Now if your rebuttal would be that you already floor those two when you calculate the logic, then you're doing it wrong; logic should be accurate, you only round rendered things.
Hi zorg,

Thanks for your reply! I'm not sure I follow; the Map is always rendered as a fixed grid in the world space, just with certain tiles conditionally rendered based on what we approximate the view window to be; the X and Y there are floats representing the character's tile position essentially (not actual X/Y coordinates). Trying your fix actually causes some of the lower tiles in the map to not render while moving because the math for calculating visible tiles no longer works right, while not fixing the jerkiness. But maybe I'm missing something, so if you wouldn't mind elaborating, I'm curious!

Best,
Colton