SlideShare ist ein Scribd-Unternehmen logo
1 von 56
Downloaden Sie, um offline zu lesen
C#JobSystem & ECSでCPUを極限まで
使い倒そう
~C# JobSystem編~
2018/4/21
講演者名 黒河 優介
所属団体 Unity Technologies Japan
肩書・役職 Developer Relation Engineer
• 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( )
• Unity
4
• Native Container
• 5.6 2018.1β
• C# JobSystem
• 2018.1 β
• Entity Conponent System(ECS)
• 2018.1β
• Burst Compiler
• 2018.1β
私からの話はコチラになります。
Unity
• GC
• C#
• Thread C# MainThread
NativeContainer
• GC
• new
• C#
•
GC
ManagedMemory
アプリで使用している全体メモリ
UnityメモリC#用に確保したメモリ
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.0b
• NativeArray
• NativeSlice ( NativeArray )
•
• NativeList
• NativeHashMap
• NativeMultiHashMap
• NativeQueue
※ NativeContainer 自体は、unsafeなC#で書かれているため、
コンテナを新規に定義することも可能
NativeContainer
Memory Leak
MemoryLeak
• Dispose
• Editor
•
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を発行してます
JobHandlehandle= 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を発行してます
JobHandlehandle= 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を発行してます
JobHandlehandle= 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で良い感じに設定してくれる)
JobHandlehandle= 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で良い感じに設定してくれる)
JobHandlehandle= 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で良い感じに設定してくれる)
JobHandlehandle= 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, TransformAccesstransform){
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を発行して、直後で完了待ち
JobHandlehandle= 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を発行して、直後で完了待ち
JobHandlehandle= 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, TransformAccesstransform){
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/wotakuro/UnityJobSystemTest
こちらで計測。GPU・通信の影響を抑えるため、機内モード/画面輝度最低固定、ゲームのFPSを10固定
にし、CPUでのバッテリー消費が顕著に出る環境にして実験。
Android / iOS共に、JobSystemにして処理時間が減った結果結果、CPUの休む時間が増えたり、MainThreadへの負荷が減るので
CPUの実行周波数を下げることが出来た等で、バッテリー消費が下がったと思われる。
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{
privateJobHandlehandle;
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に積まれるだけです
JobHandlehandle= 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の更新処理
エンジンの処理の隙間にユーザーの処理を埋める
事で全体での処理時間を縮める事が可能です
Work1.IJob Work2.IJobParallelFor
Work3.IJobParallelForTransform Work4.RayCastCommand

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
【CEDEC2018】一歩先のUnityでのパフォーマンス/メモリ計測、デバッグ術
 
UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法
 
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
Unity 2018-2019を見据えたDeNAのUnity開発のこれから [DeNA TechCon 2019]
 
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
【Unite Tokyo 2019】今すぐ現場で覚えておきたい最適化技法 ~「ゲシュタルト・オーディン」開発における最適化事例~
 
UnityでUI開発を高速化した件
UnityでUI開発を高速化した件UnityでUI開発を高速化した件
UnityでUI開発を高速化した件
 
UniRx完全に理解した
UniRx完全に理解したUniRx完全に理解した
UniRx完全に理解した
 
Observableで非同期処理
Observableで非同期処理Observableで非同期処理
Observableで非同期処理
 
猫でも分かるUMG
猫でも分かるUMG猫でも分かるUMG
猫でも分かるUMG
 
【Unity】Scriptable object 入門と活用例
【Unity】Scriptable object 入門と活用例【Unity】Scriptable object 入門と活用例
【Unity】Scriptable object 入門と活用例
 
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
UE4 コリジョン検証 -HitとOverlapイベントが発生する条件について-
 
Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話Unityでオンラインゲーム作った話
Unityでオンラインゲーム作った話
 
IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話
 
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
メカアクションゲーム『DAEMON X MACHINA』 信念と血と鋼鉄の開発事例
 
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
【Unity道場】AssetGraph入門 〜ノードを駆使しててUnityの面倒な手作業を自動化する方法〜
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
【Unite 2018 Tokyo】そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
 
最速C# 7.x
最速C# 7.x最速C# 7.x
最速C# 7.x
 
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
UE4におけるレベル制作事例
UE4におけるレベル制作事例  UE4におけるレベル制作事例
UE4におけるレベル制作事例
 

Ähnlich wie 【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~

Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
Akira Takahashi
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
Yoshifumi Kawai
 
Web Workers
Web WorkersWeb Workers
Web Workers
kaboccha
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
Yusuke Ando
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
melpon
 

Ähnlich wie 【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~ (20)

【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
【CEDEC2018】CPUを使い切れ! Entity Component System(通称ECS) が切り開く新しいプログラミング
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JP
 
Try Webworkers
Try WebworkersTry Webworkers
Try Webworkers
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...Let's build a simple app with  .net 6 asp.net core web api, react, and elasti...
Let's build a simple app with .net 6 asp.net core web api, react, and elasti...
 
UniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for UnityUniRx - Reactive Extensions for Unity
UniRx - Reactive Extensions for Unity
 
T93 com入門
T93 com入門T93 com入門
T93 com入門
 
Unityで本格戦国シュミレーションRPG 開発
Unityで本格戦国シュミレーションRPG 開発Unityで本格戦国シュミレーションRPG 開発
Unityで本格戦国シュミレーションRPG 開発
 
Dotnetconf2017
Dotnetconf2017Dotnetconf2017
Dotnetconf2017
 
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの...
 
Web Workers
Web WorkersWeb Workers
Web Workers
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
Roslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドインRoslyn による Visual Studio のアドイン
Roslyn による Visual Studio のアドイン
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
 
JobScheduler Code Reading
JobScheduler Code ReadingJobScheduler Code Reading
JobScheduler Code Reading
 
.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」.NETラボ 勉強会 2021年1月 「C#で機械学習」
.NETラボ 勉強会 2021年1月 「C#で機械学習」
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
API Gateway + LambdaでLINE通知サービス構築
API Gateway + LambdaでLINE通知サービス構築API Gateway + LambdaでLINE通知サービス構築
API Gateway + LambdaでLINE通知サービス構築
 

Mehr von Unity Technologies Japan K.K.

Mehr von Unity Technologies Japan K.K. (20)

建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
建築革命、更に更に進化!便利さ向上【Unity Reflect ver 3.0 】
 
UnityのクラッシュをBacktraceでデバッグしよう!
UnityのクラッシュをBacktraceでデバッグしよう!UnityのクラッシュをBacktraceでデバッグしよう!
UnityのクラッシュをBacktraceでデバッグしよう!
 
Unityで始めるバーチャルプロダクション
Unityで始めるバーチャルプロダクションUnityで始めるバーチャルプロダクション
Unityで始めるバーチャルプロダクション
 
ビジュアルスクリプティング (旧:Bolt) で始めるUnity入門3日目 ゲームをカスタマイズしよう
ビジュアルスクリプティング (旧:Bolt) で始めるUnity入門3日目 ゲームをカスタマイズしようビジュアルスクリプティング (旧:Bolt) で始めるUnity入門3日目 ゲームをカスタマイズしよう
ビジュアルスクリプティング (旧:Bolt) で始めるUnity入門3日目 ゲームをカスタマイズしよう
 
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーションビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
ビジュアルスクリプティングで始めるUnity入門2日目 ゴールとスコアの仕組み - Unityステーション
 
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそうビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
 
PlasticSCMの活用テクニックをハンズオンで一緒に学ぼう!
PlasticSCMの活用テクニックをハンズオンで一緒に学ぼう!PlasticSCMの活用テクニックをハンズオンで一緒に学ぼう!
PlasticSCMの活用テクニックをハンズオンで一緒に学ぼう!
 
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
点群を使いこなせ! 可視化なんて当たり前、xRと点群を組み合わせたUnityの世界 【Interact , Stipple】
 
Unity教える先生方注目!ティーチャートレーニングデイを体験しよう
Unity教える先生方注目!ティーチャートレーニングデイを体験しようUnity教える先生方注目!ティーチャートレーニングデイを体験しよう
Unity教える先生方注目!ティーチャートレーニングデイを体験しよう
 
「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発「原神」におけるコンソールプラットフォーム開発
「原神」におけるコンソールプラットフォーム開発
 
FANTASIANの明日使えない特殊テクニック教えます
FANTASIANの明日使えない特殊テクニック教えますFANTASIANの明日使えない特殊テクニック教えます
FANTASIANの明日使えない特殊テクニック教えます
 
インディーゲーム開発の現状と未来 2021
インディーゲーム開発の現状と未来 2021インディーゲーム開発の現状と未来 2021
インディーゲーム開発の現状と未来 2021
 
建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】
建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】
建築革命、更に進化!デジタルツイン基盤の真打ち登場【概要編 Unity Reflect ver 2.1 】
 
Burstを使ってSHA-256のハッシュ計算を高速に行う話
Burstを使ってSHA-256のハッシュ計算を高速に行う話Burstを使ってSHA-256のハッシュ計算を高速に行う話
Burstを使ってSHA-256のハッシュ計算を高速に行う話
 
Cinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作るCinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作る
 
徹底解説 Unity Reflect【開発編 ver2.0】
徹底解説 Unity Reflect【開発編 ver2.0】徹底解説 Unity Reflect【開発編 ver2.0】
徹底解説 Unity Reflect【開発編 ver2.0】
 
徹底解説 Unity Reflect【概要編 ver2.0】
徹底解説 Unity Reflect【概要編 ver2.0】徹底解説 Unity Reflect【概要編 ver2.0】
徹底解説 Unity Reflect【概要編 ver2.0】
 
Unityティーチャートレーニングデイ -認定プログラマー編-
Unityティーチャートレーニングデイ -認定プログラマー編-Unityティーチャートレーニングデイ -認定プログラマー編-
Unityティーチャートレーニングデイ -認定プログラマー編-
 
Unityティーチャートレーニングデイ -認定3Dアーティスト編-
Unityティーチャートレーニングデイ -認定3Dアーティスト編-Unityティーチャートレーニングデイ -認定3Dアーティスト編-
Unityティーチャートレーニングデイ -認定3Dアーティスト編-
 
Unityティーチャートレーニングデイ -認定アソシエイト編-
Unityティーチャートレーニングデイ -認定アソシエイト編-Unityティーチャートレーニングデイ -認定アソシエイト編-
Unityティーチャートレーニングデイ -認定アソシエイト編-
 

Kürzlich hochgeladen

Kürzlich hochgeladen (7)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~