Your SlideShare is downloading. ×
Live2Dの描画の裏側の話
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Live2Dの描画の裏側の話

161
views

Published on

2015/03/25 GREE Tech Talk …

2015/03/25 GREE Tech Talk
Live2D SDK for Unity の内部技術についてのスライド。

Published in: Engineering

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
161
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • 発表に至った経緯
  • デスクトップマスコット!
  • 再現実験なので画像はUnity5
  • 実験結果に自信なし!
  • 宣伝1
  • 宣伝2
  • Transcript

    • 1. Live2Dの描画の 裏側の話 2015/03/25 GREE Tech Talk
    • 2. 自己紹介 • 株式会社 Live2D • 阿曽 直貴 • 広く浅く、ネイティブプラットフォームで書いてます • Unity、iOS、Android、Flash、3DS、Vita 作ったアプリ
    • 3. 自己紹介 (直近1ヶ月) • < 勉強会で発表しませんか? • Unityでゲーム作った経験とかはないしどうしよう • 「ドローコール」には苦労したし、テーマはドロー コール削減にしよう • 開催概要の発表 ドローコール伝説の終わり (20:40 ~)
    • 4. 今日お話する内容 • Live2D for Unity • ネイティブプラグインによる高速化 • スクリプトから高速にメッシュを描画する
    • 5. Live2Dの紹介
    • 6. Live2Dって? • イラストをそのまま動かす技術 Demo
    • 7. どんなところで使われてるの?
    • 8. どうやって使うの? • Live2D SDK for Unity • 無料で始められます • Live2Dスタッフブログにまとめました。 Live2D モデルデータ Live2D ライブラリ
    • 9. Unityの話に入る前に
    • 10. 技術的には3Dと何が違うのか • 基本的には3D技術の上に成り立っている • ポリゴンの描画 • 一般に3Dより描画は速いがメモリ消費は多め • 高機能なボーンのようなもの > デフォーマ • 行列ではない頂点変形がメイン • 半透明が重要 • クリッピングが大変
    • 11. 3Dとの違い1 • 頂点の形状変形が常にある
    • 12. 3Dとの違い2 • 半透明合成が重要
    • 13. 3Dとの違い3 • メッシュでリアルタイムクリッピングが必要 変形する 目からはみ出ないように マスクしたい * クリッピングは次期バージョンで対応
    • 14. 3Dとの違い4 • テクスチャのクオリティが必要 適当にPVRTC圧縮すると劣化する。 パーツの境界、半透明の部分で特に著しい 完全透明部分の色情報も必要
    • 15. それらを踏まえて • 3D技術の延長ではあるけど、3Dからするとマニ アックすぎて情報が少ない • 3D技術で再現できるけど、最適化されてないので 極端に遅かったりする • 具体的にUnity上で試行錯誤した話
    • 16. ネイティブプラグインに よる高速化
    • 17. 注意 • Unity 3.5とかの時代です • ネイティブプラグインとOpenGLについての話 • 現在とは状況が異なると思います
    • 18. Live2Dの当時の状況 • 約3年前 (2012年初旬) • Android,iOSのネイティブなライブラリはある (C++と Java) • パフォーマンスについてもすでに作りこんである • 実際Android2.2やiPhone3GSやPSPくらいでもちゃ んと動く
    • 19. Unityへの移植の検討 • C#? 速いの? • OpenGLもDirectXも使えない? 速いの? • ネイティブプラグインで今までの資産が動く ! • ネイティブのOpenGLが遅いはずがない !
    • 20. ネイティブプラグイン + OpenGL 描画終了 描画開始 描画に割り込み (C++) C#スクリプト C#スクリプト C#スクリプト
    • 21. 必要そうな情報を記憶しておく //Live2D描画する前に… //ステンシルテストの状態を記憶して、 last_stencilTest = glIsEnabled(GL_STENCIL_TEST) ; //デプステストの状態を記憶して、 last_depthTest = glIsEnabled(GL_DEPTH_TEST) ; //以下長々と同様の処理
    • 22. 元に戻す //描画をUnityに戻す前に… //ステンシルテストの状態を復元して、 if(last_stencilTest) glEnable(last_stencilTest) else glDisable(last_stencilTest) ; ...以下略 状態、バッファ、シェーダプログラム、テクスチャなど に対して思いつく限り復元する
    • 23. 結果 • 動いた! • 確かに速いように思える。 • 見かけのドローコールは1 (意味は無い)
    • 24. でも • プラットフォームごとに自分で書かないといけない • デバッグが非常に大変
    • 25. デバッグが大変 • Unityの管理外なのでプロファイラなどは使えない • OpenGLの状態を正しく復元しないといけない • Unityのバージョンアップで動かなくなる • 内部処理の影響を受けるのでそもそも情報公開さ れてない可能性有り
    • 26. ネイティブプラグインは自己責任 エラー! エラー! え? 自分のせいじゃないし... 描画終了 描画開始 Unityから不可視 C#スクリプト C#スクリプト C#スクリプト
    • 27. まとめ • 当時としてはチャレンジングなプラグインだった • 高速だけどメンテナンスが大変 • Android機種依存とかは自力対応しないと… • ネイティブによりすぎて、Unityの能力を活かしきれ なかった
    • 28. スクリプトから高速に メッシュを描画する
    • 29. 注意 • Unityでゲームを作ったわけではないので、制作の ほうはわかりません • GameObjectと関係なく、スクリプトからメッシュを描 画する方法について
    • 30. C#で書きなおすために調査
    • 31. Graphics.DrawMesh 公式リファレンスより Use DrawMesh in situations where you want to draw large amount of meshes, but don't want the overhead of creating and managing game objects. メッシュの数が多くても、ゲームオブジェクトの管理 が楽になる、ということらしい
    • 32. VisualStudioいわく
    • 33. Unity5の更新情報 http://japan.unity3d.com/unity/whats-new/unity-5.0
    • 34. Graphics.DrawMeshNow • UpdateじゃなくてOnPostRenderで呼ぶ • MaterialのPassの設定が必要 (普通は0) public Mesh mesh; public Material mat; public void OnPostRender() { // set first shader pass of the material mat.SetPass(0); // draw mesh at the origin Graphics.DrawMeshNow(mesh, Vector3.zero, Quaternion.identity); }
    • 35. 結果 テクスチャ1枚 マテリアル一つ パーツの数だけ ドローコールが増えてる
    • 36. ドローコールのための基本事項 • とにかく同じ描画設定で描く そのために • マテリアルは最小数にする • テクスチャもまとめて一枚にする
    • 37. メッシュは自分でまとめよう
    • 38. Mesh.CombineMeshes var combine = new CombineInstance[10]; for (int i = 0; i < combine.Length; i++){ combine[i].mesh =meshes[i]; } //このメッシュにすべての他のメッシュをまとめる mesh.CombineMeshes(combine);
    • 39. 結果2
    • 40. 本当に速くなったのか検証 Live2Dキャラクターを11体表示 ドローコール 800超 15FPS以下 ドローコール削減前
    • 41. 本当に速くなったのか検証 キャラクターを同じ数表示 ドローコール 12 30FPS以上 ドローコール削減後
    • 42. 正直思った以上に違う ただし、純粋な検証ではなく、あくまでLive2D上での比較です。 ドローコール 800以上 ドローコール 12回
    • 43. パフォーマンスのため のTips
    • 44. Tips1. テクスチャアトラス • テクスチャを一枚にまとめる • Live2D SDKは次期バージョン(2.1)で対応予定 • Live2Dエディタは対応しないのでアトラス化は別な ソフトで
    • 45. Tips2. GCの最適化 1キャラクター描画するときに毎フレーム約40KBメモリ確保していた
    • 46. Tips2. GCの最適化 • 40KB*60フレーム = 毎秒 2.4MB の消費 ! • Mesh.verticiesをやり取りするときにコピーが発生 • 配列はキャッシュしておく • newしてないつもりでも、どこかでメモリ確保されうる
    • 47. Tips3. Array.Reverseが遅かった 大量に使うと遅いことがわかったので、素直に自分で書いた 配列を反転するためにArray.Reverseを使っていた データ読み込み速度が20%くらいアップ
    • 48. Tips4 プロファイラに頼らない方法 お手軽に計測できるような簡易クラスを作っておくと便利
    • 49. まとめ • Live2D for Unityでどんなことをやっているか • 2Dだけど、レンダリング技術的には3D技術です • Unityでの開発は苦労したとはいえ、ネイティブ言 語での開発よりはだいぶ効率的でした
    • 50. ミドルウェアとして • Live2Dは現在5言語、10以上のプラットフォーム • 専門部隊がいるわけではない • 効率的にやらないといけない • 特定のプラットフォームに依存しないこと • 自力で多数のプラットフォームに対応すること • 普遍的な技術であるために
    • 51. Live2D Cubism 2.1 • クリッピングの対応 • 便利になったPSDインポート • 編集効率の向上
    • 52. Live2D Euclid http://www.live2d.com/news/euclid_development
    • 53. ありがとうございました