fix skipped inputs on lag frames
This commit is contained in:
parent
912e114efe
commit
c40e1f929d
2 changed files with 16 additions and 10 deletions
1
_NOTICE
1
_NOTICE
|
@ -5,7 +5,6 @@ however, feel free to copy any snippets of code you find useful.
|
|||
TODOs: (that i can remember right now)
|
||||
- normalize and/or embed sprite type inputs
|
||||
- settle on a network architecture
|
||||
- fix lag-frames skipped-inputs bug
|
||||
- detect frames when Mario is in a controllable state
|
||||
- compute how many input neurons the network needs instead of hardcoding
|
||||
- rewrite positions to be relative to Mario
|
||||
|
|
25
main.lua
25
main.lua
|
@ -20,6 +20,7 @@ local mom2max -- running element-wise maximum of mom2.
|
|||
|
||||
local trial_frames = 0
|
||||
local total_frames = 0
|
||||
local lagless_count = 0
|
||||
|
||||
local force_start = false
|
||||
local force_start_old = false
|
||||
|
@ -563,6 +564,13 @@ local function prepare_reset()
|
|||
reset = true
|
||||
end
|
||||
|
||||
local function draw_framecount(x, y, frames)
|
||||
local tf0 = frames % 1000
|
||||
local tf1 = (frames % 1000000 - tf0) / 1000
|
||||
local tf2 = (frames - tf0 - tf1) / 1000000
|
||||
gui.text(x, y, ("%03i,%03i,%03i"):format(tf2,tf1,tf0), '#FFFFFF', '#0000003F')
|
||||
end
|
||||
|
||||
local function doit(dummy)
|
||||
local ingame_paused = game.get_state() == "paused"
|
||||
|
||||
|
@ -581,10 +589,7 @@ local function doit(dummy)
|
|||
end
|
||||
end
|
||||
|
||||
local tf0 = total_frames % 1000
|
||||
local tf1 = (total_frames % 1000000 - tf0) / 1000
|
||||
local tf2 = (total_frames - tf0 - tf1) / 1000000
|
||||
gui.text(12, 212, ("%03i,%03i,%03i"):format(tf2,tf1,tf0), '#FFFFFF', '#0000003F')
|
||||
draw_framecount(12, 215, total_frames)
|
||||
|
||||
screen_scroll_delta = screen_scroll_delta + game.R(0x775)
|
||||
|
||||
|
@ -723,7 +728,10 @@ while true do
|
|||
state_old = game.get_state()
|
||||
end
|
||||
|
||||
if reset then do_reset() end
|
||||
if reset then
|
||||
do_reset()
|
||||
lagless_count = 0
|
||||
end
|
||||
|
||||
if not cfg.enable_network then
|
||||
-- infinite time cheat. super handy for testing.
|
||||
|
@ -739,13 +747,12 @@ while true do
|
|||
game.W(0x75A, 1)
|
||||
end
|
||||
|
||||
-- FIXME: if the game lags then we might miss our frame to change inputs!
|
||||
-- don't rely on emu.framecount.
|
||||
local doot = jp == nil or emu.framecount() % cfg.frameskip == 0
|
||||
local doot = jp == nil or lagless_count % cfg.frameskip == 0
|
||||
doit(not doot)
|
||||
|
||||
-- jp might still be nil if we're not ingame or we're not playing.
|
||||
if jp ~= nil then joypad.write(1, jp) end
|
||||
|
||||
game.advance()
|
||||
game.advance() -- remember, this skips lag frames.
|
||||
lagless_count = lagless_count + 1
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue