SlideShare a Scribd company logo
1 of 107
Unity 2018
2018/6/22
Unity Technologies Japan
Developer Relation Engineer
, , ( )
HMD Hololens , Meta2 ,
Moverio BT-100/200/300 Oculus Rift , Fove , HMZ-T2 ...
HMD Moverio BT-300
Unity 2018
• Unity
4
• Native Container
• 5.6 2018.1β
• C# JobSystem
• 2018.1 β
• Entity Conponent System(ECS)
• 2018.1.0 Experimental( )
• Burst Compiler
• 2018.1.0 Experimental( )
(Galaxy S6 / Burst Compiler )
Galaxy S6 6000 60FPS
100 Instancing
( …
Native Container
Unity
• GC
• C#
• Thread C# MainThread
NativeContainer
• GC
• new
• C#
•
GC
C G C
C
#
ManagedMemory
UnityC#
C#
# #
#
NativeContainer
GC Memory
NativeContainer
• GC NativeArray
• Allocate Dispose(C++ new delete )
• JobSystem/ECS
• unsafe C#
NativeContainer
// Vector3 NativeArray
NativeArray<Vector3> array = new NativeArray<Vector3>(size, Allocator.Persistent);
//
for( int i = 0; i < array.Length; ++i ){
array[ i ] = array[i] + Vector3.one;
}
//
array.Dispose();
NativeContainer
int float
Vector3 struct
class
// Vector3 NativeArray
NativeArray<Vector3> array = new NativeArray<Vector3>(size, Allocator.Persistent);
//
for( int i = 0; i < array.Length; ++i ){
array[ i ] = array[i] + Vector3.one;
}
//
array.Dispose();
// Vector3 NativeArray
NativeArray<Vector3> array = new NativeArray<Vector3>(size, Allocator.Persistent);
//
for( int i = 0; i < array.Length; ++i ){
array[ i ] = array[i] + Vector3.one;
}
//
array.Dispose();
NativeContainer
Allocator.Temp ( )
Allocator.TempForJob( Job )
Allocator.Persistent( )
NativeContainer
• 2018.1.0
• NativeArray
• NativeSlice ( NativeArray )
•
• NativeList
• NativeHashMap
• NativeMultiHashMap
• NativeQueue
NativeContainer unsafe C#
NativeContainer
Memory Leak
MemoryLeak
• Dispose
• Editor
•
C# JobSystem
C# JobSystem
• Thread C# MainThread
• Unity WorkerThread
C#
Thread (1)
C#
MainThread
Thread (2)
Unity MainThread
Worker Thread Idle
C# JobSystem
WorkerThread
C# JobSystem
• WorkerThread C# C#
WorkerThread
• C# Job
WorkerThread
• MainThread
UnityAPI
C# JobSystem
Idle Worker Thread C#
C# JobSystem
• 1
•
•
•
•
→ C# Thread
C# JobSystem
• C# Heap
• NativeContainer struct
• Unity API
• Math JobSystem API
Job
• 3 Job Unity
• IJob
• IJobParalellFor
• Transform
IJobParallelForTransform
IJob(1)
// Job
struct MyJob : IJob{
// Job
public int param;
//
public void Execute( ){
int sum= 0;
for( int i = 0 ; i < param; ++ i){ sum+= i ; }
Debug.Log( “sum“ + sum);
}
}
// MonoBehaviour Update Job
// Job
var job = new MyJob(){
param = 100
};
// Job
JobHandle handle = job.Schedule();
// Job
handle.Complete();
Job struct
Job
int/float struct/
NativeArray UnityEngine.Object
Execute
IJob(1)
// Job
struct MyJob : IJob{
// Job
public int param;
//
public void Execute( ){
int sum= 0;
for( int i = 0 ; i < param; ++ i){ sum+= i ; }
Debug.Log( “sum“ + sum);
}
}
// MonoBehaviour Update Job
// Job
var job = new MyJob(){
param = 100
};
// Job
JobHandle handle = job.Schedule();
// Job
handle.Complete();
struct new Schedule()
Job
Schedule JobHandle
Job
IJob(2)
// Job
struct MyJob : IJob{
// Job
public int param;
//
public void Execute( ){
int sum= 0;
for( int i = 0 ; i < param; ++ i){ sum+= i ; }
Debug.Log( “sum“ + sum);
}
}
// MonoBehaviour Update Job
// Job
var job = new MyJob(){
param = 100
};
// Job
JobHandle handle = job.Schedule();
// Job
handle.Complete();
IJobParalellFor
NativeArray< Vector3 > position
[0]
( 0, 0, 10 )
[1]
( 0, 0, 20 )
[2]
( 0, 0, 30 )
[3]
( 0, 0, 40 )
[4]
( 0, 0, 50 )
( 0, 0, 11) ( 0, 0, 21 ) ( 0, 0, 31 ) ( 0, 0, 41 ) ( 0, 0, 51 )
( 0,0,1 )
IJobParallelFor (0,0,1)
...
...
MainThread
position [ 0 10 ]
Worker position [ 11 20 ]
Worker position [ 21 30 ]
Job
MainThread position [ 0 30 ]
// Job
struct MyPositionUpdate : IJobParallelFor{
// NativeArray
public NativeArray<Vector3> positions;
public float deltaTime;
// index index
public void Execute( int index ){
positions[ index ] = positions[ index ] + Vector3.front * deltaTime;
}
}
// MonoBehaviour Update Job
// Job
var job = new MyPositionUpdate(){
positions = bulletPositions, // <- NativeArray<Vector3> bulletPositions;
deltaTime = Time.deltaTime ,//<- Main Time.deltaTime …
};
// Job (0 )
JobHandle handle = job.Schedule( positions.Length ,0 );
// Job
handle.Complete();
IJobParalellFor
// Job
struct MyPositionUpdate : IJobParallelFor{
// NativeArray
public NativeArray<Vector3> positions;
public float deltaTime;
// index index
public void Execute( int index ){
positions[ index ] = positions[ index ] + Vector3.up * deltaTime;
}
}
Native
IJobParalellFor
// MonoBehaviour Update Job
// Job
var job = new MyPositionUpdate(){
positions = bulletPositions, // <- NativeArray<Vector3> bulletPositions;
deltaTime = Time.deltaTime ,//<- Main Time.deltaTime …
};
// Job (0 )
JobHandle handle = job.Schedule( positions.Length ,0 );
// Job
handle.Complete();
// Job
struct MyPositionUpdate : IJobParallelFor{
// NativeArray
public NativeArray<Vector3> positions;
public float deltaTime;
// index index
public void Execute( int index ){
positions[ index ] = positions[ index ] + Vector3.up * deltaTime;
}
}
IJobParalellFor
// MonoBehaviour Update Job
// Job
var job = new MyPositionUpdate(){
positions = bulletPositions, // <- NativeArray<Vector3> bulletPositions;
deltaTime = Time.deltaTime ,//<- Main Time.deltaTime …
};
// Job (0 )
JobHandle handle = job.Schedule( positions.Length ,0 );
// Job
handle.Complete();
index
Editor
Transform
IJobParallelForTransform
IJobParallelForTransform Cube
WorkerThread
( transform MainThread
IJobParallelForTransform
TransformAccess )
// Job
struct MyTransformUpdateJob : IJobParallelForTransform{
// Job
public int objNum;
public float time;
// index transform
public void Execute(int index, TransformAccess transform){
transform.position = new Vector3( index – objNum/ 2 , time , 0.0f);
}
}
// MonoBehaviour Update Job
Transform[] transformArray = "xxx";
// Transform
var transformAccessArray = new TransformAccessArray(transformArray);
// Job
var myTransformUpdateJob = new MyTransformUpdateJob(){
time = Time.deltaTime , objNum = transformArray.Length
};
// Job
JobHandle handle = myTransformUpdateJob.Schedule( transformAccessArray );
handle.Complete();
Transform
IJobParallelForTransform
// MonoBehaviour Update Job
Transform[] transformArray = "xxx";
// Transform
var transformAccessArray = new TransformAccessArray(transformArray);
// Job
var myTransformUpdateJob = new MyTransformUpdateJob(){
time = Time.deltaTime , objNum = transformArray.Length
};
// Job
JobHandle handle = myTransformUpdateJob.Schedule( transformAccessArray );
handle.Complete();
Transform
IJobParallelForTransform
TransformAccess position rotation
// Job
struct MyTransformUpdateJob : IJobParallelForTransform{
// Job
public int objNum;
public float time;
// index transform
public void Execute(int index, TransformAccess transform){
transform.position = new Vector3( index – objNum/ 2 , time , 0.0f);
}
}
Job API
• JobSystem API
• Raycast Job RayCastCommand
• NaviMesh Job NavMeshQuery
C JobSystem
https://github.com /w otakuro/U nityJobSystem Test
G PU / FPS 10
C PU
Android / iO S JobSystem C PU M ainThread
C PU
C# JobSystem
C# JobSystem
Q Job Priority( )
A Priority Job
Job B Job A Job B Job A
WorkerThread
WorkerThread
WorkerThread
– 1
WorkerThread
Job
Job
Job.Schedule InvalidOperationException
Job
UnityEditor
Job
Job
Worker
Job A
NativeArray< Vector3 > positions
[0]
( 0, 0, 10 )
[1]
( 0, 0, 20 )
[2]
( 0, 0, 30 )
[3]
( 0, 0, 40 )
[4]
( 0, 0, 50 )
...
...
positions
Worker
Job B
positions
Job
Worker
Job A
NativeArray< Vector3 > positions
[0]
( 0, 0, 10 )
[1]
( 0, 0, 20 )
[2]
( 0, 0, 30 )
[3]
( 0, 0, 40 )
[4]
( 0, 0, 50 )
...
...
positions
Worker
Job B
positions
Job ( NativeContainer )
Job
Editor
Job
Worker
Job A
NativeArray< Vector3 > positions
[0]
( 0, 0, 10 )
[1]
( 0, 0, 20 )
[2]
( 0, 0, 30 )
[3]
( 0, 0, 40 )
[4]
( 0, 0, 50 )
...
...
positions
Worker
Job B
positions
Job [ReadOnly]
positions
struct MyJob : IJob{
[ReadOnly]
public NativeArray<Vector3> positions;
}
[ReadOnly] [WriteOnly]
IJobParallelFor
Job.Schedule IndexOutOfRangeException
…
…
IJobParallelFor
// Job
struct MyPositionUpdate : IJobParallelFor{
// NativeArray
public NativeArray<Vector3> positions;
//
public NativeArray<Vector3> velocityByEnemyType;
//
public NativeArray<int> enemyType;
// deltaTIme
public float deltaTime;
// index index
public void Execute( int index ){
int enemyType = enemyType[index];
Vector3 velocity = velocityByEnemyType[ enemyType ];
positions[ index ] = positions[ index ] + Vector3.front * deltaTime;
}
}
IJobParallelFor
// Job
struct MyPositionUpdate : IJobParallelFor{
// NativeArray
public NativeArray<Vector3> positions;
//
public NativeArray<Vector3> velocityByEnemyType;
//
public NativeArray<int> enemyType;
// deltaTIme
public float deltaTime;
// index index
public void Execute( int index ){
int enemyType = enemyType[index];
Vector3 velocity = velocityByEnemyType[ enemyType ];
positions[ index ] = positions[ index ] + Vector3.front * deltaTime;
}
}
velocityByEnemyType[ enemyType ] index
Read Write
index UnityEditor
IJobParallelFor
// Job
struct MyPositionUpdate : IJobParallelFor{
// NativeArray
public NativeArray<Vector3> positions;
//
[ReadOnly]
public NativeArray<Vector3> velocityByEnemyType;
//
public NativeArray<int> enemyType;
// deltaTIme
public float deltaTime;
// index index
public void Execute( int index ){
int enemyType = enemyType[index];
Vector3 velocity = velocityByEnemyType[ enemyType ];
positions[ index ] = positions[ index ] + Vector3.front * deltaTime;
}
}
velocityByEnemyType [ReadOnly]
velocityByEnemyType
C# JobSystem
Update
class JobTest : MonoBehaviour{
private JobHandle handle;
public Transform[] transformArray;
void Update(){
// Job
jobHandle.Complete();
// Transform
var transformAccessArray = new TransformAccessArray(transformArray);
// Job
var myTransformUpdateJob = new MyTransformUpdateJob(){
time = Time.deltaTime , objNum = transformArray.Length
};
// Job Todo Queue
JobHandle handle = myTransformUpdateJob.Schedule( transformAccessArray );
// [ ] Job
JobHandle.ScheduleBatchedJobs();
}
}
Update
MainThread
Job
Worker Job
Job
Engine Job
Engine Job
Worker Job Engine Job
MainThread
Job
Worker Job Engine Job
Engine Job
Worker Job
Engine Job
Job
ECS
GameObject
• 1 GameObject
• GameObject
• Transform GameObject Transform
Transform
• Instance Object Pooling
MonoBehaviour
• Update/FixedUpdate
• Update 10000
https://blogs.unity3d.com/jp/2015/12/23/1k-update-calls/
• class GC
•
• Component
CPU
ECS
Data Oriented Design Programming
ECS
• GameObject MonoBehaviour
ECS
• Scene World
• GameObject Entity
• MonoBehaviour Component
ECS …
PackageManager Entities Project
• MonoBehaviour
• ( )
• ECS
• struct IComponentData
• class ComponentSystem
EntityManager
Entity
Entity
Player: IComponentData
int status; …
Transform2D:IComponentData
Vector2 position; …
Enemy : IComponentData
int status; …
Transform2D:IComponentData
Vector2 position; …
ECS
ComponentSystem
void OnUpdates(){
// implements
}
Entityj
InstanceID .
GameObject Transform
EntityManager
Entity
Entity
Player: IComponentData
int status; …
Transform2D:IComponentData
Vector2 position; …
Enemy : IComponentData
int status; ….
Transform2D:IComponentData
Vector2 position; …
ECS
EntityM anager Entity
Com ponentData .
ComponentSystem
void OnUpdates(){
// implements
}
EntityManager
Entity
Entity
Player: IComponentData
int status;
Transform2D:IComponentData
Vector2 position;
Enemy : IComponentData
int status;
Transform2D:IComponentData
Vector2 position;
ECS
“Com ponentData” Update
Com ponentSystem .
ComponentSystem
void OnUpdates(){
// implements
}
struct yours : IComponentData
// primitive struct
// class NG
Vector3 position;
Quaternion rotation;
“IComponentData” struct
Update
class yours : ComponentSystem
void O nUpdates(){
var group = this.G etCom ponentG roup(typeof(Enem y) );
foreach( var enem y in group){ … } // <-
}
Update ComponentSystem
“ComponentGroup” iterator
ECS
ECS
// Transform2D
public struct Transform2D : IComponentData{
public Vector2 position;
public Vector2 size;
public float rotation;
}
/* Transform2D
* Instance OnUpdate Unity
*/
public class TransformImpl:ComponentSystem{
//
protected override void OnUpdate() {
// Transform2D
var group = this.GetComponentGroup(typeof(Transform2D));
// Transform2D
var transforms = group..GetComponentDataArray<Transform2D>();
for( int i = 0 ; i < transforms.Length; ++i ){
transforms[ i ]
}
}
}
ECS
// Transform2D
public struct Transform2D : IComponentData{
public Vector2 position;
public Vector2 size;
public float rotation;
}
/* Enemy */
public class EnemyImpl:ComponentSystem{
//
protected override void OnUpdate() {
// Enemy Transform2D
var group = this.GetComponentGroup(typeof(Transform2D),typeof(Enemy) );
var transforms = group.GetComponentDataArray<Transform2D>();
var enemys = group.GetComponentDataArray<Enemy>();
for( int i = 0 ; i < transforms.Length; ++i ){
transforms[ i ] / enemys[i]
}
}
}
// Enemy
public struct Enemy : IComponentData{
public int status;
public int hp;
}
ECS ArcheType
ArchetypeManager
Archetype “Enemy” 80 bytes
Archetype ComponentData .
Archetype
* AddComponent/RemoveComponent
ArchetypeManager Archetype
“Transform2D”
“Renderer”
16 bytes
32 bytes
“Enemy” 32 bytes
Archetype “Player” 112 bytes
“Transform2D”
“Renderer”
16 bytes
32 bytes
“Player” 64 bytes
Archetype – ComponentData
// Transfrorm2D-Renderer-Player ArcheType
var arcPlayer = entityMgr.CreateArchetype(typeof(Transform2D), typeof(Renderer), typeof(Player) );
// Transform2D-Renderer-Enemy Archetype
var arcEnemy = entityMgr.CreateArchetype(typeof(Transform2D), typeof(Renderer), typeof(Enemy) );
// Entity
var playerEntity = entityManager.CreateEntity( arcPlayer );
// Entity
Var enemyEntity = entityManager.CreateEntity( arcEnemy );
Archetype
•
• AddComponent
•
• Archetype Chunk
• Archetype
ECS
Entitiy Archetype Chunk
Chunk “Enemy”
…
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Archetype “Player” 112 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Player” 64 bytes
Chunk “Player”
Transform2D(16 byte) Player A
Renderer(32 byte) Player A
Player(64 byte) Player A
Transform2D(16 byte) Enemy A Enemy B Enemy C
Renderer (32 byte) Enemy A Enemy B Enemy C
Enemy (32 byte) Enemy A Enemy B Enemy C
…
…
Entity “EnemyC”
Chunk
Chunk “Enemy”
…
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Transform2D(16 byte) Enemy A Enemy B Enemy C
Renderer (32 byte) Enemy A Enemy B Enemy C
Enemy (32 byte) Enemy A Enemy B Enemy C
…
…
Chunk “Enemy”
Transform2D(16 byte) Enemy AA
Renderer (32 byte) Enemy AA
Enemy (32 byte) Enemy AA
Chunk
Chunk
1
Enemy
1 : Enemy (1)
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Archetype “Player” 112 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Player” 64 bytes
Chunk “Enemy”
…
Chunk “Player”
Transform2D(16 byte) Player A
Renderer(32 byte) Player A
Player(64 byte) Player A
Transform2D(16 byte) Enemy A Enemy B Enemy C
Renderer (32 byte) Enemy A Enemy B Enemy C
Enemy (32 byte) Enemy A Enemy B Enemy C
…
…
Archetype Enem y Enem y
1 : Enemy (2)
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Archetype “Player” 112 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Player” 64 bytes
Chunk “Enemy”
…
Chunk “Player”
Transform2D(16 byte) Player A
Renderer(32 byte) Player A
Player(64 byte) Player A
Transform2D(16 byte) Enemy A Enemy B Enemy C
Renderer (32 byte) Enemy A Enemy B Enemy C
Enemy (32 byte) Enemy A Enemy B Enemy C
…
…
1 : Enemy (3)
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Archetype “Player” 112 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Player” 64 bytes
Chunk “Enemy”
…
Chunk “Player”
Transform2D(16 byte) Player A
Renderer(32 byte) Player A
Player(64 byte) Player A
Transform2D(16 byte) Enemy A Enemy B Enemy C
Renderer (32 byte) Enemy A Enemy B Enemy C
Enemy (32 byte) Enemy A Enemy B Enemy C
…
…
CPU
2 Renderer
2 Renderer (1)
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Archetype “Player” 112 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Player” 64 bytes
Chunk “Enemy”
…
Chunk “Player”
Transform2D(16 byte) Player A
Renderer(32 byte) Player A
Player(64 byte) Player A
Transform2D(16 byte) Enemy A Enemy B Enemy C
Renderer (32 byte) Enemy A Enemy B Enemy C
Enemy (32 byte) Enemy A Enemy B Enemy C
…
…
Player Enem y Renderer
2 Renderer (2)
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Archetype “Player” 112 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Player” 64 bytes
Chunk “Enemy”
…
Chunk “Player”
Transform2D(16 byte) Player A
Renderer(32 byte) Player A
Player(64 byte) Player A
Transform2D(16 byte) Enemy A Enemy B Enemy C
Renderer (32 byte) Enemy A Enemy B Enemy C
Enemy (32 byte) Enemy A Enemy B Enemy C
…
…
AddCompoenent / RemoveComponent
: EnemyA RemoveComponent<Enemy> (1)
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Archetype “” 48 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
Chunk “Enemy”
…Transform2D(16 byte) Enemy A Enemy B Enemy C
Renderer (32 byte) Enemy A Enemy B Enemy C
Enemy (32 byte) Enemy A Enemy B Enemy C
…
…
Chunk “”
Transform2D(16 byte)
Renderer (32 byte)
: EnemyA RemoveComponent<Enemy> (2)
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Archetype “” 48 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
Chunk “Enemy”
…Transform2D(16 byte) Enemy A Enemy B Enemy C
Renderer (32 byte) Enemy A Enemy B Enemy C
Enemy (32 byte) Enemy A Enemy B Enemy C
…
…
Chunk “”
Transform2D(16 byte)
Renderer (32 byte)
Enemy A
Enemy A
Enem y
Chunk
Archetype “Enemy” 80 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
“Enemy” 32 bytes
Archetype “” 48 bytes
“Transform2D” 16 bytes
“Renderer” 32 bytes
Chunk “Enemy”
…Transform2D(16 byte) Enemy Z Enemy B Enemy C
Renderer (32 byte) Enemy Z Enemy B Enemy C
Enemy (32 byte) Enemy Z Enemy B Enemy C
…
…
Chunk “”
Transform2D(16 byte)
Renderer (32 byte)
Enemy A
Enemy A
: EnemyA RemoveComponent<Enemy> (2)
Chunk
ECS C# JobSystem
• struct NativeArray
Update Job
MainThread
Enemy [ 0 10]
Worker Enemy [ 11 20]
Worker Enemy [ 21 30]
Job
Burst Compiler
Burst Compiler IL
Burst Compiler
[BurstCompile(Accuracy.Med, Support.Relaxed)]
struct SimpleTest : IJobParallelFor{
public Unity.Collections.NativeArray<Vector4> pos;
private Vector4 addVector;
public void Execute(int i)
{
Vector4 temp = pos[i];
temp = temp + addVector;
pos[i] = temp;
}
}
Attribute
Burst Compiler
[BurstCompile(Accuracy.Med, Support.Relaxed)]
struct SimpleTest : IJobParallelFor{
public Unity.Collections.NativeArray<Vector4> pos;
private Vector4 addVector;
public void Execute(int i)
{
Vector4 temp = pos[i];
temp = temp + addVector;
pos[i] = temp;
}
}
Vector4 + Vector4
Burst LLVMIR( )
% 0 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.a, i32 0, i32 0
% 1 = load fast float, float* % 0, align 1
% 2 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.b, i32 0, i32 0
% 3 = load fast float, float* % 2, align 1
% 4 = fadd fast float % 1, % 3
% 5 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.a, i32 0, i32 1
% 6 = load fast float, float* % 5, align 1
% 7 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.b, i32 0, i32 1
% 8 = load fast float, float* % 7, align 1
% 9 = fadd fast float % 6, % 8
% 10 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.a, i32 0, i32 2
% 11 = load fast float, float* % 10, align 1
% 12 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.b, i32 0, i32 2
% 13 = load fast float, float* % 12, align 1
% 14 = fadd fast float % 11, % 13
% 15 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.a, i32 0, i32 3
% 16 = load fast float, float* % 15, align 1
% 17 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.b, i32 0, i32 3
% 18 = load fast float, float* % 17, align 1
% 19 = fadd fast float % 16, % 18
x,y,z,w float
Burst LLVMIR( )
% 13 = load % UnityEngine.Vector4.318*, % UnityEngine.Vector4.318** % 4, align 1, !alias.scope !0
% 14 = load <4 x float>, <4 x float>* % 5, align 1, !alias.scope !0
% 15 = load i32, i32* % var.1., align 4
% 16 = sext i32 % var.2..03 to i64
% .elt.i = getelem entptr inbounds % UnityEngine.Vector4.318, % UnityEngine.Vector4.318* % 13, i64 % 16, i32 0
% 17 = bitcast float* % .elt.i to <4 x float>*
% 18 = load <4 x float>, <4 x float>* % 17, align 1, !noalias !0
% 19 = fadd fast <4 x float> % 14, % 18
% 20 = bitcast float* % .elt.i to <4 x float>*
Vector4 <4 x float>
Burst Compiler (
https://www.youtube.com/watch?v=BW9qSy6ZB0A&feature=youtu.be&t=8112
Unite Berlin
https://unity3d.com/performance-by-default
• Native Container
• GC
• C# JobSystem
• Unity
• Entity Conponent System(ECS)
• Memory
• Burst Compiler
•
…
URL: https://github.com/wotakuro/CustomScriptRenderPipelineTest
ScriptableRenderPipeline
ScriptableRenderPipeline
GTMF 2018
Appendix
C# JobSystem
https://github.com/wotakuro/JobSystemWorkshop
ECS
https://github.com/wotakuro/ECSManyChara

More Related Content

What's hot

Java final project of scientific calcultor
Java final project of scientific calcultorJava final project of scientific calcultor
Java final project of scientific calcultorMd. Eunus Ali Rupom
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScriptDonald Sipe
 
Stamps - a better way to object composition
Stamps - a better way to object compositionStamps - a better way to object composition
Stamps - a better way to object compositionVasyl Boroviak
 
Advanced javascript
Advanced javascriptAdvanced javascript
Advanced javascriptDoeun KOCH
 
Scientific calcultor-Java
Scientific calcultor-JavaScientific calcultor-Java
Scientific calcultor-JavaShaibal Ahmed
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developersStoyan Stefanov
 
미려한 UI/UX를 위한 여정
미려한 UI/UX를 위한 여정미려한 UI/UX를 위한 여정
미려한 UI/UX를 위한 여정SeungChul Kang
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaWiem Zine Elabidine
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScriptNascenia IT
 
Functional Core, Reactive Shell
Functional Core, Reactive ShellFunctional Core, Reactive Shell
Functional Core, Reactive ShellGiovanni Lodi
 
How to Create a l10n Payroll Structure
How to Create a l10n Payroll StructureHow to Create a l10n Payroll Structure
How to Create a l10n Payroll StructureOdoo
 
Programmation fonctionnelle en JavaScript
Programmation fonctionnelle en JavaScriptProgrammation fonctionnelle en JavaScript
Programmation fonctionnelle en JavaScriptLoïc Knuchel
 
Presentation of the new OpenERP API. Raphael Collet, OpenERP
Presentation of the new OpenERP API. Raphael Collet, OpenERPPresentation of the new OpenERP API. Raphael Collet, OpenERP
Presentation of the new OpenERP API. Raphael Collet, OpenERPOdoo
 
Stuff you didn't know about action script
Stuff you didn't know about action scriptStuff you didn't know about action script
Stuff you didn't know about action scriptChristophe Herreman
 

What's hot (20)

Java final project of scientific calcultor
Java final project of scientific calcultorJava final project of scientific calcultor
Java final project of scientific calcultor
 
Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScript
 
Stamps - a better way to object composition
Stamps - a better way to object compositionStamps - a better way to object composition
Stamps - a better way to object composition
 
Advanced javascript
Advanced javascriptAdvanced javascript
Advanced javascript
 
Scientific calcultor-Java
Scientific calcultor-JavaScientific calcultor-Java
Scientific calcultor-Java
 
Intro to JavaScript
Intro to JavaScriptIntro to JavaScript
Intro to JavaScript
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
 
Core concepts-javascript
Core concepts-javascriptCore concepts-javascript
Core concepts-javascript
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
 
Cpp tutorial
Cpp tutorialCpp tutorial
Cpp tutorial
 
Javascript tid-bits
Javascript tid-bitsJavascript tid-bits
Javascript tid-bits
 
미려한 UI/UX를 위한 여정
미려한 UI/UX를 위한 여정미려한 UI/UX를 위한 여정
미려한 UI/UX를 위한 여정
 
ZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in ScalaZIO: Powerful and Principled Functional Programming in Scala
ZIO: Powerful and Principled Functional Programming in Scala
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
 
Functional Core, Reactive Shell
Functional Core, Reactive ShellFunctional Core, Reactive Shell
Functional Core, Reactive Shell
 
JavaScript Core
JavaScript CoreJavaScript Core
JavaScript Core
 
How to Create a l10n Payroll Structure
How to Create a l10n Payroll StructureHow to Create a l10n Payroll Structure
How to Create a l10n Payroll Structure
 
Programmation fonctionnelle en JavaScript
Programmation fonctionnelle en JavaScriptProgrammation fonctionnelle en JavaScript
Programmation fonctionnelle en JavaScript
 
Presentation of the new OpenERP API. Raphael Collet, OpenERP
Presentation of the new OpenERP API. Raphael Collet, OpenERPPresentation of the new OpenERP API. Raphael Collet, OpenERP
Presentation of the new OpenERP API. Raphael Collet, OpenERP
 
Stuff you didn't know about action script
Stuff you didn't know about action scriptStuff you didn't know about action script
Stuff you didn't know about action script
 

Similar to Unity 2018からのハイパフォーマンスな機能紹介

Developing iOS REST Applications
Developing iOS REST ApplicationsDeveloping iOS REST Applications
Developing iOS REST Applicationslmrei
 
Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript EverywherePascal Rettig
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on AndroidSven Haiges
 
COScheduler In Depth
COScheduler In DepthCOScheduler In Depth
COScheduler In DepthWO Community
 
Front End Development: The Important Parts
Front End Development: The Important PartsFront End Development: The Important Parts
Front End Development: The Important PartsSergey Bolshchikov
 
Uncommon Design Patterns
Uncommon Design PatternsUncommon Design Patterns
Uncommon Design PatternsStefano Fago
 
friends functionToshu
friends functionToshufriends functionToshu
friends functionToshuSidd Singh
 
Integrating Angular js & three.js
Integrating Angular js & three.jsIntegrating Angular js & three.js
Integrating Angular js & three.jsJosh Staples
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksMongoDB
 
Node Architecture and Getting Started with Express
Node Architecture and Getting Started with ExpressNode Architecture and Getting Started with Express
Node Architecture and Getting Started with Expressjguerrero999
 

Similar to Unity 2018からのハイパフォーマンスな機能紹介 (20)

COScheduler
COSchedulerCOScheduler
COScheduler
 
Developing iOS REST Applications
Developing iOS REST ApplicationsDeveloping iOS REST Applications
Developing iOS REST Applications
 
C++ Programming
C++ ProgrammingC++ Programming
C++ Programming
 
C++ Programming
C++ ProgrammingC++ Programming
C++ Programming
 
Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance Tuning
 
Javascript Everywhere
Javascript EverywhereJavascript Everywhere
Javascript Everywhere
 
CouchDB on Android
CouchDB on AndroidCouchDB on Android
CouchDB on Android
 
COScheduler In Depth
COScheduler In DepthCOScheduler In Depth
COScheduler In Depth
 
Front End Development: The Important Parts
Front End Development: The Important PartsFront End Development: The Important Parts
Front End Development: The Important Parts
 
Uncommon Design Patterns
Uncommon Design PatternsUncommon Design Patterns
Uncommon Design Patterns
 
friends functionToshu
friends functionToshufriends functionToshu
friends functionToshu
 
C++ Functions
C++ FunctionsC++ Functions
C++ Functions
 
Oojs 1.1
Oojs 1.1Oojs 1.1
Oojs 1.1
 
Integrating Angular js & three.js
Integrating Angular js & three.jsIntegrating Angular js & three.js
Integrating Angular js & three.js
 
JavaScript ES6
JavaScript ES6JavaScript ES6
JavaScript ES6
 
C# 6.0 Preview
C# 6.0 PreviewC# 6.0 Preview
C# 6.0 Preview
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
 
Node Architecture and Getting Started with Express
Node Architecture and Getting Started with ExpressNode Architecture and Getting Started with Express
Node Architecture and Getting Started with Express
 
mobl
moblmobl
mobl
 
Mercado iOS & Swift vs Objective-C
Mercado iOS & Swift vs Objective-CMercado iOS & Swift vs Objective-C
Mercado iOS & Swift vs Objective-C
 

Recently uploaded

Hostel management system project report..pdf
Hostel management system project report..pdfHostel management system project report..pdf
Hostel management system project report..pdfKamal Acharya
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756dollysharma2066
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayEpec Engineered Technologies
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.Kamal Acharya
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfRagavanV2
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performancesivaprakash250
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Bookingdharasingh5698
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXssuser89054b
 
A Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna MunicipalityA Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna MunicipalityMorshed Ahmed Rahath
 
data_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdfdata_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdfJiananWang21
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Standamitlee9823
 
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...soginsider
 
2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projectssmsksolar
 
Work-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptxWork-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptxJuliansyahHarahap1
 

Recently uploaded (20)

Hostel management system project report..pdf
Hostel management system project report..pdfHostel management system project report..pdf
Hostel management system project report..pdf
 
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar  ≼🔝 Delhi door step de...
Call Now ≽ 9953056974 ≼🔝 Call Girls In New Ashok Nagar ≼🔝 Delhi door step de...
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
Standard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power PlayStandard vs Custom Battery Packs - Decoding the Power Play
Standard vs Custom Battery Packs - Decoding the Power Play
 
Employee leave management system project.
Employee leave management system project.Employee leave management system project.
Employee leave management system project.
 
Unit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdfUnit 1 - Soil Classification and Compaction.pdf
Unit 1 - Soil Classification and Compaction.pdf
 
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak HamilCara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
Cara Menggugurkan Sperma Yang Masuk Rahim Biyar Tidak Hamil
 
UNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its PerformanceUNIT - IV - Air Compressors and its Performance
UNIT - IV - Air Compressors and its Performance
 
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
(INDIRA) Call Girl Meerut Call Now 8617697112 Meerut Escorts 24x7
 
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 BookingVIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
VIP Call Girls Ankleshwar 7001035870 Whatsapp Number, 24/07 Booking
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
(INDIRA) Call Girl Bhosari Call Now 8617697112 Bhosari Escorts 24x7
 
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced LoadsFEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
FEA Based Level 3 Assessment of Deformed Tanks with Fluid Induced Loads
 
A Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna MunicipalityA Study of Urban Area Plan for Pabna Municipality
A Study of Urban Area Plan for Pabna Municipality
 
data_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdfdata_management_and _data_science_cheat_sheet.pdf
data_management_and _data_science_cheat_sheet.pdf
 
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night StandCall Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
Call Girls In Bangalore ☎ 7737669865 🥵 Book Your One night Stand
 
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
Hazard Identification (HAZID) vs. Hazard and Operability (HAZOP): A Comparati...
 
2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects2016EF22_0 solar project report rooftop projects
2016EF22_0 solar project report rooftop projects
 
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
(INDIRA) Call Girl Aurangabad Call Now 8617697112 Aurangabad Escorts 24x7
 
Work-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptxWork-Permit-Receiver-in-Saudi-Aramco.pptx
Work-Permit-Receiver-in-Saudi-Aramco.pptx
 

Unity 2018からのハイパフォーマンスな機能紹介

  • 1. Unity 2018 2018/6/22 Unity Technologies Japan Developer Relation Engineer
  • 2. , , ( ) HMD Hololens , Meta2 , Moverio BT-100/200/300 Oculus Rift , Fove , HMZ-T2 ... HMD Moverio BT-300
  • 3. Unity 2018 • Unity 4 • Native Container • 5.6 2018.1β • C# JobSystem • 2018.1 β • Entity Conponent System(ECS) • 2018.1.0 Experimental( ) • Burst Compiler • 2018.1.0 Experimental( )
  • 4. (Galaxy S6 / Burst Compiler ) Galaxy S6 6000 60FPS 100 Instancing ( …
  • 6. Unity • GC • C# • Thread C# MainThread
  • 11. NativeContainer • GC NativeArray • Allocate Dispose(C++ new delete ) • JobSystem/ECS • unsafe C#
  • 12. NativeContainer // Vector3 NativeArray NativeArray<Vector3> array = new NativeArray<Vector3>(size, Allocator.Persistent); // for( int i = 0; i < array.Length; ++i ){ array[ i ] = array[i] + Vector3.one; } // array.Dispose();
  • 13. NativeContainer int float Vector3 struct class // Vector3 NativeArray NativeArray<Vector3> array = new NativeArray<Vector3>(size, Allocator.Persistent); // for( int i = 0; i < array.Length; ++i ){ array[ i ] = array[i] + Vector3.one; } // array.Dispose();
  • 14. // Vector3 NativeArray NativeArray<Vector3> array = new NativeArray<Vector3>(size, Allocator.Persistent); // for( int i = 0; i < array.Length; ++i ){ array[ i ] = array[i] + Vector3.one; } // array.Dispose(); NativeContainer Allocator.Temp ( ) Allocator.TempForJob( Job ) Allocator.Persistent( )
  • 15. NativeContainer • 2018.1.0 • NativeArray • NativeSlice ( NativeArray ) • • NativeList • NativeHashMap • NativeMultiHashMap • NativeQueue NativeContainer unsafe C#
  • 19. C# JobSystem • Thread C# MainThread • Unity WorkerThread C#
  • 23. C# JobSystem • WorkerThread C# C# WorkerThread • C# Job WorkerThread • MainThread UnityAPI
  • 26. C# JobSystem • C# Heap • NativeContainer struct • Unity API • Math JobSystem API
  • 27. Job • 3 Job Unity • IJob • IJobParalellFor • Transform IJobParallelForTransform
  • 28. IJob(1) // Job struct MyJob : IJob{ // Job public int param; // public void Execute( ){ int sum= 0; for( int i = 0 ; i < param; ++ i){ sum+= i ; } Debug.Log( “sum“ + sum); } } // MonoBehaviour Update Job // Job var job = new MyJob(){ param = 100 }; // Job JobHandle handle = job.Schedule(); // Job handle.Complete();
  • 29. Job struct Job int/float struct/ NativeArray UnityEngine.Object Execute IJob(1) // Job struct MyJob : IJob{ // Job public int param; // public void Execute( ){ int sum= 0; for( int i = 0 ; i < param; ++ i){ sum+= i ; } Debug.Log( “sum“ + sum); } } // MonoBehaviour Update Job // Job var job = new MyJob(){ param = 100 }; // Job JobHandle handle = job.Schedule(); // Job handle.Complete();
  • 30. struct new Schedule() Job Schedule JobHandle Job IJob(2) // Job struct MyJob : IJob{ // Job public int param; // public void Execute( ){ int sum= 0; for( int i = 0 ; i < param; ++ i){ sum+= i ; } Debug.Log( “sum“ + sum); } } // MonoBehaviour Update Job // Job var job = new MyJob(){ param = 100 }; // Job JobHandle handle = job.Schedule(); // Job handle.Complete();
  • 31. IJobParalellFor NativeArray< Vector3 > position [0] ( 0, 0, 10 ) [1] ( 0, 0, 20 ) [2] ( 0, 0, 30 ) [3] ( 0, 0, 40 ) [4] ( 0, 0, 50 ) ( 0, 0, 11) ( 0, 0, 21 ) ( 0, 0, 31 ) ( 0, 0, 41 ) ( 0, 0, 51 ) ( 0,0,1 ) IJobParallelFor (0,0,1) ... ...
  • 32. MainThread position [ 0 10 ] Worker position [ 11 20 ] Worker position [ 21 30 ] Job MainThread position [ 0 30 ]
  • 33. // Job struct MyPositionUpdate : IJobParallelFor{ // NativeArray public NativeArray<Vector3> positions; public float deltaTime; // index index public void Execute( int index ){ positions[ index ] = positions[ index ] + Vector3.front * deltaTime; } } // MonoBehaviour Update Job // Job var job = new MyPositionUpdate(){ positions = bulletPositions, // <- NativeArray<Vector3> bulletPositions; deltaTime = Time.deltaTime ,//<- Main Time.deltaTime … }; // Job (0 ) JobHandle handle = job.Schedule( positions.Length ,0 ); // Job handle.Complete(); IJobParalellFor
  • 34. // Job struct MyPositionUpdate : IJobParallelFor{ // NativeArray public NativeArray<Vector3> positions; public float deltaTime; // index index public void Execute( int index ){ positions[ index ] = positions[ index ] + Vector3.up * deltaTime; } } Native IJobParalellFor // MonoBehaviour Update Job // Job var job = new MyPositionUpdate(){ positions = bulletPositions, // <- NativeArray<Vector3> bulletPositions; deltaTime = Time.deltaTime ,//<- Main Time.deltaTime … }; // Job (0 ) JobHandle handle = job.Schedule( positions.Length ,0 ); // Job handle.Complete();
  • 35. // Job struct MyPositionUpdate : IJobParallelFor{ // NativeArray public NativeArray<Vector3> positions; public float deltaTime; // index index public void Execute( int index ){ positions[ index ] = positions[ index ] + Vector3.up * deltaTime; } } IJobParalellFor // MonoBehaviour Update Job // Job var job = new MyPositionUpdate(){ positions = bulletPositions, // <- NativeArray<Vector3> bulletPositions; deltaTime = Time.deltaTime ,//<- Main Time.deltaTime … }; // Job (0 ) JobHandle handle = job.Schedule( positions.Length ,0 ); // Job handle.Complete(); index Editor
  • 37. // Job struct MyTransformUpdateJob : IJobParallelForTransform{ // Job public int objNum; public float time; // index transform public void Execute(int index, TransformAccess transform){ transform.position = new Vector3( index – objNum/ 2 , time , 0.0f); } } // MonoBehaviour Update Job Transform[] transformArray = "xxx"; // Transform var transformAccessArray = new TransformAccessArray(transformArray); // Job var myTransformUpdateJob = new MyTransformUpdateJob(){ time = Time.deltaTime , objNum = transformArray.Length }; // Job JobHandle handle = myTransformUpdateJob.Schedule( transformAccessArray ); handle.Complete(); Transform IJobParallelForTransform
  • 38. // MonoBehaviour Update Job Transform[] transformArray = "xxx"; // Transform var transformAccessArray = new TransformAccessArray(transformArray); // Job var myTransformUpdateJob = new MyTransformUpdateJob(){ time = Time.deltaTime , objNum = transformArray.Length }; // Job JobHandle handle = myTransformUpdateJob.Schedule( transformAccessArray ); handle.Complete(); Transform IJobParallelForTransform TransformAccess position rotation // Job struct MyTransformUpdateJob : IJobParallelForTransform{ // Job public int objNum; public float time; // index transform public void Execute(int index, TransformAccess transform){ transform.position = new Vector3( index – objNum/ 2 , time , 0.0f); } }
  • 39. Job API • JobSystem API • Raycast Job RayCastCommand • NaviMesh Job NavMeshQuery
  • 41. https://github.com /w otakuro/U nityJobSystem Test G PU / FPS 10 C PU Android / iO S JobSystem C PU M ainThread C PU
  • 43. C# JobSystem Q Job Priority( ) A Priority Job Job B Job A Job B Job A
  • 46. Job
  • 48. Job Worker Job A NativeArray< Vector3 > positions [0] ( 0, 0, 10 ) [1] ( 0, 0, 20 ) [2] ( 0, 0, 30 ) [3] ( 0, 0, 40 ) [4] ( 0, 0, 50 ) ... ... positions Worker Job B positions
  • 49. Job Worker Job A NativeArray< Vector3 > positions [0] ( 0, 0, 10 ) [1] ( 0, 0, 20 ) [2] ( 0, 0, 30 ) [3] ( 0, 0, 40 ) [4] ( 0, 0, 50 ) ... ... positions Worker Job B positions Job ( NativeContainer ) Job Editor
  • 50. Job Worker Job A NativeArray< Vector3 > positions [0] ( 0, 0, 10 ) [1] ( 0, 0, 20 ) [2] ( 0, 0, 30 ) [3] ( 0, 0, 40 ) [4] ( 0, 0, 50 ) ... ... positions Worker Job B positions Job [ReadOnly] positions struct MyJob : IJob{ [ReadOnly] public NativeArray<Vector3> positions; } [ReadOnly] [WriteOnly]
  • 52. IJobParallelFor // Job struct MyPositionUpdate : IJobParallelFor{ // NativeArray public NativeArray<Vector3> positions; // public NativeArray<Vector3> velocityByEnemyType; // public NativeArray<int> enemyType; // deltaTIme public float deltaTime; // index index public void Execute( int index ){ int enemyType = enemyType[index]; Vector3 velocity = velocityByEnemyType[ enemyType ]; positions[ index ] = positions[ index ] + Vector3.front * deltaTime; } }
  • 53. IJobParallelFor // Job struct MyPositionUpdate : IJobParallelFor{ // NativeArray public NativeArray<Vector3> positions; // public NativeArray<Vector3> velocityByEnemyType; // public NativeArray<int> enemyType; // deltaTIme public float deltaTime; // index index public void Execute( int index ){ int enemyType = enemyType[index]; Vector3 velocity = velocityByEnemyType[ enemyType ]; positions[ index ] = positions[ index ] + Vector3.front * deltaTime; } } velocityByEnemyType[ enemyType ] index Read Write index UnityEditor
  • 54. IJobParallelFor // Job struct MyPositionUpdate : IJobParallelFor{ // NativeArray public NativeArray<Vector3> positions; // [ReadOnly] public NativeArray<Vector3> velocityByEnemyType; // public NativeArray<int> enemyType; // deltaTIme public float deltaTime; // index index public void Execute( int index ){ int enemyType = enemyType[index]; Vector3 velocity = velocityByEnemyType[ enemyType ]; positions[ index ] = positions[ index ] + Vector3.front * deltaTime; } } velocityByEnemyType [ReadOnly] velocityByEnemyType
  • 56. Update class JobTest : MonoBehaviour{ private JobHandle handle; public Transform[] transformArray; void Update(){ // Job jobHandle.Complete(); // Transform var transformAccessArray = new TransformAccessArray(transformArray); // Job var myTransformUpdateJob = new MyTransformUpdateJob(){ time = Time.deltaTime , objNum = transformArray.Length }; // Job Todo Queue JobHandle handle = myTransformUpdateJob.Schedule( transformAccessArray ); // [ ] Job JobHandle.ScheduleBatchedJobs(); } }
  • 57. Update MainThread Job Worker Job Job Engine Job Engine Job Worker Job Engine Job MainThread Job Worker Job Engine Job Engine Job Worker Job Engine Job Job
  • 58. ECS
  • 59. GameObject • 1 GameObject • GameObject • Transform GameObject Transform Transform • Instance Object Pooling
  • 60. MonoBehaviour • Update/FixedUpdate • Update 10000 https://blogs.unity3d.com/jp/2015/12/23/1k-update-calls/ • class GC • • Component CPU
  • 62. ECS • GameObject MonoBehaviour ECS • Scene World • GameObject Entity • MonoBehaviour Component
  • 64. • MonoBehaviour • ( ) • ECS • struct IComponentData • class ComponentSystem
  • 65.
  • 66. EntityManager Entity Entity Player: IComponentData int status; … Transform2D:IComponentData Vector2 position; … Enemy : IComponentData int status; … Transform2D:IComponentData Vector2 position; … ECS ComponentSystem void OnUpdates(){ // implements } Entityj InstanceID . GameObject Transform
  • 67. EntityManager Entity Entity Player: IComponentData int status; … Transform2D:IComponentData Vector2 position; … Enemy : IComponentData int status; …. Transform2D:IComponentData Vector2 position; … ECS EntityM anager Entity Com ponentData . ComponentSystem void OnUpdates(){ // implements }
  • 68. EntityManager Entity Entity Player: IComponentData int status; Transform2D:IComponentData Vector2 position; Enemy : IComponentData int status; Transform2D:IComponentData Vector2 position; ECS “Com ponentData” Update Com ponentSystem . ComponentSystem void OnUpdates(){ // implements }
  • 69. struct yours : IComponentData // primitive struct // class NG Vector3 position; Quaternion rotation; “IComponentData” struct Update class yours : ComponentSystem void O nUpdates(){ var group = this.G etCom ponentG roup(typeof(Enem y) ); foreach( var enem y in group){ … } // <- } Update ComponentSystem “ComponentGroup” iterator ECS
  • 70. ECS // Transform2D public struct Transform2D : IComponentData{ public Vector2 position; public Vector2 size; public float rotation; } /* Transform2D * Instance OnUpdate Unity */ public class TransformImpl:ComponentSystem{ // protected override void OnUpdate() { // Transform2D var group = this.GetComponentGroup(typeof(Transform2D)); // Transform2D var transforms = group..GetComponentDataArray<Transform2D>(); for( int i = 0 ; i < transforms.Length; ++i ){ transforms[ i ] } } }
  • 71. ECS // Transform2D public struct Transform2D : IComponentData{ public Vector2 position; public Vector2 size; public float rotation; } /* Enemy */ public class EnemyImpl:ComponentSystem{ // protected override void OnUpdate() { // Enemy Transform2D var group = this.GetComponentGroup(typeof(Transform2D),typeof(Enemy) ); var transforms = group.GetComponentDataArray<Transform2D>(); var enemys = group.GetComponentDataArray<Enemy>(); for( int i = 0 ; i < transforms.Length; ++i ){ transforms[ i ] / enemys[i] } } } // Enemy public struct Enemy : IComponentData{ public int status; public int hp; }
  • 72.
  • 74. ArchetypeManager Archetype “Enemy” 80 bytes Archetype ComponentData . Archetype * AddComponent/RemoveComponent ArchetypeManager Archetype “Transform2D” “Renderer” 16 bytes 32 bytes “Enemy” 32 bytes Archetype “Player” 112 bytes “Transform2D” “Renderer” 16 bytes 32 bytes “Player” 64 bytes Archetype – ComponentData
  • 75. // Transfrorm2D-Renderer-Player ArcheType var arcPlayer = entityMgr.CreateArchetype(typeof(Transform2D), typeof(Renderer), typeof(Player) ); // Transform2D-Renderer-Enemy Archetype var arcEnemy = entityMgr.CreateArchetype(typeof(Transform2D), typeof(Renderer), typeof(Enemy) ); // Entity var playerEntity = entityManager.CreateEntity( arcPlayer ); // Entity Var enemyEntity = entityManager.CreateEntity( arcEnemy );
  • 77. ECS
  • 78. Entitiy Archetype Chunk Chunk “Enemy” … Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Archetype “Player” 112 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Player” 64 bytes Chunk “Player” Transform2D(16 byte) Player A Renderer(32 byte) Player A Player(64 byte) Player A Transform2D(16 byte) Enemy A Enemy B Enemy C Renderer (32 byte) Enemy A Enemy B Enemy C Enemy (32 byte) Enemy A Enemy B Enemy C … … Entity “EnemyC”
  • 79. Chunk Chunk “Enemy” … Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Transform2D(16 byte) Enemy A Enemy B Enemy C Renderer (32 byte) Enemy A Enemy B Enemy C Enemy (32 byte) Enemy A Enemy B Enemy C … … Chunk “Enemy” Transform2D(16 byte) Enemy AA Renderer (32 byte) Enemy AA Enemy (32 byte) Enemy AA Chunk Chunk
  • 81. 1 : Enemy (1) Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Archetype “Player” 112 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Player” 64 bytes Chunk “Enemy” … Chunk “Player” Transform2D(16 byte) Player A Renderer(32 byte) Player A Player(64 byte) Player A Transform2D(16 byte) Enemy A Enemy B Enemy C Renderer (32 byte) Enemy A Enemy B Enemy C Enemy (32 byte) Enemy A Enemy B Enemy C … … Archetype Enem y Enem y
  • 82. 1 : Enemy (2) Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Archetype “Player” 112 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Player” 64 bytes Chunk “Enemy” … Chunk “Player” Transform2D(16 byte) Player A Renderer(32 byte) Player A Player(64 byte) Player A Transform2D(16 byte) Enemy A Enemy B Enemy C Renderer (32 byte) Enemy A Enemy B Enemy C Enemy (32 byte) Enemy A Enemy B Enemy C … …
  • 83. 1 : Enemy (3) Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Archetype “Player” 112 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Player” 64 bytes Chunk “Enemy” … Chunk “Player” Transform2D(16 byte) Player A Renderer(32 byte) Player A Player(64 byte) Player A Transform2D(16 byte) Enemy A Enemy B Enemy C Renderer (32 byte) Enemy A Enemy B Enemy C Enemy (32 byte) Enemy A Enemy B Enemy C … … CPU
  • 85. 2 Renderer (1) Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Archetype “Player” 112 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Player” 64 bytes Chunk “Enemy” … Chunk “Player” Transform2D(16 byte) Player A Renderer(32 byte) Player A Player(64 byte) Player A Transform2D(16 byte) Enemy A Enemy B Enemy C Renderer (32 byte) Enemy A Enemy B Enemy C Enemy (32 byte) Enemy A Enemy B Enemy C … … Player Enem y Renderer
  • 86. 2 Renderer (2) Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Archetype “Player” 112 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Player” 64 bytes Chunk “Enemy” … Chunk “Player” Transform2D(16 byte) Player A Renderer(32 byte) Player A Player(64 byte) Player A Transform2D(16 byte) Enemy A Enemy B Enemy C Renderer (32 byte) Enemy A Enemy B Enemy C Enemy (32 byte) Enemy A Enemy B Enemy C … …
  • 88. : EnemyA RemoveComponent<Enemy> (1) Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Archetype “” 48 bytes “Transform2D” 16 bytes “Renderer” 32 bytes Chunk “Enemy” …Transform2D(16 byte) Enemy A Enemy B Enemy C Renderer (32 byte) Enemy A Enemy B Enemy C Enemy (32 byte) Enemy A Enemy B Enemy C … … Chunk “” Transform2D(16 byte) Renderer (32 byte)
  • 89. : EnemyA RemoveComponent<Enemy> (2) Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Archetype “” 48 bytes “Transform2D” 16 bytes “Renderer” 32 bytes Chunk “Enemy” …Transform2D(16 byte) Enemy A Enemy B Enemy C Renderer (32 byte) Enemy A Enemy B Enemy C Enemy (32 byte) Enemy A Enemy B Enemy C … … Chunk “” Transform2D(16 byte) Renderer (32 byte) Enemy A Enemy A Enem y Chunk
  • 90. Archetype “Enemy” 80 bytes “Transform2D” 16 bytes “Renderer” 32 bytes “Enemy” 32 bytes Archetype “” 48 bytes “Transform2D” 16 bytes “Renderer” 32 bytes Chunk “Enemy” …Transform2D(16 byte) Enemy Z Enemy B Enemy C Renderer (32 byte) Enemy Z Enemy B Enemy C Enemy (32 byte) Enemy Z Enemy B Enemy C … … Chunk “” Transform2D(16 byte) Renderer (32 byte) Enemy A Enemy A : EnemyA RemoveComponent<Enemy> (2)
  • 91. Chunk
  • 92. ECS C# JobSystem • struct NativeArray Update Job MainThread Enemy [ 0 10] Worker Enemy [ 11 20] Worker Enemy [ 21 30] Job
  • 95. Burst Compiler [BurstCompile(Accuracy.Med, Support.Relaxed)] struct SimpleTest : IJobParallelFor{ public Unity.Collections.NativeArray<Vector4> pos; private Vector4 addVector; public void Execute(int i) { Vector4 temp = pos[i]; temp = temp + addVector; pos[i] = temp; } } Attribute
  • 96. Burst Compiler [BurstCompile(Accuracy.Med, Support.Relaxed)] struct SimpleTest : IJobParallelFor{ public Unity.Collections.NativeArray<Vector4> pos; private Vector4 addVector; public void Execute(int i) { Vector4 temp = pos[i]; temp = temp + addVector; pos[i] = temp; } }
  • 98. Burst LLVMIR( ) % 0 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.a, i32 0, i32 0 % 1 = load fast float, float* % 0, align 1 % 2 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.b, i32 0, i32 0 % 3 = load fast float, float* % 2, align 1 % 4 = fadd fast float % 1, % 3 % 5 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.a, i32 0, i32 1 % 6 = load fast float, float* % 5, align 1 % 7 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.b, i32 0, i32 1 % 8 = load fast float, float* % 7, align 1 % 9 = fadd fast float % 6, % 8 % 10 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.a, i32 0, i32 2 % 11 = load fast float, float* % 10, align 1 % 12 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.b, i32 0, i32 2 % 13 = load fast float, float* % 12, align 1 % 14 = fadd fast float % 11, % 13 % 15 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.a, i32 0, i32 3 % 16 = load fast float, float* % 15, align 1 % 17 = getelem entptr % UnityEngine.Vector4.125, % UnityEngine.Vector4.125* % var.b, i32 0, i32 3 % 18 = load fast float, float* % 17, align 1 % 19 = fadd fast float % 16, % 18 x,y,z,w float
  • 99. Burst LLVMIR( ) % 13 = load % UnityEngine.Vector4.318*, % UnityEngine.Vector4.318** % 4, align 1, !alias.scope !0 % 14 = load <4 x float>, <4 x float>* % 5, align 1, !alias.scope !0 % 15 = load i32, i32* % var.1., align 4 % 16 = sext i32 % var.2..03 to i64 % .elt.i = getelem entptr inbounds % UnityEngine.Vector4.318, % UnityEngine.Vector4.318* % 13, i64 % 16, i32 0 % 17 = bitcast float* % .elt.i to <4 x float>* % 18 = load <4 x float>, <4 x float>* % 17, align 1, !noalias !0 % 19 = fadd fast <4 x float> % 14, % 18 % 20 = bitcast float* % .elt.i to <4 x float>* Vector4 <4 x float>
  • 103. • Native Container • GC • C# JobSystem • Unity • Entity Conponent System(ECS) • Memory • Burst Compiler •
  • 105.