Slide 1

Slide 1 text

© 2017 Cygames, Inc. Cygames における 次世代ハイエンドコンソール向け ゲームエンジンの開発 ~最高のコンテンツを支えるゲームエンジン~ 株式会社 Cygames 多胡 順司 1

Slide 2

Slide 2 text

© 2017 Cygames, Inc. サマリー • Cyllista Game Engine の紹介 • ゲーム開発者がイテレーションを速く回せる ようにするための取り組み 2

Slide 3

Slide 3 text

© 2017 Cygames, Inc. 自己紹介 • 多胡 順司 • 株式会社 Cygames • 技術本部 Cyllista Game Engine 統括マネージャー 3

Slide 4

Slide 4 text

© 2017 Cygames, Inc. Cyllista Game Engine デモムービー 4 ※デモであり開発中のゲームとは関係ありません。

Slide 5

Slide 5 text

© 2017 Cygames, Inc. 5

Slide 6

Slide 6 text

© 2017 Cygames, Inc. Cyllista Game Engine 6 内製統合型ゲームエンジン ランタイム + エディタ ハイエンドコンソール向け PlayStation 4

Slide 7

Slide 7 text

© 2017 Cygames, Inc. Cyllista Game Engine の目標 7 最高のゲームエンジン

Slide 8

Slide 8 text

© 2017 Cygames, Inc. エンジンの目標 8 最高のゲームエンジン ゲーム開発者が 最高のパフォーマンスを 出せる ハードウェアが 最高のパフォーマンスを 出せる

Slide 9

Slide 9 text

© 2017 Cygames, Inc. エンジンの目標 • ハードウェアの性能を最大限に引き出す – ジョブシステム – データ指向設計 • http://tech.cygames.co.jp/archives/2843/ 9 ハードウェアが最高のパフォーマンスを出せる

Slide 10

Slide 10 text

© 2017 Cygames, Inc. エンジンの目標 10 ゲーム開発者が最高のパフォーマンスを出せる イテレーションを 速く回す!

Slide 11

Slide 11 text

© 2017 Cygames, Inc. エンジンの目標 • コンテンツ制作者 – ゲームデザイナー、レベルデザイナー – アーティスト – サウンドデザイナー – QA – ゲームエンジニア • エンジン開発者 11 ゲーム開発者が最高のパフォーマンスを出せる

Slide 12

Slide 12 text

© 2017 Cygames, Inc. エンジンの目標 12 エンジン開発者が最高のパフォーマンスを出せる ハードウェアが最高のパフォーマンスを出せる

Slide 13

Slide 13 text

© 2017 Cygames, Inc. エンジンの目標 13 最高のゲームエンジン ハードウェアが 最高のパフォーマンスを 出せる ゲーム開発者が 最高のパフォーマンスを 出せる 今回はこちらの話 が中心!

Slide 14

Slide 14 text

© 2017 Cygames, Inc. ゲーム開発者 14 エンジン 開発者 ゲームプログラム 開発者 ゲームコンテンツ 開発者 • エンジニア • エンジニア • ゲームデザイナ • アーティスト • サウンドデザイナ

Slide 15

Slide 15 text

© 2017 Cygames, Inc. ゲーム開発者 15 エンジン 開発者 ゲームプログラム 開発者 ゲームコンテンツ 開発者 モジュール化 テスト駆動開発 開発ツール ユーザーコード 開発効率の最適化 アセットシステム アセット プレビュー 開発言語の統一 コードの自動整形 ビルド時間の短縮

Slide 16

Slide 16 text

© 2017 Cygames, Inc. エンジン開発者向け 16 エンジン 開発者 ゲームプログラム 開発者 ゲームコンテンツ 開発者 モジュール化 テスト駆動開発 開発ツール ユーザーコード 開発効率の最適化 アセットシステム アセット プレビュー 開発言語の統一 コードの自動整形 ビルド時間の短縮

Slide 17

Slide 17 text

© 2017 Cygames, Inc. モジュール化 17

Slide 18

Slide 18 text

© 2017 Cygames, Inc. ゲームエンジンのモジュール構成 • 機能ごとにモジュール化 • レイヤー構成 18 Core Gfx … Game Tool Kit Application Anm Col Snd

Slide 19

Slide 19 text

© 2017 Cygames, Inc. モジュール • 依存は下向きの一方向 – 相互依存不可 • モジュールごとに DLL化 19 Core Gfx … Game Tool Kit Anm Col Snd

Slide 20

Slide 20 text

© 2017 Cygames, Inc. モジュール化の利点 • ユーザー視点 – 必要なモジュールだけを取り出して利用可能 • 開発者視点 – ビルド時間の短縮 • 依存しているモジュールだけで開発可能 • 開発しているモジュールだけがリンク対象 20

Slide 21

Slide 21 text

© 2017 Cygames, Inc. モジュールの開発 21 テスト駆動開発 (TDD) モジュールの公開 API をテスト

Slide 22

Slide 22 text

© 2017 Cygames, Inc. テスト駆動開発 22

Slide 23

Slide 23 text

© 2017 Cygames, Inc. テスト駆動開発 1. テストコードを書く 2. テストが失敗するように実装する 3. テストが通る最小限の実装を記述する 以上を繰り返す 23

Slide 24

Slide 24 text

© 2017 Cygames, Inc. テスト駆動開発 • テストを書く 24 // MySystem.h // MySystem.cpp // MySystemTest.cpp // MySystemTest.cpp void MySystemTest() { MySystem* mySystem = MySystemGet(); ASSERT_TRUE(mySystem != nullptr); }

Slide 25

Slide 25 text

© 2017 Cygames, Inc. // MySystem.h // MySystem.cpp テスト駆動開発 • テストが失敗する 実装を書く 25 // MySystem.h class MySystem { }; // MySystem.cpp MySystem* MySystemGet() { return nullptr; } // MySystemTest.cpp void MySystemTest() { MySystem* mySystem = MySystemGet(); ASSERT_TRUE(mySystem != nullptr); }

Slide 26

Slide 26 text

© 2017 Cygames, Inc. // MySystem.cpp MySystem* MySystemGet() { return nullptr; } テスト駆動開発 • テストが通る 最低限の実装を書く 26 // MySystem.h class MySystem { }; // MySystem.cpp class MySystemImpl : public MySystem { }; static MySystemImpl g_mySystem; MySystem* MySystemGet() { return &g_mySystem; } // MySystemTest.cpp void MySystemTest() { MySystem* mySystem = MySystemGet(); ASSERT_TRUE(mySystem != nullptr); }

Slide 27

Slide 27 text

© 2017 Cygames, Inc. // MySystemTest.cpp void MySystemTest() { MySystem* mySystem = MySystemGet(); ASSERT_TRUE(mySystem != nullptr); } テスト駆動開発 • 新たなテストを書く 27 // MySystem.h class MySystem { }; // MySystem.cpp class MySystemImpl : public MySystem { }; static MySystemImpl g_mySystem; MySystem* MySystemGet() { return &g_mySystem; } // MySystemTest.cpp void MySystemTest() { MySystem* mySystem = MySystemGet(); ASSERT_TRUE(mySystem != nullptr); MyObject* obj = mySystem->createObject(); ASSERT_TRUE(obj != nullptr); }

Slide 28

Slide 28 text

© 2017 Cygames, Inc. // MySystem.h class MySystem { }; // MySystem.cpp class MySystemImpl : public MySystem { }; static MySystemImpl g_mySystem; MySystem* MySystemGet() { return &g_mySystem; } テスト駆動開発 • テストが失敗する 実装を書く 28 // MySystem.h class MyObject { }; class MySystem { virtual MyObject* createObject() = 0; }; // MySystem.cpp class MySystemImpl : public MySystem { virtual MyObject* createObject() { return nullptr; } }; static MySystemImpl g_mySystem; MySystem* MySystemGet() { return &g_mySystem; } // MySystemTest.cpp void MySystemTest() { MySystem* mySystem = MySystemGet(); ASSERT_TRUE(mySystem != nullptr); MyObject* obj = mySystem->createObject(); ASSERT_TRUE(obj != nullptr); }

Slide 29

Slide 29 text

© 2017 Cygames, Inc. // MySystem.cpp class MySystemImpl : public MySystem { virtual MyObject* createObject() { return nullptr; } }; static MySystemImpl g_mySystem; MySystem* MySystemGet() { return &g_mySystem; } テスト駆動開発 • テストが通る 最低限の実装を書く 29 // MySystem.h class MyObject { }; class MySystem { virtual MyObject* createObject() = 0; }; // MySystem.cpp class MyObjectImpl : public MyObject { }; class MySystemImpl : public MySystem { virtual MyObject* createObject() { return new MyObjectImpl(); } }; static MySystemImpl g_mySystem; MySystem* MySystemGet() { return &g_mySystem; } // MySystemTest.cpp void MySystemTest() { MySystem* mySystem = MySystemGet(); ASSERT_TRUE(mySystem != nullptr); MyObject* obj = mySystem->createObject(); ASSERT_TRUE(obj != nullptr); }

Slide 30

Slide 30 text

© 2017 Cygames, Inc. TDD の利点 • コードが安定する – CI (Jenkins) などで常時実行 • ユーザー視点での API の設計 • リファクタリングの障壁が下がる – コードがさらに安定 30

Slide 31

Slide 31 text

© 2017 Cygames, Inc. TDD の利点 31 安心感

Slide 32

Slide 32 text

© 2017 Cygames, Inc. TDD の問題点 • 導入が難しい 32 「面倒くさい!」 「テストコード書く意味あるの?」

Slide 33

Slide 33 text

© 2017 Cygames, Inc. TDD の導入方法 33 TDD 以外の開発方法を 提供しない!!!

Slide 34

Slide 34 text

© 2017 Cygames, Inc. TDD の導入方法 34 エンジン開発ツールで TDD の手間を省く

Slide 35

Slide 35 text

© 2017 Cygames, Inc. エンジン開発ツール 35

Slide 36

Slide 36 text

© 2017 Cygames, Inc. cybuild • エンジン開発で利用する唯一のツール • エンジン開発で必要なことはなんでも出来る 36

Slide 37

Slide 37 text

© 2017 Cygames, Inc. cybuild 37 CUI

Slide 38

Slide 38 text

© 2017 Cygames, Inc. cybuild コマンド • cybuild update – ソースコード・ツール・アセットの更新 • cybuild test – モジュールのテスト • cybuild push – ソースコード・ツール・アセットのサブミット 38

Slide 39

Slide 39 text

© 2017 Cygames, Inc. cybuild によるテスト駆動開発 • cybuild test Gfx premake build run – Gfx モジュールのビルド・テストの実行 • cybuild test Gfx premake build run -p ps4 – PlayStation 4 版のテスト • cybuild test Gfx premake --open – sln ファイルを開く 39

Slide 40

Slide 40 text

© 2017 Cygames, Inc. cybuild のデモ 40 デモムービー

Slide 41

Slide 41 text

© 2017 Cygames, Inc. 41

Slide 42

Slide 42 text

© 2017 Cygames, Inc. cybuild の主な機能 • モジュールのテスト • ドキュメント生成 • エディタの起動 • 中間ファイルの削除 • ファイルの変更状態の表示 42

Slide 43

Slide 43 text

© 2017 Cygames, Inc. cybuild の利点 43 ツールのヘルプ • “-h” オプション • コマンド一覧 CI での実行 • そのまま組み込み すべてのツールを ひとつに! • 迷わない • 覚えることは ひとつ Doxygen

Slide 44

Slide 44 text

© 2017 Cygames, Inc. プログラミング言語の統一 44

Slide 45

Slide 45 text

© 2017 Cygames, Inc. プログラミング言語の統一 45 C++ • エンジンランタイム • 速度の要求される アセット変換処理 Python • ツール • レベルエディタ • cybuild • アセット変換処理

Slide 46

Slide 46 text

© 2017 Cygames, Inc. Python の利点 • モジュールが充実 – 何かしようと思ったらほとんどの場合モジュールが存在する 46 Python 114,862 https://rubygems.org/ https://pypi.python.org/pypi Ruby 8,726

Slide 47

Slide 47 text

© 2017 Cygames, Inc. Python の利点 • ツールの配布が容易 – VCS (Perforce) に submit するだけ – 使う側は sync するだけ 47

Slide 48

Slide 48 text

© 2017 Cygames, Inc. Python の利点 • コードの共有が容易 – 内製コードのモジュール化 – import すればすぐに利用可能 48 from cy import log log.info(‘hello world!’)

Slide 49

Slide 49 text

© 2017 Cygames, Inc. Python の利点 • テスト駆動開発 49 import unittest class MyModuleTest(unittest.TestCase): def test_do_something(self): self.assertTrue(…)

Slide 50

Slide 50 text

© 2017 Cygames, Inc. コードの自動整形 50

Slide 51

Slide 51 text

© 2017 Cygames, Inc. ソースコードの自動整形 • C++ – clang-format で自動整形 • Python – pep8 / flake で自動整形 51

Slide 52

Slide 52 text

© 2017 Cygames, Inc. 自動整形の利点 52 インデントの タブ/スペース論争の終焉

Slide 53

Slide 53 text

© 2017 Cygames, Inc. 自動整形の利点 53 コードの中身に集中 書くときも 読むときも

Slide 54

Slide 54 text

© 2017 Cygames, Inc. 自動整形の呼び出し 54 cybuild format

Slide 55

Slide 55 text

© 2017 Cygames, Inc. ゲームプログラム開発者向け 55 エンジン 開発者 ゲームプログラム 開発者 ゲームコンテンツ 開発者 モジュール化 テスト駆動開発 開発ツール ユーザーコード 開発効率の最適化 アセットシステム アセット プレビュー 開発言語の統一 コードの自動整形 ビルド時間の短縮

Slide 56

Slide 56 text

© 2017 Cygames, Inc. ユーザーコード開発効率の最適化 56

Slide 57

Slide 57 text

© 2017 Cygames, Inc. ユーザーコードの開発効率 57 Core Gfx … Game Tool Kit Application Anm Col Snd テスト駆動開発 テスト駆動開発 + ?

Slide 58

Slide 58 text

© 2017 Cygames, Inc. ユーザーコードはC++ 58 利点 • 速い • 詳細な最適化が可能 • イテレーションが遅い • コンパイル • リンク • 読み込み 欠点

Slide 59

Slide 59 text

© 2017 Cygames, Inc. Runtime Compiled C++ (RCC) 59 プログラムを実行中に C++ コードを更新可能 http://runtimecompiledcplusplus.blogspot.jp/

Slide 60

Slide 60 text

© 2017 Cygames, Inc. Runtime Compiled C++ デモ 60 デモムービー

Slide 61

Slide 61 text

© 2017 Cygames, Inc. 61

Slide 62

Slide 62 text

© 2017 Cygames, Inc. RCC の原理 • RccObject クラス – RCC の最小単位 62 // MyActorA.cpp class MyActorAImpl : public MyActorA, public RccObject { ... }; // RccObject.h class RccObject { virtual void initialize() = 0; virtual void terminate() = 0; virtual void* getInterface(InterfaceId) = 0; virtual void serialize(Serializer*) = 0; };

Slide 63

Slide 63 text

© 2017 Cygames, Inc. RCC の原理 • .cpp ファイルは通常 どおりコンパイル・リ ンク 63 MyActorA .cpp MyActorB .cpp MyActorC .cpp MyApp.exe

Slide 64

Slide 64 text

© 2017 Cygames, Inc. RCC の原理 • RccObject は システムで管理 64 MyActorA .cpp MyActorB .cpp MyActorC .cpp MyApp.exe MyActorA MyActorB MyActorC MyActorC MyActorC MyActorA

Slide 65

Slide 65 text

© 2017 Cygames, Inc. RCC の原理 • .cpp ファイルの変更 を検出 • 変更された .cpp を コンパイル • 一時的な .dll に リンク 65 MyActorA .cpp MyActorB .cpp MyActorC .cpp MyApp.exe MyActorA MyActorB MyActorC MyActorC MyActorC MyActorA MyActorA’ .cpp tmp.dll

Slide 66

Slide 66 text

© 2017 Cygames, Inc. RCC の原理 • 古いインスタンスを シリアライズ 66 MyActorA .cpp MyActorB .cpp MyActorC .cpp MyApp.exe MyActorA MyActorB MyActorC MyActorC MyActorC MyActorA MyActorA’ .cpp tmp.dll Serializer Serializer Serialize

Slide 67

Slide 67 text

© 2017 Cygames, Inc. RCC の原理 • 不要になった RccObject を削除 67 MyActorA .cpp MyActorB .cpp MyActorC .cpp MyApp.exe MyActorB MyActorC MyActorC MyActorC MyActorA’ .cpp tmp.dll Serializer Serializer Deserialize

Slide 68

Slide 68 text

© 2017 Cygames, Inc. RCC の原理 • 新しいコードから 新しいRccObjectを 生成 • 古い状態を デシリアライズ 68 MyActorA .cpp MyActorB .cpp MyActorC .cpp MyApp.exe MyActorB MyActorC MyActorC MyActorC MyActorA’ .cpp tmp.dll Serializer Serializer Deserialize MyActorA’ MyActorA’

Slide 69

Slide 69 text

© 2017 Cygames, Inc. RCC の原理 • 新しいコードで動作 • 古いコードは 利用されない 69 MyActorA .cpp MyActorB .cpp MyActorC .cpp MyApp.exe MyActorB MyActorC MyActorC MyActorC MyActorA’ .cpp tmp.dll MyActorA’ MyActorA’

Slide 70

Slide 70 text

© 2017 Cygames, Inc. RCC サンプル 70 // RccObject の生成 RccObjectHandle actorHandle = rccSystem->createRccObject(MY_ACTOR_A); // ハンドルからインターフェースを取得 MyActorA* actor = actorHandle.getInterface(); // 処理の呼び出し actor->act();

Slide 71

Slide 71 text

© 2017 Cygames, Inc. RCC サンプル 71 // MyActor.cpp class MyActorAImpl : public MyActorA, public RccObject { virtual void initialize(); virtual void terminate(); virtual void* getInterface(InterfaceId id) { if (id == MY_ACTOR_ID) { return static_cast(this);} return nullptr; } virtual serialize(Serializer* serializer); // MyActorA virtual void act(); };

Slide 72

Slide 72 text

© 2017 Cygames, Inc. RCC の制限 • 外部関数呼び出しの制限 – inline / virtual 関数のみ • システム関数 – グローバル関数は virtual にできない – グローバル関数はシステムクラスのメンバ関数に – すべてのシステムクラスを SystemTable に登録 – SystemTable 自体のアドレスは tmp.dll 読み込み後に .dll 側の コードに渡す 72 MySystem* mySystem = SystemTableGet()->getMySystem(); mySystem->doSystemThings();

Slide 73

Slide 73 text

© 2017 Cygames, Inc. エンジン API • すべての API を RccObject から呼び出し可能 73 inline • 軽量な関数 • 頻繁に呼び出される 関数 virtual • 複雑な関数 • 実装を隠蔽する 必要がある関数

Slide 74

Slide 74 text

© 2017 Cygames, Inc. RCC の利点・欠点 利点 • 高速なイテレーション • SystemTable での API の一覧性 • コンパイル時間の短縮 – リンカがなにもしない • Visual Studio で デバッグ可能 欠点 • virtual 呼び出しの オーバーヘッド • 専用のシリアライズ処理 の実装の必要性 74

Slide 75

Slide 75 text

© 2017 Cygames, Inc. ビルド時間の短縮 75

Slide 76

Slide 76 text

© 2017 Cygames, Inc. ビルド時間 76 エンジニアの イテレーション速度に 直結

Slide 77

Slide 77 text

© 2017 Cygames, Inc. ビルド時間 • 有効行数 40万行のフルビルド – エンジンコード + アプリケーションコード (13万行) – その他ライブラリコード 77 30秒

Slide 78

Slide 78 text

© 2017 Cygames, Inc. ビルド時間 • アプリケーション側のコードの修正 78 ~5秒

Slide 79

Slide 79 text

© 2017 Cygames, Inc. ビルド時間 • 実行時コンパイル – コンパイル + 読み込み 79 ~2秒

Slide 80

Slide 80 text

© 2017 Cygames, Inc. ビルド時間の短縮 • 不要なヘッダはインクルードしない • template の利用は最小限 • ツールはビルド不要 • CI で常に監視 80

Slide 81

Slide 81 text

© 2017 Cygames, Inc. ビルド時間の短縮 81 速いPC 速いCPU + 速いディスク

Slide 82

Slide 82 text

© 2017 Cygames, Inc. ゲームコンテンツ開発者向け 82 エンジン 開発者 ゲームプログラム 開発者 ゲームコンテンツ 開発者 モジュール化 テスト駆動開発 開発ツール ユーザーコード 開発効率の最適化 アセットシステム アセット プレビュー 開発言語の統一 コードの自動整形 ビルド時間の短縮

Slide 83

Slide 83 text

© 2017 Cygames, Inc. アセットシステム 83

Slide 84

Slide 84 text

© 2017 Cygames, Inc. アセットフロー 84 元データ ファイル 中間 ファイル 実機用 ファイル アーカイブ ファイル エクスポート コンバート コンバート

Slide 85

Slide 85 text

© 2017 Cygames, Inc. アセットコンバートフロー 85 Maya ファイル .ma モデル 中間ファイル .imdl モデル ランタイムファイル .mdl アーカイブファイル .arc マテリアル 中間ファイル .imtl コリジョン 中間ファイル .icol コリジョン ランタイムファイル .col PSD ファイル .psd テクスチャ 中間ファイル .itex テクスチャ ランタイムファイル .tex マテリアル ランタイムファイル .mtl

Slide 86

Slide 86 text

© 2017 Cygames, Inc. アセットシステムの要件 86 任意のバージョンのアセットを 高速に取得したい

Slide 87

Slide 87 text

© 2017 Cygames, Inc. アセットのバージョン管理の問題点 • ファイルサイズが大きい • ファイル数が多い – 更新処理に非常に時間がかかる • 依存が複雑 – 多数のファイルから依存されているファイルの更新が重い 87

Slide 88

Slide 88 text

© 2017 Cygames, Inc. アセットの運用の特徴 • 一部のアセットのみが必要 – 「ステージA」を開発している間は 「ステージB」のアセットは不要 – ファイルの読み込みリクエストがあったときに 初めてファイルを用意する 88

Slide 89

Slide 89 text

© 2017 Cygames, Inc. メタファイル • アセットの関係性の情報を保持 • 単一ディレクトリ以下にまとめる 89 中間 ファイル 実機用 ファイル アーカイブファイル メタファイル メタファイル メタファイル

Slide 90

Slide 90 text

© 2017 Cygames, Inc. バージョン管理 • 中間ファイルとメタファイルのみ バージョン管理 • 実機用ファイルとアーカイブファイルは 中間ファイルから生成する 90 中間 ファイル 実機用 ファイル アーカイブファイル メタファイル メタファイル メタファイル

Slide 91

Slide 91 text

© 2017 Cygames, Inc. アセットコンバートフロー 91 .imdl .mdl .arc .imtl .icol .col .itex .tex .mtl .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta 中間 実機用 アーカイブ

Slide 92

Slide 92 text

© 2017 Cygames, Inc. アセットコンバートフロー 92 .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta 中間 実機用 アーカイブ

Slide 93

Slide 93 text

© 2017 Cygames, Inc. アセットコンバートフロー • アーカイブファイルをリクエスト 93 .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta .arc リクエスト 中間 実機用 アーカイブ

Slide 94

Slide 94 text

© 2017 Cygames, Inc. アセットコンバートフロー • メタファイルの情報から 必要な実機用ファイルをリクエスト 94 .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta .arc .mdl .col .tex .mtl 中間 実機用 アーカイブ

Slide 95

Slide 95 text

© 2017 Cygames, Inc. アセットコンバートフロー • 更に必要な中間ファイルリクエスト 95 .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta .arc .mdl .col .tex .mtl .imdl .imtl .icol .itex 中間 実機用 アーカイブ

Slide 96

Slide 96 text

© 2017 Cygames, Inc. アセットコンバートフロー • 中間ファイルは VCS から取得 96 .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta .arc .mdl .col .tex .mtl .imdl .imtl .icol .itex 中間 実機用 アーカイブ

Slide 97

Slide 97 text

© 2017 Cygames, Inc. アセットコンバートフロー • コンバート処理 97 .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta .arc .imdl .imtl .icol .itex .mdl .col .tex .mtl 中間 実機用 アーカイブ

Slide 98

Slide 98 text

© 2017 Cygames, Inc. アセットコンバートフロー • コンバート処理 98 .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta .imdl .imtl .icol .itex .mdl .col .tex .mtl .arc 中間 実機用 アーカイブ

Slide 99

Slide 99 text

© 2017 Cygames, Inc. アセットエクスプローラー • メタファイルを扱う – メタファイルを実ファイルのように扱う • 実体がローカルにないファイルの表示可能 99 実体が存在しない ファイル

Slide 100

Slide 100 text

© 2017 Cygames, Inc. アセットキャッシュ • コンバート処理を毎回するのは重い • コンバート結果をキャッシュ – コンバート情報をハッシュ化した単純な key-value – ローカルキャッシュ – サーバーキャッシュ • キャッシュにヒットしなければ コンバート – 結果はローカル・サーバーに登録 100

Slide 101

Slide 101 text

© 2017 Cygames, Inc. アセットキャッシュ • アーカイブファイルをリクエスト 101 .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta .arc リクエスト 中間 実機用 アーカイブ

Slide 102

Slide 102 text

© 2017 Cygames, Inc. アセットキャッシュ • キャッシュを取得して完了 102 .imdl.meta .mdl.meta .arc.meta .mtl.meta .col.meta .tex.meta .imtl.meta .icol.meta .itex.meta ローカル キャッシュ サーバー キャッシュ .arc 中間 実機用 アーカイブ

Slide 103

Slide 103 text

© 2017 Cygames, Inc. アセットシステム • メタファイルを導入することで 任意のバージョンを高速に取得 • ローカル/サーバーキャッシュを用意することで 目的のファイルを高速に取得 103

Slide 104

Slide 104 text

© 2017 Cygames, Inc. アセットプレビュー 104

Slide 105

Slide 105 text

© 2017 Cygames, Inc. アセットプレビュー • DCC ツールから実機へのプレビューの高速化 – イテレーション速度に直結 105

Slide 106

Slide 106 text

© 2017 Cygames, Inc. アセットプレビューのデモ 106 デモムービー

Slide 107

Slide 107 text

© 2017 Cygames, Inc. 107

Slide 108

Slide 108 text

© 2017 Cygames, Inc. 中間ファイル • 専用バイナリフォーマット – 出力処理の高速化 – 読み込み処理の高速化 • プレビュー専用のモードを用意 – 表示に影響しない最適化を無効化 108

Slide 109

Slide 109 text

© 2017 Cygames, Inc. 専用フォーマット vs FBX • 100,000トライアングルのモデルの エクスポート + コンバート時間 [msec] 109 0 100 200 300 400 500 600 700 800 900 1000 専用フォーマット FBX x3.6 高速!

Slide 110

Slide 110 text

© 2017 Cygames, Inc. プレビュー専用モード • 100,000トライアングルのモデルの コンバート時間 [msec] 110 x3.1 高速! 0 50 100 150 200 250 300 350 プレビューモード 通常モード

Slide 111

Slide 111 text

© 2017 Cygames, Inc. まとめ 111 エンジン 開発者 ゲームプログラム 開発者 ゲームコンテンツ 開発者 モジュール化 テスト駆動開発 開発ツール ユーザーコード 開発効率の最適化 アセットシステム アセット プレビュー 開発言語の統一 コードの自動整形 ビルド時間の短縮

Slide 112

Slide 112 text

© 2017 Cygames, Inc. まとめ 112 Cyllista Game Engine は ゲーム開発者が 最高のパフォーマンスを発揮できることを 徹底的に追求しています!!!

Slide 113

Slide 113 text

© 2017 Cygames, Inc.