High FlxG.updateFramerate with low FlxG.drawFramerate doesn't seem to work
-
I'm working on a solitaire game for HTML5, where most of the time nothing changes on the screen. To save power on mobile (and fans spinning up on desktop/laptop), I though I'd reduce the framerate from 60 to 10 fps, setting it back to 60 when the player starts dragging a card. But in order to respond to input immediately, I still need
update()
to be called at 60 fps or thereabouts.So I did the obvious:
FlxG.updateFramerate = 60; FlxG.drawFramerate = 10; FlxG.fixedTimestep = false; // Edit: added
However, if I do this, my
update()
gets called only 10 times per second, withelapsed == 0.1
, and input is noticeably laggy. Once the frame has been processed anddrawFramerate
has been cranked back up, everything is fine again.Using neko for debugging, but observing the same on html5. Using HaxeFlixel 4.2.0, OpenFL 3.6.1.
Is it possible to have my cake and eat it too?
Edit: Looking at the code for FlxGame, it seems
step()
is called at most once per draw frame, iffixedTimestep == false
. On the other hand, iffixedTimestep == true
, I would expect to get multipleupdate()
calls in a burst right before for each draw frame, so that's not really helping either.
-
Remove this would help:
FlxG.fixedTimestep = false;
Maybe you need to speed up the game also:
FlxG.drawFramerate = 10; FlxG.timeScale = 6;
-
Thanks, but that's how I started (with
fixedTimestep == true
). I don't thinktimeScale
will do what I want either; you'd just get the update calls in 10 bursts of 6 calls each.
-
So what's you're trying to do again?
-
Get
update()
calls at a regular frequency of 60 Hz. Not merely 60 calls per second, but spread out evenly throughout that second.Here's another idea, which I'll try when I get time: subclass
FlxGame
to overridedraw()
with a method that callssuper.draw()
only 1 out of 6 times. I hope this won't confuse HaxeFlixel too much :)
-
So I've written a little test to understand your problem. When
FlxG.fixedTimestep == true
, it does lag when you move the test subject.Since I assume you only use HaxeFlixel for your game, I recommend modify FlxGame source code instead of creating a subclass
Some dirty and quick workaround:
ReplaceFlxG.fiixedTimestep
withfalse
in your FlxGame where you mentioned
Like this:if (false) { _accumulator += _elapsedMS; _accumulator = (_accumulator > _maxAccumulation) ? _maxAccumulation : _accumulator; while (_accumulator >= _stepMS) { step(); _accumulator -= _stepMS; } } else { step(); }
Or just replace all that with this but it will be a bit harder to reverse that
step()