Delete FixedStepScheduler.lua
This commit is contained in:
		
							parent
							
								
									751eb9fa78
								
							
						
					
					
						commit
						fade349f21
					
				
					 1 changed files with 0 additions and 58 deletions
				
			
		| 
						 | 
					@ -1,58 +0,0 @@
 | 
				
			||||||
--!strict
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-- A simple fixed step system scheduler
 | 
					 | 
				
			||||||
-- Fixed updates can happen multiple times per frame
 | 
					 | 
				
			||||||
-- Variable updates will happen after all fixed updates complete
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local FIXED_DELTA = (1 / 60)
 | 
					 | 
				
			||||||
local MAXIMUM_DELTA = (1 / 5) 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export type System = {
 | 
					 | 
				
			||||||
    --> variable delta_time update, used for rendering
 | 
					 | 
				
			||||||
    --> blend used for interpolation of simulation state
 | 
					 | 
				
			||||||
    update: ((delta_time: number, blend: number) -> ())?,
 | 
					 | 
				
			||||||
    --> fixed delta_time update, used for simulation
 | 
					 | 
				
			||||||
    fixed_update: ((delta_time: number, frame: number) -> ())?,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
local function create(systems: {System}): (number) -> ()
 | 
					 | 
				
			||||||
    local frame = 0
 | 
					 | 
				
			||||||
    local accumulator = 0
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return function(delta_time: number)
 | 
					 | 
				
			||||||
        delta_time = math.min(delta_time, MAXIMUM_DELTA)
 | 
					 | 
				
			||||||
        accumulator += delta_time
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
        local steps = 0
 | 
					 | 
				
			||||||
        local previous_frame = frame
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
        if (accumulator > 0) then
 | 
					 | 
				
			||||||
            --> typically done with a while accumulator >= fixed_rate but this way is 35x faster
 | 
					 | 
				
			||||||
            steps = accumulator // FIXED_DELTA
 | 
					 | 
				
			||||||
            frame += steps
 | 
					 | 
				
			||||||
            accumulator -= (steps * FIXED_DELTA)
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for step = 1, steps do
 | 
					 | 
				
			||||||
            local step_frame = previous_frame + step
 | 
					 | 
				
			||||||
            for _, system in systems do
 | 
					 | 
				
			||||||
                if system.fixed_update == nil then
 | 
					 | 
				
			||||||
                    continue
 | 
					 | 
				
			||||||
                end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                system.fixed_update(FIXED_DELTA, step_frame)
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        local blend = accumulator / FIXED_DELTA
 | 
					 | 
				
			||||||
        for _, system in systems do
 | 
					 | 
				
			||||||
            if system.update == nil then
 | 
					 | 
				
			||||||
                continue
 | 
					 | 
				
			||||||
            end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            system.update(delta_time, blend)
 | 
					 | 
				
			||||||
        end
 | 
					 | 
				
			||||||
    end
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
return create
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in a new issue