スマホゲームのプッシュ案

今回の主な話題：スマホゲームのプッシュ案、Unity UI特殊効果についてフロントエンドエンジニアとのコミュニケーション問題、ローエンドマシンでマルチスレッドレンダリングを有効にするかどうか、モバイル端末でRenderTextureメモリが大きくなる、自分で実現するTextストロークがDrawCall増加問題を引き起こす。

---
###Android
Q1：「クラッシュ・オブ・クラン」のようなゲームに対して、あなたの主要都市が他の誰かに襲われた場合、誰かがあなたを襲っているというプッシュ通知がスマアホに届きます。問題は、ゲームが強制終了されたということですが、なぜこの通知を受け取ることができるのですか？これはリアルタイムの通知であり、時間指定の通知ではありません。どうやってこれを実現できますか？

①
>
こんな正確なプッシュ時間はクライアントが計算できないため、サーバーに頼ります。以前AndroidでAuroraPushを使用したことがありますが、あまり悪くないです。iOSにはサーバープッシュソリューションが提供されています。大体の原理は、私たちのサーバーからお知らせをAppleのサーバーまたはAuroraPushのサーバーに送信し、次にプレーヤー達に送信します。


②
>
Tencentの伝書鳩も使えます。プッシュは一般的にサーバープッシュがとローカルプッシュに分かれます。このような要件について、ローカルプッシュを採用する方がよりいいで、iOSシステムにはこのようなプッシュサービスがサポートしていますが、Androidには対応するAPIはありません。サーバーを自分で起動し、システムプロセスにバインドして、プロセスが強制終了されないようにする必要があります。しかし、今の各大手メーカーが独自のシステムを開発しており、このステップを達成することは困難です。一部のメーカーのアプリはシステムのホワイトリストに含まれており、バックグラウンドプロセスが強制終了されることはありません。

---
###アセット管理
Q2: 私たちのゲームには、Animationとパーティクルを使って作成するUI特殊効果がたくさんありますが、これについてまだ１つの問題があります。パフォーマンス問題に注意しにくいで、私が一部の属性を変更すると、再びフレームを処理する必要があり、コミュニケーションコストが高いので、何か良い解決策ありませんか？

①
>
私のやり方は、アーティストが作成した特殊効果Prefabを直接使用することではなく、１つのツールを提供して新しいPrefabを生成します。
>
これの利点は、エクスポート時にテクスチャの数、パーティクルの数、アニメーションなどをチェックすることができます。事前にUIパーティクル特殊効果の標準を設定でき、エクスポート時にアセットが標準に合わないまた問題がある場合、エラーと表示してPrefabのエクスポートを却下します。これで、アーティストがSVNプログラムをアップロードできないため、問題のあるまたは効率に問題がある特殊効果に更新されません。
>
実際、このアイデアは特殊効果だけでなく、UIインターフェイス、キャラクター、シーンなどにも使用できます。Prefabが自動的に生成する時には、いくつかの追加ロジックを同時に生成することもできます。

②
>
私のやり方は前のひとの方法と似ています。インポーターを使用して標準化されたアセットを強制することはできません。毎日0時にパッカーが起動するとアセットスキャンアクションを開始し、標準に合わない内容をスキャンして、レポートを生成します。

③
>
自分がTimelineエディター（Unity、Unrealの公式も利用可能）を作成します。エディターでアーティストに関する操作範囲（例えば、単一パーティクル特殊効果を再生する時の数またはモデル、アニメーション、マテリアルなどのアセットの使用範囲。）を設定します。最終的に特殊効果データを生成する時に、アセットとデータの検査及びアセット整理を行い、アセットの冗長性や不規則性を回避します。
>
利点：
>
1.アセットとデータが分離されており、アセット間に結合がないため、すばやく変更および調整できます。
2.データは編集モードで共有でき、衝突にすばやく対処できる共同制作にも便利です。
3.テンプレート化された特殊効果により、開発効率が大幅に向上します。
>
2つの点に注意する必要があります。
>
1、FBXアセットの冗長性。Unityは、関連付けられたモデルとアニメーションリソースをFBXパスとしてデフォルト設定します。私が採用した方法は、使用されたアセットをFBXから抽出してAssetファイルに作成することです。（Unity自体もこれを行いますが、事前に行って手伝ってあげますだけです。パッケージスピードも向上ですます。）Timelineにあるアセット依頼を新生成するアセットに変換します。
2.エディター自体は、再生機能（特にパーティクル）を出来る限りに実現する必要があります。

---
###RenderTexture
Q3: RenderTexture AAを1に、depthを0に設定しました。PC端末のメモリサイズは正しいけど、モバイル端末では約３倍になりました。これはなぜですが？

①
>
3倍までは間違ったはずです。[UWA GOT Onlineサービス](https://blog.jp.uwa4d.com/2019/11/25/%e5%8a%b9%e7%8e%87%e7%9a%84%e3%81%aa%e9%96%8b%e7%99%ba%e5%bf%85%e5%8b%9d%e6%b3%95-uwa-got-online%e6%a9%9f%e8%83%bd%e7%b4%b9%e4%bb%8b/)を介して各RenderTextureの具体的なパラメーターをチェックし、解像度、形式、およびその他のパラメーターを確認することをお勧めします。

②
>
メモリの変化は解像度が原因である可能性があります。RenderTextureのサイズは解像度に従うので、PCでRenderTextureの解像度とスマホでRenderTextureの解像度を比較してみることができます。

---
###UI
Q4: 画像のように、私たちがプロジェクトのために自分でテキストストロークを実現しました。私がUnityバッチ処理の理解により、DrawCallは２つあるはずですが、実際には4つあります。TextShaderOutlineのModifyMesh関数にあるSetUIVertex方法がバッチ処理の失敗を引き起こしたと推測されます。そうだった場合、原理はなぜですか？何か良い解決策ありませんか？
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/4112770b-6be4-04e3-9b24-7b066d0091dd.png)
機能URL：[TextureShaderOutline.rar](http://t.cn/Eay1a1D)

私のUnityバージュンは少し古いので、このプロジェクトを開くと乱雑になります。表示に問題があるように感じます。赤い字を左右にドラッグすると、色が変わります。これは非常に奇妙です。
>
ブログにある元方案を使って、このような重ね合わせ状況ではバッチ処理ができます。（条件はShaderが同じであり、カラーが違って、２つのShaderになります。）
>
そして、Unity 2018に対して、方案を調整しました。
>
Unity 2018は、UV2とUV3を伝えられ、そしてtangent.zw normal.zもなんとか使用できます。ですから、UV1とUV2を使って、最も原始的なUV範囲を保存し、UV3とtangent.zwを使ってoutlinecolorを伝え、normal.zでoutlineborderを伝えます。これでカラーと幅変化はShaderを変更する必要がなく、バッチ処理できます。（z軸方向はズームできず、UIとそれが配置されているキャンバスはフラットである必要があることに注意してください。そうしないと、tangent.zとnormal.zの送信が不正確になります。）

問題主からの補充：
>
ModifyMesh方法にあるpositionを削除してアップロードすると、バッチ処理出来るになりました。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com