26.10.2016 Views

DETERMINISM

Gladiabots%20-%20Implementing%20Determinism%20in%20Unity

Gladiabots%20-%20Implementing%20Determinism%20in%20Unity

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

IMPLEMENTING<br />

<strong>DETERMINISM</strong><br />

IN UNITY<br />

Sébastien Dubois (Gladiabots) – IGP#7 Montreuil 2016


GLADIABOTS<br />

<strong>DETERMINISM</strong><br />

CHALLENGES & SOLUTIONS<br />

IMPROVEMENTS


GLADIABOTS<br />

<strong>DETERMINISM</strong><br />

CHALLENGES & SOLUTIONS<br />

IMPROVEMENTS


GLADIABOTS<br />

https://www.youtube.com/watch?v=CJpvHoHwRhM


GLADIABOTS<br />

Solo Missions<br />

Asynchronous Multiplayer<br />

Cross-Platform<br />

Replayability


GLADIABOTS<br />

<strong>DETERMINISM</strong><br />

CHALLENGES & SOLUTIONS<br />

IMPROVEMENTS


<strong>DETERMINISM</strong> / DEFITION<br />

« A deterministic algorithm is an algorithm which,<br />

given a particular input,<br />

will always produce the same output. »<br />

- Wikipedia


<strong>DETERMINISM</strong> / STARCRAFT<br />

Input<br />

• Map<br />

• Players inputs<br />

Output<br />

• Match Result


<strong>DETERMINISM</strong> / NO MAN’S SKY<br />

Input<br />

• Player’s position<br />

Output<br />

• Generated world


<strong>DETERMINISM</strong> / GLADIABOTS<br />

Input<br />

• Map<br />

• Players AIs<br />

Output<br />

• Match result


GLADIABOTS<br />

<strong>DETERMINISM</strong><br />

CHALLENGES & SOLUTIONS<br />

IMPROVEMENTS


CHALLENGES / UNITY<br />

Undeterministic physics engine<br />

Unpredictable update frequency<br />

Heavily relying on floats<br />

+ Randomness


CHALLENGES / PHYSICS<br />

Looks 3D / 2D behind the scene<br />

→ Simple collisions (2D)<br />

→ Distance check (circle)


CHALLENGES / PHYSICS<br />

No use of gravity<br />

→ No need for rigidbody<br />

→ Repulsion on collision


CHALLENGES / PHYSICS<br />

Player’s click/touch on entities<br />

→ Viewer side = Unity colliders


CHALLENGES / UPDATES<br />

Unpredictable<br />

→ ≠ CPU / GPU<br />

Unstable<br />

→ ≠ game phases


CHALLENGES / UPDATES<br />

60 fps<br />

30 fps<br />

t


CHALLENGES / UPDATES<br />

Game = (short) turn based resolution<br />

~ MonoBehaviour.FixedUpdate()


CHALLENGES / UPDATES<br />

Game Turns<br />

(exactly 50/s)<br />

t<br />

Unity Updates<br />

(~60/s)


CHALLENGES / UPDATES<br />

Exact game resolution (Gladiabots)<br />

Regular updates<br />

Approximated rendering (Unity)<br />

Interpolated updates


CHALLENGES / UPDATES<br />

MonoBehaviour.Update:<br />

1. Lerp visual position → real position<br />

2. Compute visual position delta<br />

3. Apply move speed to animation


CHALLENGES / UPDATES


CHALLENGES / UPDATES<br />

https://dl.dropboxusercontent.com/u/24322340/Gladiabots/Screenshots/position_interpolation.gif


CHALLENGES / FLOATS<br />

Float = approximation<br />

≠ CPU architecture → ≠ method<br />

Non reliable for cross-platform


CHALLENGES / FLOATS<br />

Change type<br />

float → int<br />

½ second? 1,6 meter?


CHALLENGES / FLOATS<br />

Change scale<br />

x1000<br />

meter → millimeter (1m = 1000)<br />

second → millisecond (1s = 1000)


CHALLENGES / FLOATS<br />

distance = √(∆x² + ∆y² + ∆z²)<br />

∆x = 100 m (100 000)<br />

100 000² = 10 000 000 000<br />

int.MaxValue = 2 147 483 647


CHALLENGES / FLOATS<br />

Change type<br />

Int (32bits) → long (64bits)<br />

long.MaxValue = 9 223 372 036 854 775 807<br />

Max distance = 3 000 km


CHALLENGES / FLOATS<br />

Vector3 (floats) → Vector3L (long)<br />

1000L * (100L / 1000L) = 0L<br />

(1000L * 100L) / 1000L = 100L


CHALLENGES / RANDOMNESS<br />

« Determinist randomness ?! »<br />

Pseudo randomness = deterministic!


CHALLENGES / RANDOMNESS<br />

« Seed » = generator initializer<br />

One given seed → same sequence


CHALLENGES / RANDOMNESS<br />

Random.seed = 123;<br />

Debug.Log(Random.Range(0, 100)); // 8<br />

Debug.Log(Random.Range(0, 100)); // 10<br />

Debug.Log(Random.Range(0, 100)); // 85<br />

Random.seed = 123;<br />

Debug.Log(Random.Range(0, 100)); // 8<br />

Debug.Log(Random.Range(0, 100)); // 10<br />

Debug.Log(Random.Range(0, 100)); // 85


CHALLENGES / RANDOMNESS<br />

Interference between game<br />

resolution and viewer!<br />

#1 #3 #5<br />

#2 #4<br />

#1 #3 #4<br />

#2<br />

#5<br />

t<br />

t


CHALLENGES / RANDOMNESS<br />

// Resolution code<br />

System.Random randomizer = new System.Random(seed);<br />

return randomizer.Next(min, max);<br />

// Visual code<br />

return UnityEngine.Random.Range(min, max);


GLADIABOTS<br />

<strong>DETERMINISM</strong><br />

CHALLENGES & SOLUTIONS<br />

IMPROVEMENTS


IMPROVEMENTS<br />

Game changes → ≠ input → ≠ output<br />

Embark several versions ?<br />

Backward compatibility ?<br />

Record AI decisions ?


IMPROVEMENTS<br />

Rewind = restart + fast-forward<br />

Save checkpoints ?


THANK YOU!<br />

Free Alpha > PC, Mac, Linux + Android<br />

gladiabots.com<br />

@gladiabots / @gfx47<br />

gladiabots@gfx47.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!