ゴイサギ日記

東京でエンジニアとして頑張って何とか生きてます。。ゆる~く更新していきます

【Kubernetes】全体像を知る

前回に引き続き、Kubernetesです。

Kubernetesの登場人物

こちらの動画がとても分かりやすかったのでこちらを元に登場人物をまとめました。高良さん、本当にありがとうございます・・(TAT)
www.youtube.com

コンテナ

アプリケーションと実行環境がセットになったもの、まとまっているので環境ごとの展開が容易になる
f:id:aki517:20200617121300p:plain

ポッド

1つ以上のコンテナとそれらの共有リソースを指す、固有のIPアドレスを持ち、ワーカーノード上で動作する
f:id:aki517:20200617121320p:plain

ワーカーノード

VMまたは物理マシン、マスターノードの指示を受けて複数のポッドを管理する
f:id:aki517:20200617121337p:plain

マスターノード

ワーカーノードに不具合があった際に、他のワーカーノードへ処理の振り分けを行う等して複数のワーカーノードを管理する
f:id:aki517:20200617121357p:plain

クラスタ

ノードのグループを指す、マスターノード + 1つ以上のワーカーノードで構成される
f:id:aki517:20200617121731p:plain

指示書(Manifest)

ノードやポッドの増減、振り分けによる負荷分散などの設定が書かれたもの、YAMLJSONで書く
f:id:aki517:20200617121428p:plain

司令官

指示書を書いて、それをコマンドとして実行する人、つまり開発者
f:id:aki517:20200617122003p:plain

全体構成

ここまでの全体構成はこんな感じです。
f:id:aki517:20200617122043p:plain

コントローラ

マスターノード内にあり、ポッドのスケール(増減)、サービス停止なしのポッド交換などを自動実行する機能たち
f:id:aki517:20200617204102p:plain

Service

ユーザ(インターネット)からの要求に対して適切なノード・ポッドへ処理を振り分ける役割を担う
f:id:aki517:20200617204115p:plain

Ingress

ユーザとServiceの間に立って適切なServiceへの振り分けを担う、パスベースロードバランス等
f:id:aki517:20200618220054p:plain

ReplicaSet

設定したポッド数を作成する、ポッドに不具合を検知して速やかに新しいポッドを作成して、常に設定したポッド数を維持しようとする
f:id:aki517:20200617204111p:plain

Deployment

ReplicaSetの管理を行う、ローリングアップデートと呼ばれる方法でポッドのスケールアップ/ダウンをほぼサービス停止なしで行う
f:id:aki517:20200617204105p:plain

まとめ

今回はKubernetesの登場人物とコントローラについて書きました。この他にも素晴らしい機能が沢山あるのですが書き出したら切りが無い・・

概念だけではなく実際に操作してみたいという方はこちらの「Katacoda」というサイトではハンズオンでKubernetesを学習することが出来ます。アカウント登録が必要ですが、Dockerの学習もできるので登録しておいて損はないです。(2020/6/20時点)
www.katacoda.com

ちなみにマネージド版Kubernetesはこちらのサイトでパブリッククラウド御三家の比較について説明がしてあって面白い
g3-enterprise.com

参考

Podとノードについて | Kubernetes
コントローラー | Kubernetes

【Kubernetes】Kubernetes とは?

f:id:aki517:20200427212811p:plain

私はインフラのことはサッパリなんですが、仕事で Kubernetes(クバネイテイス) なるものに向き合う必要があったので色々と調べた結果をまとめました。いや本当にサーバ/インフラエンジニアの皆さん凄いですね・・

Kubernetes とは

こちらの公式ドキュメントには

Kubernetesは、宣言的な構成管理と自動化を促進し、コンテナ化されたワークロードやサービスを管理するための、ポータブルで拡張性のあるオープンソースプラットホームです。」

(・_・) ・・・

はい、全然わかりません。

というわけで社内の詳しいエンジニアさんに話を聞いたらインフラの歴史含めてで色々と教えてくれました。本当にありがとうございました。

物理サーバの時代

90年代頃はWindows OSの登場などもあり、PCがどんどん普及したのもあり、安く手に入れやすい時代だったので、企業が用途に応じたサーバを何台も持ってWebサービスを運用するスタイルでした。社内やデータセンターとかに設置してました。

f:id:aki517:20200426115748p:plain

ところがこの方法はサービスが大きくなると物理マシンの台数が増え、設置場所や電気代など維持費への影響がとても大きかったのです。また、1つのマシンに1つのアプリケーションが稼働するような構成になるためCPUリソースを十分に使い切れない問題もありました。

f:id:aki517:20200426121352p:plain

仮想サーバの時代

2000年代に入ってから、これらの維持費の問題を解決するために1台の物理マシンに複数の仮想化したマシンを割り当ててアプリケーションを動かす仮想サーバが一般的になってました。Hyper-V型とか言います。こうすることで必要な台数を減らし維持費を抑えれるようになりました。

f:id:aki517:20200426123917p:plain

また、後にこれらをまとめてクラウド上に配置しサービスとして提供する AWS, GCP, Azure, なども出てきました。これによって開発者は物理マシンを自分たちで調達する必要もなくなり、ネット環境とPC1台でWebサービスなどを組めるようになりました。ちなみに自社内で物理サーバを立てて情報サービスを自社内のハードとソフトで運用する方式を「オンプレミス」と言います。

f:id:aki517:20200426140747p:plain

ただ、仮想サーバ単位でOSや環境設定が載るためメモリを多く消費したりパフォーマンスに影響が出ていました。

f:id:aki517:20200426214611p:plain

コンテナ仮想化の時代

そこで登場したのがコンテナです。これは1つのOS上に隔離されたアプリケーションの実行環境を幾つも作るコンテナ仮想化(または単にコンテナ)というのものです。これにより複数OSが共存する状態は無くなり、メモリ効率やパフォーマンスの改善が行えるようになりました。

f:id:aki517:20200426214623p:plain

このコンテナを管理するソフトウェアで有名なのが Docker です。Docker はコンテナ起動に必要なデータセットDockerイメージというものにしてアプリケーションの実行環境の構築を容易にしてくれます。

f:id:aki517:20200426195356p:plain

Dockerイメージはインストーラみたいなものなので、開発メンバーに配布してDockerのコマンドを実行してもらうだけで全員がほぼ同一の環境になるという部分もメリットです。要するに「俺のPCでは動くのに!」という良くある問題を解決してくれます。

f:id:aki517:20200426225941p:plain

Kubernetes登場

巨大なサービスだと複数サーバと、そのサーバに構築されているコンテナ環境を管理する必要が出てきます。例えば以下のような対応です。

・任意のコンテナを複数サーバに同時展開
・負荷が上がるのを想定してサーバ台数を増やす
・負荷が下がった時にサーバ台数を減らす
・異なるサーバでのコンテナ通信を行う

Dockerだけではこの問題を解決することは難しいです。エンジニアが手動で管理するのも大変ですよね・・

これらの問題を解決するのが Kubernetes です! やっと登場、長かった・・・

そして今回はここまでになります。。 というのも、このkubernetes、登場人物が物凄く多いんです!
クラスター, ノード, ポッド, サービス, etc...

次回こそは Kubernets について書いていきたいです。(^_^;

↓続きです。
【Kubernetes】全体像を知る - ゴイサギ日記

Study At Home

コロナの影響で様々なイベントが延期・中止になっていますね。。ゲーム開発者向けのイベントも同様にです。幾つかはオンライン配信などで提供されており、中には一定期間ですが無料で閲覧できるものもあるのでまとめてみました。

GDC 2020 Virtual Talks

言わずと知れた、世界最大のゲーム開発者イベント GDC 2020 でお披露目予定だった幾つかのセッションやアワードを GDC Vault や Twitch 上で配信してます。

www.gdconf.com

Unite Now

UnityがGDCなどのイベントで発表する予定だった内容などをオンラインで配信しています。

www.unity.com

Game Stack Live

MicrosoftGDC 2020 で披露する予定だった内容などをオンラインで配信しています。

developer.microsoft.com

Microsoft DirectX 12 and Graphics Education

Virtual DirectX Developer Day で配信された DirectX12関連のチュートリアル動画がまとまっています。

www.youtube.com

ACM Digital Library

世界最大のCGカンファレンス SIGGRAPH を主催する ACM(Association for Computing Machinery)が運営しているサイト「ACM Digital Library」内の資料が 2020年6月30日まで無料でダウンロードできます。

www.acm.org

その他

タイトルの「Study At Home」は SONYの「Play At Home」をパクリました。^_^;
なんと、2020年4月16日から2020年5月6日のみ アンチャーテッドコレクション」と「風ノ旅ビト」が無料でダウンロードできます!私は即ダウンロードしてアンチャは3作品ともクリアしました。やっぱりNaughtyDogのゲームは面白い! www.playstation.com

【Unity】AnimationClipPlayableでLegacyなアニメーションを再生する

大昔にAssetStoreから購入したアセットのアニメーションをAnimationClipPlayableで動かそうとしたところ、Legacyなアニメーションは動かせないよと怒られたので、何とか対応したお話。需要あるのかなこれ・・・

概要

f:id:aki517:20200325064601p:plain

上図のように Import Settings > Rigタグ にある Animation Type が Legacy のアニメーションデータを AnimationClipPlayable.Create() で設定すると以下のエラーが出て再生することができない。

ArgumentException: Legacy clips cannot be used in Playables.
対処1:AnimationType を Humanoid にする

Legacyをサポートしないと言ってるのでそれ以外に変えれば良いだけなので Animation Type は「Humanoid」を選択、Avatar Definitionを「Create From This Model」を選択後、Apply をクリックして Avatar を作成します。
f:id:aki517:20200325071528p:plain

ただ、私が確認したアニメーションデータのリグは 3DXMax Biped を使って組まれており以下のようなエラーが出てアニメーションが部分的にしか適用されませんでした・・
f:id:aki517:20200325071600p:plain

こんな感じにスカートしか動かないです。。
f:id:aki517:20200325075612g:plain

対処2:AnimationType を Generic にする

対処1が失敗する、またはモデルが人型ではない場合は AnimationType を「Generic」にすると上手くいくことがあります。私のデータはこれで解決しました。あと Avatarが必要無い場合は Avatar Definition を 「No Avatar」にしておくと良いです。
f:id:aki517:20200325071511p:plain

対処3:InspectorのDebugモードから変更する

これはオススメしないのですが、以下のような対処方法もあります。
1. 対象のFBX内のアニメーションデータをコピーして別animファイルとして出力
2. InspectorビューをDebugモードにする
3. 下図のLegacy という項目のチェックを外す
f:id:aki517:20200325071442p:plain

まとめ

個人的には 対処1 か 対処2 が良いなと思いました。どちらも一度作成したAvatarを使えば同じ構成のアニメーションデータに対して以降は下図のように「Copy From Other Avatar」を選択 > 作成したAvatarを適用すれば都度Avatarを作成する必要がないためです。
f:id:aki517:20200325075958p:plain

あとそもそも古いアニメーションデータを使うなよという話ですね ^ ^;
以上、誰に需要があるんだという内容でした。

【Unity】自作Package を Unity Package Manager と連携させる

今回は自作Package を Unity Package Manager (upm) に対応させる方法をまとめました。

Packageを作成
  • まずはPackageフォルダを作成します。今回はPackage名を「test-upm」とします。
    f:id:aki517:20200126213842p:plain

  • Packageフォルダ直下に package.json を作成します。
    f:id:aki517:20200126213925p:plain

  • 必須項目は name, version のみです。他項目の詳細はこちら

{
    "name": "jp.goisagi.test-upm",
    "displayName": "test-upm",
    "version": "0.0.1",
    "unity": "2019.3",
    "description": "Description for this package."
}
  • 次に検証用Unityプロジェクトを作ります。
    今回は名前を「test-proj」として、Packageと同じ階層に配置します。
    f:id:aki517:20200127083119p:plain

  • test-proj > Packages > manifest.json に自作PackageのPackage名とパスを追加します。
    パスは Packagesフォルダからの相対パスになります。

  "dependencies": {
    "jp.goisagi.test-upm": "file:../../test-upm"
  }
  • 検証用Unityプロジェクトを起動すると自作Packageの読込が行われます。
    以下のようにPackageが追加されていればOKです。
    f:id:aki517:20200127212002p:plain

  • 念のため、Package Manager に追加されているかも確認します。

  • 次にスクリプト配置用のフォルダを作成します。フォルダ構成はUnity標準のPackageに合わせて Scripts > Runtime で作成します。
    f:id:aki517:20200127212626p:plain

  • Assembly Definition File を追加します。ProjectビューからRuntimeフォルダを右クリック > Create > Assembly Definition で asmfファイルを作成します。
    f:id:aki517:20200127212821p:plain

  • 次にPackage用のcsファイルを作成します。
    f:id:aki517:20200127212932p:plain

  • 最後にcsファイルをInspectorビューから確認して Assembly Information に先程のasmfファイルが設定されてるのを確認します。
    f:id:aki517:20200127213932p:plain

  • Package作成の大まかな流れは以上となります。他のUnityプロジェクトにインポートしたい場合は同様に対象UnityプロジェクトのPackages/manifest.json に自作Packageのパスを設定するだけです。

GitHub連携

自作PackageをGitHubと連携する方法です。

GitHubに登録

これは対象Package を任意のリポジトリにpushするだけです。今回の場合は「test-upm」以下が対象となります。

また、バージョンに応じてインポートをしたい場合は以下のようにタグを追加しておきます。

git tag 1.0.3
git push --tags
GitHubからインポート

インポートは対象Unityプロジェクトの Packages/manifest.jsonGitHubのURLを記述するだけです。

  "dependencies": {
    "jp.goisagi.test-upm": "https://github.com/aki517/test-upm.git"
  }

バージョンを指定する場合は以下になります。

  "dependencies": {
    "jp.goisagi.test-upm": "https://github.com/aki517/test-upm.git#0.0.1"
  }
サンプルの追加

Unity2019.1以降からサンプルの追加が可能になりました。

  • サンプルを配置するルートフォルダを作成します。
    必ず末尾に「~」を付けてください。 f:id:aki517:20200127221720p:plain

  • 次に各サンプルのフォルダを作成して、サンプル用のスクリプト、シーンを置きます。
    f:id:aki517:20200127221738p:plain

  • package.json に以下のようにサンプル設定を追加します。(サンプルは複数設定可能です)

{
    "samples": [
        {
            "displayName": "Sample1",
            "description": "Description for sample 1",
            "path": "Samples~/Sample1"
        },
        {
            "displayName": "Sample2",
            "description": "Description for sample 2",
            "path": "Samples~/Sample2"
        }
    ]
}
  • Package Manager に「Import into Project」ボタンが追加されていればOKです。 f:id:aki517:20200127222457p:plain

  • サンプルをインポートすると Assets 以下に配置されます。バージョン分けしてくれるのは便利ですね ^_^
    f:id:aki517:20200127222515p:plain

依存関係について

自作Packageをインポート時に依存するPackageも一緒にインポートすることできます。

設定は package.jsondependencies を追加して、関係するPackageとバージョンを記述します。

{
    "name": "jp.goisagi.test-upm",
    "displayName": "test-upm",
    "version": "0.0.1",
    "unity": "2019.3",
    "description": "Description for this package."
    "dependencies": {
        "com.unity.textmeshpro": "2.0.0"
    }
}

ただし、こちらはUnity標準で公開されているPackageのみです。現時点では自作Packageを依存関係に設定できないようです。。フォーラムにも上がってます。

一般的な解決策は自前のUnity Package Serverを立て、自作Packageを追加・公開になります。
medium.com

もしくはこちらのPackageをインストールすれば自作Packageの依存関係をある程度は解決できますが、依存関係を解決するアルゴリズムがUnity標準の機能とは異なるため目的のPackageがインストールされない場合があるのと、都度このPackageをUnityプロジェクトにインポートする必要があります ^_^;
github.com

おまけ

ローカルの自作Packageを組込み先の Visual Studio プロジェクトで編集したい場合、 Unity > Preferences > External Tools にある Local packages にチェックを入れます。
f:id:aki517:20210214211706p:plain

参考

Unity - Manual: Creating custom packages
UPM: How to make a custom package · GitHub
Samples in Packages - Manual Setup - Unity Forum

【Unity】テクスチャの設定について

今回はテクスチャの設定における注意点などをまとめてみました。ゲーム内リソースでテクスチャの占める割合は多く、開発初期にテクスチャの仕様を決めておかないと後半でメモリ不足に苦しむこともありえます。というかあります。

適切なサイズにする

例えば画面がHD(1280 x 720)なのにフルHD(1920 x 1080)を基準にテクスチャサイズを決めるのは余計にメモリを消費するだけです。最終的に出力される画面に合わせてサイズを決めましょう。

また、サイズは2のべき乗(128x128, 256x256, 128 x 256)になるようにしましょう。この辺について説明をすると長くなるので仕様と割り切ってください ^_^;

圧縮フォーマットを設定する

圧縮フォーマットを設定する事で更にメモリ消費を抑える事もできます。ただし、こちらは見た目が汚くなったり、端末やOSによってサポートされる圧縮フォーマットが異なるので注意が必要です。

以下、Unityでテクスチャの圧縮フォーマットを設定する方法です。

  • Projectビューから対象テクスチャを選択
  • Inspectorビュー から各OSのアイコンをクリック
  • Override for iOS/Android にチェックを入れる
  • Format のプルダウンから圧縮フォーマットを選択
  • Apply」ボタンをクリック

f:id:aki517:20191116104103g:plain

iOS

iPhone6以降(CPUがA8以降)かで以下のように分かれます。

iPhone6以降 iPhone6以前
・RGB(A) Compressed ASTC ・RGB Compressed PVRTC 4bits
・RGBA Compressed PVRTC 4bits
テクスチャサイズを正方形にする必要あり
Android

Android端末がOpenGLES3.0以降をサポートかで以下のように分かれます。

OpenGLES3.0以降 それ以外
・RGBA Compressed ETC2 8bits
・RGB Compressed ETC2 4bits
・RGB Compressed ETC 4bit
・RGBA 16bit

Override ETC2 fallback
こちらは 対象のAndroid端末が上記のETC2圧縮が未サポートの場合、どのフォーマットを指定するかというものになります。

タイプ 説明
Use build settings BuildSettingsの設定を参照します。
f:id:aki517:20191129082653p:plain
32bit 32bitカラーです。フルカラーなので品質は良くなりますがメモリを多く消費します。
16bit 16bitカラーです。32bitよりメモリ消費を抑えれますが色数が減るので下図のグラデーション破綻が起こりやすいです。
f:id:aki517:20191130100631p:plain
32bit half resolustion 32bitカラーで解像度が半分になります。メモリ消費を抑えれますが解像度が落ちているのでボヤけた見た目になります。
Atlasにする

バラバラのテクスチャを描画するのはパフォーマンス上好ましくないです。(理由はこちら)

そのためUIなどの2D表示物はテクスチャの枚数が多くなるものは可能な限り1枚のテクスチャにまとめると良いです。このまとめたテクスチャを Texture Atlas または Atlas と言います。

Atlasの作り方はこちらのサイトで分かりやすく説明してます。
kan-kikuchi.hatenablog.com

MipMap

段階的に小さくしたテクスチャを複数保持し、カメラからの距離に応じて使用するテクスチャを切り替える事によって描画のパフォーマンスを最適化します。(正確にはカメラからの距離でテクスチャを切り替えているのではなく、描画するポリゴンが画面に対して占める面積で判定してます。)

f:id:aki517:20191127042416p:plain

パフォーマンスだけでなく、上図のようにカメラから遠いテクスチャを描画した際に発生するちらつきを抑える効果もあります。

Unityによる設定は対象テクスチャを選択し Inspectorビュー > Advance > Generate Mipmap にチェックを入れます。
f:id:aki517:20191126091907g:plain

デメリットとしては段階ごとの複数テクスチャを持つため、データサイズが 1.34倍になります。また、画像がボヤけた状態になりやすいです。これは距離に対して最適な段階のテクスチャが参照されていないために発生する問題です。 f:id:aki517:20191126091259p:plain

また、基本的にUI用のテクスチャは設定しない方が良いです。UIは距離によるサイズの変化が無いため有効にしても高速化が見込めない&メモリを消費するだけです。

あと、MipMapを自前のテクスチャに差し替えたい場合は Texture2D.SetPixelsを使えば可能です。

その他

その他でUnityのテクスチャ設定で重要なものを幾つか以下にまとめました。

sRGB

Project Settings > Other Settings > Color Space で設定する色空間に依存します。
Gamma の場合はチェックを入れて、Linear の場合は外します。

sRGB とは色空間を定義する国際規格です。
デジタルカメラ、プリンタ、PCモニター等での標準色として使われています。

omoide-photo.jp

本当は色空間についてリニアワークフロー、HDRなど含めて詳しく書きたいのですが情報が多くなるのでこの辺は割愛します。。^_^;

Read/Write Enable

基本はチェックを外します。スクリプト内でデータを書き換える場合は有効にする必要がありますがメモリ消費が2倍になるのと、対象テクスチャが非圧縮テクスチャとDXTテクスチャに対してだけ有効なためほぼ使いどころは無いです。
f:id:aki517:20191129234230p:plain

Wrap Mode

タイリング時にテクスチャをどう処理するか設定します。

モード 表示 説明
Repeat f:id:aki517:20191130105901p:plain:w200 テクスチャを繰り返し表示します。
Clamp f:id:aki517:20191130105911p:plain:w200 テクスチャ端のピクセルを引き伸ばします。
Mirror f:id:aki517:20191130105946p:plain:w200 Repeatと同じで繰り返しですが鏡のように反転させて表示します。
Mirror Once f:id:aki517:20191130105953p:plain:w200 UV座標の0,0を中心にMirrorを一度だけ行い、移行はClampと同じ引き伸ばし処理をします。

ちなみに Mirror Once は利用できない端末があるので、 SystemInfo.supportsTextureWrapMirrorOnce を使って端末がサポートしているか確認する必要があります。

Filter Mode

3Dモデルのスケールなどでテクスチャを引き伸ばした際の処理(フィルタリング)を設定します。 Trilinear > Bilinear > Point の順に高品質かつ処理が重くなります。

モード 説明
Point(no filter) フィルタなしです。ブロック状のジャギジャギした見た目になります。
Bilinear 隣接ピクセル間の平均を取ってぼかした見た目になります。
Trilinear Bilinear処理 + Mipmap間でのぼかしも入ります。

f:id:aki517:20191130093537p:plain

Aniso Level

Anisologic Filter(異方性フィルタリング) のレベルを設定します。 急角度でテクスチャを見た際の品質に影響します。地面や壁などです。

下図だと0(OFF)と1では見た目の差が出ていますが、それより大きい値を設定しても品質差は見分けるのは難しく、2以上はパフォーマンスの影響が大きいため、基本は 0(OFF) か 1(ON) で良いです。

f:id:aki517:20191130095406p:plain
f:id:aki517:20191130095403p:plain

また、Trilinear + Aniso Level 1Bilinear + Aniso Level 1 を比較した場合にパッと見の差異はないので、見た目をそこまでこだわらないならパフォーマンスの観点からも Bilinear + Aniso Level を設定するのがベターです。

まとめ

色々と書きましたが、最終的には用途やゲーム仕様に応じて設定するのが良いです。例えば、エフェクトなど一瞬で消える演出に使われるテクスチャはサイズを小さくして圧縮をかけて品質を落とす等です。

あとは規模にもよりますが、ここでまとめた設定を AssetPostProcessor を使いインポート時に自動設定できるとかすると良いですね。どんどん自動化して空いた時間をゲームの品質向上に割り当てれるようにするのはとても大事です。

参考

テクスチャ - Unity マニュアル
Unity - Manual: Using sampler states

【Unity】サウンド AudioManager

ゲームサウンドで最低限必要な機能をまとめたAudioManagerを作ってみました。
他にも足りてないものがあるけど一旦はここまで・・^_^;

github.com

参考

An Introduction to Game Audio Scripting in Unity (Part 1) | A Sound Effect
How To Optimize #Game #Sound In #Unity And Boost Your Game
【Unite Tokyo 2018】実践的なパフォーマンス分析と最適化
Blog - John Leonard French
Unity Audio Import Optimisation - getting more BAM for your RAM