corazza
corazza

Reputation: 32364

Calling update method vs having a setInterval

In my game engine, there are objects that need to be updated periodically. For example, a scene can be lowering its alpha, so I set an interval that does it. Also, the camera sometimes needs to jiggle a bit, which requires interpolation on the rotation property.

I see that there are two ways of dealing with these problems:

  1. Have an update() method that calls all other object's update methods. The objects track time since they were last updated and act accordingly.

  2. Do a setInterval for each object's update method.

What is the best solution, and why?

Upvotes: 5

Views: 215

Answers (4)

RobG
RobG

Reputation: 147413

The proposed algorithms proposed are not exclusive to the related method. That is, you can use setInteval to call all the update methods, or you can have each object update itself by repeatedly calling setTimeout.

More to the point is that a single timer is less overhead than multiple timers (of either type). This really matters when you have lots of timers. On the other hand, only one timer may not suit because some objects might need to be updated more frequently than others, or to a different schedule, so just try to minimise them.

An advantage with setTimeout is that the interval to the next call can be adjusted to meet specific scheduling requirements, e.g. if one is delayed you can skip the next one or make it sooner. setInterval will slowly drift relative to a consistent clock and one–of adjustments are more difficult.

On the other hand, setInteval only needs to be called once so you don't have to keep calling the timer. You may end up with a combination.

Upvotes: 0

Halcyon
Halcyon

Reputation: 57729

setInterval does not keep to a clock, it just sequences events as they come in. Browsers tend to keep at least some minor amount of time between events. So if you have 10 events that all need to fire after 100ms you'll likely see the last event fire well into the 200ms. (This is easy enough to test).

Having only one event (and calling update on all objects) is in this sense better than having each object set it's own interval. There may be other considerations though but for at least this reason option 2 is unfeasible.

Here is some more about setInterval How do browsers determine what time setInterval should use?

Upvotes: 4

Kristian
Kristian

Reputation: 21830

I recommend using the update() method over the setInterval.

Also, I would guess that the timing on the several setintervals running would be unreliable.

Another possibility, depending on what other things are happening in your game, using a bunch of separate intervals could introduce race conditions in the counting and comparing of scoring, etc

Upvotes: 0

Timmetje
Timmetje

Reputation: 7694

The best way I have found out to make a good update() function and keeping a good framerate and less load is as following.

Have a single update() method which draws your frame, by looping some sort of queue/schedule of all drawable object his own update() function which are added to this update event queue/ schedule. (eventlistener)

This way you don't have to loop all objects which are not scheduled for a redraw/update (like menu buttons or crosshairs). And you don't have an over abundance of intervals running for all drawable objects.

Upvotes: 1

Related Questions