DETERMINISM
Gladiabots%20-%20Implementing%20Determinism%20in%20Unity
Gladiabots%20-%20Implementing%20Determinism%20in%20Unity
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