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
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;
}
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
…
…