iOSでAssetBundleをエクスポートするには30時間かかる

1）iOSでAssetBundleをエクスポートするには30時間かかる

2）Unityメインプロセスがナレッジツリーを構築する方法

3）TMPでCullTransparentを設定すると、Alphaが0であるTextをCullingにすることはできない

4）Spineアニメーションスタンプは線形空間に黒い境界線が表示される

5）Spineが多すぎると、Updateのパフォーマンスが大幅に低下する

---

## AssetBundle

 

**Q：現在、ゲームアセットは約870MB（すべてのAssetBundleはAndroidプラットフォームからエクスポートされます）で、Windows（i5-7500 CPU @ 3.40GHz、GTX1050、16GBメモリ、SSDハードディスク）でAndroidアセットの全量をエクスポートするには約2時間かかります。i9では約1時間かかります。6年前のi3ではほぼ4時間かかります。**

 

**同じエクスポートコードで、Mac Mini（2018、i5 @ 3GHz、Intel630、16GB DDR4メモリ、SSDハードドライブ）で約38時間かかります。Macbook Pro（2018、i9 @ 2.9GHz、Redeon560X 4G、16GB DDR4メモリ、SSDハードディスク）、）でも30時間かかります。これはPVRTCの問題だと考え、すべてのアセットをASTCに再エクスポートしても全然改善されていません。問題はどこにあるのか？**

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/367debb4-8ad3-94b3-110d-574227a1a16a.png)




>A：次のリンクを確認してください。
https://forum.unity.com/threads/case-1192489-building-asset-bundles-decompresses-textures.742757/
簡単に言えば、-nographicsパラメーターパッケージを追加します。
問題主がテストしたところ、Mac Pro i9にエクスポートしては40分以内かかります。


---


## Unity

**Q：MMORPGゲームの場合、Unityメインプロセスはどのような知識ツリーを構築しますか？**



>A1：この質問は複雑なので、あえて答えません。海外内には先輩さんがたくさんいます。メインプログラムには、知識システムを除いて、管理システム、プログラム分析、人件費管理、運営および製品管理システムもあります。知識ツリーなら、Milo Yipの知識ツリーツリー+御三家（Unreal、Unity、Frost）のいずれのエンジンソースコードの完読をお勧めします：https://cloud.tencent.com/developer/article/1005446



>A2：この質問は非常に広範で、MMORPGに絞り込んでも多くのことが含まれています。Miloのスタンプは基本的にコアテクノロジーの内容をカバーし、A1は非常によい答えでした。そして、【UWAアカデミー】に起業時に行った経営についての記事があります。興味のある方は[「起業家チームの技術経営」(中国語注意)](https://edu.uwa4d.com/course-intro/0/80)をご覧ください。
MMORPGゲームのメインプロセスで習得する必要があると思われる技術コンテンツの一部を共有します。
**1.プログラミング言語**
これは理解しやすく、プログラムの基本です。
よく使用される静的言語：C ++、C＃、Go
よく使用される動的言語：Lua、Python
通常、ゲーム開発には複数の言語が必要なため、プログラミングの概念とスキルを組み合わせる必要もあります。
これらの各言語の文法と機能を理解する必要があり、一般的にメモリ管理と関わっています。
**2.プログラミング仕様**
言うまでもなく、メインプロセスとして、チームのプログラミング仕様を策定する必要があります。また、仕様をより適切に実行および保証するには、LuaCheckなどの静的テストツールを使用する必要があります。
**3.プログラミングパラダイム**
これは2つの部分で構成されていると思います。1つはGamePlayフレームワークの構築です。従来のEntity継承、コンポーネント化、ECSの三つは従来のものです。もう1つはデザインパターンとそのアプリケーションです。
**4.データ構造とアルゴリズム、および3次元数学**
デフォルトは3Dゲームですが、この部分の基本知識は必要です。
**5.ゲームエンジン**
クライアントやサーバーなど、使い慣れたマスターのゲームエンジンが必要と思います。
GamePlayの基本
前述のプログラミングパラダイムに加えて、GamePlayにはさらに多くのことがあります。
3C
ゲームの状態管理
一般的なスキル構造など。
**7.物理システム**
衝突検出、プレーヤーコントロール、車両システム、ラグドール、ソフトボディエフェクトの設計方法。
**8.アニメーションシステム**
スケルタルアニメーションの原則、スキニングの基本概念、モーションフュージョン、Rootmotion、アニメーションのリターゲティング、キャラクターモデル、アニメーション制作仕様など。
**9.特殊効果システム**
**10.レンダリング**
基本的なレンダリングパイプラインを理解する
PBRに精通する
非現実的なレンダリングを理解する
さまざまな後処理効果
**11.オーディオテクノロジー**
FMOD、Wwise、およびエンジンのプリインストールオーディオ機能の使用
材質の音響効果の区別、P1/P3の区別
ミックスや残響などの機能のサポート
**12.ビッグワールドシーンの制作と管理のプロセス**
MMORPGの場合、ビッグワールドの制作技術が必要となります。World MashineやHoudiniなどのPCGをベースにした生産パイプラインの構築方法、シーンの同時編集のサポート方法、ビッグワールドでのシーンアセットのロードとアンロード、および超長距離視線の影を実現する方法、昼と夜の気象システム、HLODなどの技術が必要になるかもしれません。
**13.パフォーマンスの最適化**
従来のパフォーマンス最適化方法、および継続的に監視してパフォーマンスの問題を特定して解決策を見つけます。CPU、GPU、帯域幅、メモリ、ディスク容量などが含まれます。
**14.ゲーム更新メカニズム**
クライアントPatchシステム
サーバーのHot Update
クライアントコードのHotfix
**15.ネットワーク**
通信プロトコルの定義方法
ネットワークトラフィックを最適化する
弱いネットワークの下でゲームのパフォーマンスを最適化する
暗号化
ネットワークトラフィックの制限
**16.サーバーメモリ**
MySQLやMongoなどの従来のデータベースの使用
**17.ゲームAI**
クライアント側またはサーバー側にある可能性があり、便利な編集機能を提供する必要がある
ディープラーニングに基づくAIソリューション
**18.サーバーの安定性とセキュリティ**
並行性の安全性
プロセス監視
一般的な操作とメンテナンスの知識
負荷分散
**19.従来のサーバーテクノロジー**
AOI管理
サーバー物理
ボクセル
同期スキーム
**20.IDEおよびデバッグツール**
VSCodeやVisualStudioなどの一般的に使用されるIDEと、対応する開発モードの対応するデバッグツール。
**21.バージョン管理ソフトウェア**
**22.エディター開発**
少し面倒で、技術的な内容自体が非常に複雑です。分割し続けると非常に細かくなります。たとえば、3Cでは、ホストレベルのエクスペリエンスを実現する方法は、1人で完全に理解できるものではありません。
もちろん、私がリストした技術的なポイント以上のものが確かにあります、ゲームタイプに関連する他の多くの技術的な内容があります。
MMORPGプロジェクトのメインプロセスでは、上記の技術内容のうち、80％以上を理解することが合格だと言えます。もちろん、誰もが独自の専門分野を持っています。十分な学習能力があり、適切な人材を見つけることができれば、技術的な内容を学び、補うことができます。メインプロセス自体がプロジェクトの技術的な問題の根底にあり、技術的な解決策を決定することであるというだけなので、技術的な幅には依然として高い要件があります。
私自身の経験は次のとおりです。メインプロジェクトの仕事では、一日中コミュニケーションと会議だらけで、30％〜40％のコード時間があれば有難いです。したがって、メインプロセスの観点からは、「もの」だけでなく「人」も必要がとなります。チームの活力を維持すること、チームの戦闘力を刺激することなどは、テクノロジーの以外に考える必要がある問題です。



>A3：とても勉強になりました。Respect！！！ここにもう少しの補足をさせて頂きます。参考になれば嬉しいです。
**1.技術面**
まず、ソフトウェア開発とコンピューター関連の基本的な知識を持った高級Unity開発者や熟練者が必要となります。
Unityに精通し、モジュールの使用や基本原則をある程度理解する必要があります。例えば、アクション、特殊効果、GUI、Avatar、シーン、Timeline、アセット管理など。
特定のMMO開発経験があり、シーン、プレーン、ブランチライン、AOI、属性同期、AI、Entity、スキル、Buff、ボクセルなど、MMOゲームの一般的な概念と実装スキームを理解しています。
一般的なパフォーマンス最適化ツールと最適化ソリューションについて知っています。
技術的ビジョンを継続的に拡大することは、技術的ソリューションの選択と意思決定に役立ちます。
**2.管理面**
ランディングコード仕様を策定し、どのようなコード仕様が適切な仕様であり、プロジェクト仕様に適しているかを理解します。
ランディングアセットの仕様を策定し、プロジェクトのニーズとパフォーマンス予算に応じてアーティストに認められるアセット仕様を策定し、プロセスとツールを提供してランディングを支援します。
開発プロセスを策定し、継続的に最適化して、出力効率を向上させます。
技術的な側面はたくさんありますが、結局のところ、人のエネルギーは限られており、すべてをカバーすることは困難です。したがって、人を採用し、人を知り、人を雇用し、適切な人を見つけることも非常に重要です。
技術職から昇進した場合は、基本的な管理知識を知ることも必要となります。
**3.製品面**
融通のきかない要件ではありませんが、プロジェクトと同じ種類の競合ゲームを、ある程度体験することをお勧めします。
ゲームの一般的なゲームプレイについて理解します。
ゲームのさまざまなレベルのプレーヤーの気持ちを体験し、彼らのニーズを理解します。
このタイプのゲームの技術的な突破点を考えます。
このようにして、プランナーと製品要件や最適化計画について相談するのは、合意に達することがより簡単になり、はるかに効率的になります。
たとえば、問題主がおっしゃったMMORPGについては、現在『天涯明月刀』、『天諭 Revelation(レボリューション) 』、『倩女幽魂』と『一夢江湖』などをすべて体験することができます。
最後に、良い態度も非常に重要だと思います。プロジェクトの開発中は、困難、挫折、さらには失敗さえあります。これらの状況に遭遇したときは、前向きな姿勢を維持すると同時に、チームメンバーにポジティブな影響を与えて、全員に自信を与え、より良い結果の達成に導きます。


---
## UGUI

 

**Q：Unity 2020では、CanvasRendererでCullTransparentMeshプロパティを設定すると、Alphaが0の要素がメッシュを描画できないようにすることができますが、TMPはそれをできないのはなぜですか？**

 

**UGUIのソースコードとTextMeshProのソースコードを確認したところ、メッシュが設定されていて、どれも空ではないことがわかりました。**

**UGUIでは、canvasRenderer.SetMesh（workerMesh）;**
**TMPでは、m_canvasRenderer.SetMesh(m_mesh) で;**
**しかし**
**CanvasRendererのソースコードは
public extern bool cullTransparentMesh { [MethodImpl(MethodImplOptions.InternalCall)] get; [MethodImpl(MethodImplOptions.InternalCall)] set; }
のように表示されています。**

**TMP要素が透明な場合、Textのようにメッシュをカリングするにはどうすればよいですか？**



>A：TMPメッシュに未使用の頂点の色が0ではありません。つまり、[Color]設定の[Alpha]で未使用の頂点を設定できないため、下位階層に描画されたMeshに色が0でない頂点があり、削除できなくなります。さらに、頂点情報をクリアできないため、TMPに100文字と400頂点情報が含まれていることになります。一文字に再割り当てすると、相変わらず400頂点情報のままで、396頂点は描画に使用されないにすぎません。要するに、TMPは慎重に使用し、ソースコードを変更するか、公式の修正を待ちます。


---
## Spine

 

**Q：Unityのバージョンは2017.4.3f1で、Gamma空間の下のSpineアニメーションに問題はありません。現在、Linear空間の下になると、Spineアニメーションにおける小さな継ぎ目には黒い境界線がたくさんあります。下図の鼻のように、Spineに鼻は顔に取り付けられて小さな画像ですが。Linearにはぼやけた黒い境界線が表示されます。これは、周囲のAlpha値の影響を受けると予想されます。ノーズスタンプですが、具体的な理由はまだ不明です。しかし、両方ともガンマ空間の下で正しいです。**

 

**Gammaスペースの下の写真では、鼻は正常です。**
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/fc6f7f73-4ac0-2ee2-5827-792b8d5945e0.png)


**線形空間の下には、鼻の周りに黒い境界線があります。**
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/98079a3b-28d4-ecb8-d269-a98c4f8bed68.png)


 

**比較のために、2つのより明確な部分画像を次に示します。**
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/c2ccc82b-022f-3663-d84b-43e2832f8464.png)

 



>A：まず、Spineは事前乗算Alphaをオフにして再エクスポートします。
次に、ShaderはStraight Alpha Textureを選択しました。
次の情報を参照してください：http://zh.esotericsoftware.com/forum/Spine-JSON-12274?p=54752#p54752


---
## Spine

 

**Q：Spineの数が多すぎるため、Updateのパフォーマンスが大幅に低下します。次の図に示すように、SkeletonAimation.Updateに時間がかかりすぎます。効果的な解決策はありますか？**
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/2c7ee8cc-a0f3-ec19-bfe6-c911d5f224d0.png)





>A1：GPUに移動します。



>A2：以下を参照してください。
Spineが多いのはフリーズを意味するわけではありません。主に頂点の数と関連しています。
UnityにはC＃コードもあります。この関数によったフリーズはよく見られます。実に、Spineがクリッピングを行うときのマスクの頂点が多すぎるため、最適化をSpineアニメーターに任せます。
要約すると、マスクされるべきではない頂点はカバーされるべきではなく、頂点の数は可能な限り少なくなければなりません。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/24050bb9-2bb8-95e7-2cd5-2c199a06f2e7.png)



---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

今なら、UWA GOTローカルツールが**15日間に無償試用**できます！！
よければ、ぜひ！

UWA公式サイト：https://jp.uwa4d.com
UWA GOT OnlineレポートDemo：https://jp.uwa4d.com/u/got/demo.html
UWA公式ブログ：https://blog.jp.uwa4d.com