Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

of

【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 1 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 2 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 3 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 4 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 5 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 6 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 7 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 8 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 9 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 10 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 11 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 12 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 13 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 14 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 15 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 16 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 17 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 18 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 19 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 20 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 21 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 22 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 23 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 24 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 25 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 26 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 27 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 28 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 29 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 30 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 31 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 32 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 33 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 34 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 35 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 36 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 37 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 38 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 39 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 40 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 41 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 42 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 43 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 44 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 45 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 46 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 47 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 48 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 49 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 50 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 51 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 52 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 53 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 54 【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング Slide 55
Upcoming SlideShare
【Unite 2017 Tokyo】C#ジョブシステムによるモバイルゲームのパフォーマンス向上テクニック
Next
Download to read offline and view in fullscreen.

10 Likes

Share

Download to read offline

【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング

Download to read offline

017/8/30~9/1に開催されたCEDEC2017の講演スライドです。
講師:伊藤 周 (ユニティ・テクノロジーズ・ジャパン合同会社)

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

【CEDEC2017】C#JobSystem を使った Unity流マルチスレッドプログラミング

  1. 1. C#JobSystem を使った Unity流マルチスレッドプログラミング ユニティ・テクノロジーズ・ジャパン合同会社 エバンジェリスト
 伊藤 周
  2. 2. • 今回紹介するC# Job Systemはまだ発展段階 • リリースでは多少の差異が出る可能性がある • C# Job Systemの概念を知ってほしい • プログラマ以外は理解不能 諸注意
  3. 3. • 従来のマルチスレッドプログラミング • C# Job System の概要 • Let’s read codes. (コードを読む) • Let’s make a mistake. (間違ってみる) • Let’s try “C# Job Compiler” (コンパイラを体験) • Let’s implement. (実装してみる) • まとめ アジェンダ
  4. 4. 従来のマルチスレッドプログラミングの話
  5. 5. マルチスレッド プログラミングは 好きですか?
  6. 6. 私は嫌いです
  7. 7. • レースコンディション対策が嫌だ • 面倒臭い • コードが汚い、可読性が低い • 間違っても気づきにくい MTPのここが嫌だ その1 Aが使うよ Aが使うよ Bが使うよ A AB ? write write read
  8. 8. • デッドロックが嫌だ • 面倒臭い • コードが汚い、可読性が低い • 間違うと無限ループ MTPのここが嫌だ その2 A AB B 待ち待ち
  9. 9. • 難解なところが嫌だ • mutex:lockとか • アトミック変数とか MTPのここが嫌だ その3
  10. 10. • デバッグが嫌だ • 正常に”動いてしまったり”する • 無限ループになったりする • 突然ハングアップしたりする • リリース後にバグが判明したりする MTPのここが嫌だ その4
  11. 11. 私には無理だ!
  12. 12. そんなあなたに C# Job System
  13. 13. C# Job System の概要
  14. 14. 43伊藤周の年齢
  15. 15. 116
  16. 16. 116倍Boid シミュレーションを マルチスレッドで 8 core CPUで 動かした場合の速度倍
  17. 17. Demo
  18. 18. • 簡潔に書ける • GCフリー • 安全 • 高速な新コンパイラ C# Job System の特徴
  19. 19. • Data Oriented Programming • データとビヘイビア(振舞い)の分離 • struct(構造体)コンポーネントの導入 • Job Component System の用意 • 簡潔に書けるようにマネージャーを用意 特徴1 簡潔に書ける
  20. 20. • GCをいかにさせないか • NativeArrayの導入      • 以下の感じで確保 • 以下の感じで解放(自分で) 特徴2 GCフリー var src = new NativeArray<float>(500, Allocator.Temp); src.Dispose();  要素数 アロケーターの種類   ↓     ↓
  21. 21. • 他のNativeArrayファミリー 特徴2 GCフリー struct NativeArray<Value> // 配列 struct NativeList<Value> // リスト。追加削除が容易 struct NativeSlice<Value> // 一部を切り取れる struct NativeHashmap<Key, Value> // Dictionary「 struct NativeMultiHashmap<Key, Value> //複数Dictionary
  22. 22. • エラーで指摘してくれる • 落ちることはない • レースコンディション、デッドロックは起こり得ない • “Sandbox” 特徴3 安全
  23. 23. • C#→[Mono]→IL→[C# Job Compiler]→内部的な Domain Model →[最適化]→[LLVM]→実行形式 • 10倍〜20倍高速になる • 電池消費の軽減 • Why faster? • SIMD命令の有効利用 • 正確さとパフォーマンスのトレードオフ 特徴4 高速な新コンパイラ
  24. 24. Let’s read C# Job System codes!
  25. 25. • IJob~でジョブを定義 • Execute にジョブの中身を書く • Schedule でジョブを開始 • Complete でジョブ終了確認 • 変数はNativeArray系を使い、自力でDispose コーディング基本まとめ
  26. 26. • IJob • 1つのスレッドでジョブを回す • IJobParallelFor • 複数のスレッドでジョブを回す • IJobParallelForTransform • Transformにアクセスが可能 コーディング基本まとめ public void Execute() {} public void Execute(int i) {} public void Execute(int i, TransformAccess transform){}
  27. 27. Let’s make a mistake!
  28. 28. • マルチスレッドプログラミングは間違えやすい • ちょっとした見落としはしてしまう • Unityは落ちることなくエラーが教えてくれる • CTO Joachim「Unityは「Sandbox(=砂場)」である」 • 砂場では間違っていい。正解に導いてくれれれば。 エラーまとめ
  29. 29. Let’s try “C# Job コンパイラ”
  30. 30. • 一文付け足すだけ • [ComputeJobOptimizationAttribute(Accuracy .Med, Support.Relaxed)] • Accuracy は計算の精度 • 新しいmathライブラリ C# Job Compiler
  31. 31. • float1, float2, float3, float4, • half1, half2, half3, half4 • int1, int2, int3, int4 • math.abs • math.min • math.max • math.pow • math.lerp • math.clamp • math.saturate • math.select // 条件分岐 • math.rcp // 逆数 • math.sign • math.rsqrt // sqrtの逆数 • math.any • math.all • math.sincos 新mathライブラリ
  32. 32. Let’s implement C# Job System.
  33. 33. public class RotatorOldUpdate : MonoBehaviour { [SerializeField] float m_Speed; public float speed { get { return m_Speed; } set { m_Speed = value; } } void Update () { transform.rotation = transform.rotation * Quaternion.AngleAxis (m_Speed * Time.deltaTime, Vector3.up); } }
  34. 34. • STEP1:データレイアウトの最適化 • GameObjectごとにするのはやめる • データをシーケンシャルにする • キャッシュ化する • forループでGetComponentとかしなくてよくなる Job Component System実装まとめ
  35. 35. public class RotatorOldUpdate : MonoBehaviour { [SerializeField] float m_Speed; public float speed { get { return m_Speed; } set { m_Speed = value; } } void Update () { transform.rotation = transform.rotation * Quaternion.AngleAxis (m_Speed * Time.deltaTime, Vector3.up); } }
  36. 36. class RotatorManagerMainThread : ScriptBehaviourManager { List<Transform> m_Transforms; NativeList<float> m_Speeds; : protected override void OnUpdate() { base.OnUpdate (); float deltaTime = Time.deltaTime; NativeArray<float> speeds = m_Speeds; for (int i = 0; i != m_Transforms.Count; i++) { var transform = m_Transforms [i]; transform.rotation = transform.rotation * Quaternion.AngleAxis (speeds[i] * deltaTime, Vector3.up); } } : : } public class RotatorWithManagerMainThread : ScriptBehaviour { : (たくさんの実装) : }
  37. 37. • STEP2: Job化 • List<Transform> → TransformAccessArray • IJobParallelForTransform継承したジョブ • Execute(int index, TransformAccess transform)の実装 Job Component System実装まとめ
  38. 38. class RotatorManagerMainThread : ScriptBehaviourManager { List<Transform> m_Transforms; NativeList<float> m_Speeds; : protected override void OnUpdate() { base.OnUpdate (); float deltaTime = Time.deltaTime; NativeArray<float> speeds = m_Speeds; for (int i = 0; i != m_Transforms.Count; i++) { var transform = m_Transforms [i]; transform.rotation = transform.rotation * Quaternion.AngleAxis (speeds[i] * deltaTime, Vector3.up); } } : : } public class RotatorWithManagerMainThread : ScriptBehaviour { : (たくさんの実装) : }
  39. 39. class RotatorManager : ScriptBehaviourManager { TransformAccessArray m_Transforms; NativeList<float> m_Speeds; JobHandle m_Job; : protected override void OnUpdate() { base.OnUpdate (); m_Job.Complete (); var jobData = new RotatorJob(); jobData.speeds = m_Speeds; jobData.deltaTime = Time.deltaTime; m_Job = jobData.Schedule (m_Transforms); } struct RotatorJob : IJobParallelForTransform { [ReadOnly] public NativeArray<float> speeds; public float deltaTime; public void Execute(int index, TransformAccess transform) { transform.rotation = transform.rotation * Quaternion.AngleAxis (speeds[index] * deltaTime, Vector3.up); } } } public class RotatorWithManager : ScriptBehaviour { : (たくさんの実装) : }
  40. 40. • STEP3: データからビヘイビアを分離する • ジョブで使用するデータを分離する • InjectTuplesの導入 • Tuples が付加した配列はindexが同期する • ComponentSystemから継承させる • マネージャーの仕事を任せる Job Component System実装まとめ
  41. 41. public class RotationSpeedComponent : ScriptBehaviour { public float speed; } public class RotatingSystem : ComponentSystem { [InjectTuples] public ComponentArray<Transform> m_Transforms; [InjectTuples] public ComponentArray<RotationSpeedComponent> m_Rotators; override protected void OnUpdate() { base.OnUpdate (); float dt = Time.deltaTime; for (int i = 0; i != m_Transforms.Length ;i++) { m_Transforms[i].rotation = m_Transforms[i].rotation * Quaternion.AngleAxis(dt * m_Rotators[i].speed, Vector3.up); } } }
  42. 42. • STEP4: データのstruct化 • MonoBehaviour継承 → IComponentData継承 • struct化 • ComponentSystemからの継承でお手軽マネー ジャー • ComponentArray → ComponentDataArray Job Component System実装まとめ
  43. 43. public class RotationSpeedComponent : ScriptBehaviour { public float speed; } public class RotatingSystem : ComponentSystem { [InjectTuples] public ComponentArray<Transform> m_Transforms; [InjectTuples] public ComponentArray<RotationSpeedComponent> m_Rotators; override protected void OnUpdate() { base.OnUpdate (); float dt = Time.deltaTime; for (int i = 0; i != m_Transforms.Length ;i++) { m_Transforms[i].rotation = m_Transforms[i].rotation * Quaternion.AngleAxis(dt * m_Rotators[i].speed, Vector3.up); } } }
  44. 44. [Serializable] public struct RotationSpeed : IComponentData { public float speed; public RotationSpeed (float speed) { this.speed = speed; } } public class RotationSpeedDataComponent : ComponentDataWrapper<RotationSpeed> { } public class RotatingDataSystem : ComponentSystem { [InjectTuples] public ComponentArray<Transform> m_Transforms; [InjectTuples] public ComponentDataArray<RotationSpeed> m_Rotators; override protected void OnUpdate() { base.OnUpdate (); float dt = Time.deltaTime; for (int i = 0; i != m_Transforms.Length ;i++) { m_Transforms[i].rotation = m_Transforms[i].rotation * Quaternion.AngleAxis(dt * m_Rotators[i].speed, Vector3.up); } } }
  45. 45. • STEP5: ジョブ実装 と 依存性解決 • IJobParallelForTransformを継承したstruct • Execute で Transformが使える • ComponentSystem → JobComponentSystem • GetDependency()で依存性の自動解決 Job Component System実装まとめ
  46. 46. [Serializable] public struct RotationSpeed : IComponentData { public float speed; public RotationSpeed (float speed) { this.speed = speed; } } public class RotationSpeedDataComponent : ComponentDataWrapper<RotationSpeed> { } public class RotatingDataSystem : ComponentSystem { [InjectTuples] public ComponentArray<Transform> m_Transforms; [InjectTuples] public ComponentDataArray<RotationSpeed> m_Rotators; override protected void OnUpdate() { base.OnUpdate (); float dt = Time.deltaTime; for (int i = 0; i != m_Transforms.Length ;i++) { m_Transforms[i].rotation = m_Transforms[i].rotation * Quaternion.AngleAxis(dt * m_Rotators[i].speed, Vector3.up); } } }
  47. 47. [Serializable] public struct RotationSpeed : IComponentData { public float speed; public RotationSpeed (float speed) { this.speed = speed; } } public class RotationSpeedDataComponent : ComponentDataWrapper<RotationSpeed> { } public class SystemRotator : JobComponentSystem { [InjectTuples] public TransformAccessArray m_Transforms; [InjectTuples] public ComponentDataArray<RotationSpeed> m_Rotators; override protected void OnUpdate() { base.OnUpdate (); var job = new Job(); job.dt = Time.deltaTime; job.rotators = m_Rotators; AddDependency(job.Schedule(m_Transforms, GetDependency ())); } struct Job : IJobParallelForTransform { public float dt; [ReadOnly] public ComponentDataArray<RotationSpeed> rotators; public void Execute(int i, TransformAccess transform) { transform.rotation = transform.rotation * Quaternion.AngleAxis(dt * rotators[i].speed, Vector3.up); } } }
  48. 48. C# Job System 注意点 & まとめ
  49. 49. • データ構造はstructのみ (class はNG) • .NETやUnity のAPIはジョブ内では(基本的に)使えない • 何でもかんでも早くなるわけではない • 算術系が早くなる、と考えるのが正解 • 相互の距離の計算とか • 敵AIの思考ルーチンとか C# Job System 注意点
  50. 50. • STEP1 C# Job system • Unity 2017.3 or 2018.X • STEP2 Component system • STEP3 math library • STEP4 C# Job Compiler リリース予定
  51. 51. • 多数の敵・味方が出るゲームでの相互距離の計算 • それによるソート • RTS等で使う影響マップの生成 • 弾幕シューティング • etc… 実際に何に使える?
  52. 52. • マルチスレッドプログラミングが安全に書ける • 新しいComponent System で簡潔に書ける • コンパイラをかければさらに早くなる C# Job System まとめ
  53. 53. Q&A
  • takyam1

    Jan. 21, 2021
  • takanoriyokoyama

    Sep. 5, 2019
  • KPKP9

    Dec. 6, 2018
  • junichikamai

    Apr. 30, 2018
  • Fey_00

    Mar. 28, 2018
  • ShojiYamauchi

    Mar. 13, 2018
  • xxxDATxxx

    Mar. 8, 2018
  • MasatakeInaba

    Jan. 26, 2018
  • ssuser4da127

    Sep. 11, 2017
  • soichirosato1

    Sep. 10, 2017

017/8/30~9/1に開催されたCEDEC2017の講演スライドです。 講師:伊藤 周 (ユニティ・テクノロジーズ・ジャパン合同会社)

Views

Total views

49,383

On Slideshare

0

From embeds

0

Number of embeds

40,536

Actions

Downloads

31

Shares

0

Comments

0

Likes

10

×