論文紹介:Semantic segmentation using Vision Transformers: A survey
Unityネイティブプラグインマニアクス #denatechcon
1. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Unityネイティブプラグインマニアクス
DeNA Technology Conference 2017
1
Japanリージョンゲーム事業本部 開発基盤部
Haruto Otake
Sae Yamauchi
5. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインとは
5
6. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインとは
Unityの機能を拡張するための、ネイティブ実装ライブラリのこと。
ネイティブ実装とインターフェースを用意することで、相互に呼び出しできる。
参考
⁃ Unity マニュアル ネイティブプラグイン
https://docs.unity3d.com/ja/current/Manual/NativePlugins.html
6
ゲームコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
7. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
なぜ必要なのか
大きく分けると以下の理由がある。
Unityが提供していないプラットフォームAPIを使用するため
ネイティブ実装された機能をUnityで使用するため
7
8. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Unityが提供していないプラットフォームAPIを使用するため
iOS Push通知や動画再生などはゲームコードから呼び出せる。
以下の様な機能のAPIを使用したい場合は、Unityが対応していないため、直接呼び
出すことができない。
そのため、ネイティブプラグインを作成する必要がある。
例
⁃ WebView表示
⁃ Android Push通知設定
⁃ 空きディスク容量取得
8
9. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
技術資産を流用するため
ネイティブ実装されたミドルウェアや機能をUnityで使用するため。
例
⁃ 社内モジュール
• ゲーム特化BaaS(Sakasho)
• サウンドエンジン(DeAL)
• リアルタイム通信サーバー(IRIS)
• アセット転送
⁃ OSS
• WebPローダ
• ファイルの暗号化・復号化
9
10. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインのつくりかた
10
11. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインとしての実装 (1)
ネイティブ実装と、それを呼び出すためのインターフェースを用意することで、
相互に呼び出しを行うことができる。
マネージドコード
⁃ ゲームコード(C#)に当たる
⁃ monoでビルドした場合は、仮想マシン上で実行されるコード
⁃ IL2CPPでビルドした場合は、最終的にはネイティブコードになる
ネイティブコード(アンマネージドコード)
⁃ C / C++ / Java 等で記述されたコード
11
マネージドコード (C#)
ネイティブコード
(C / C++ / Java等)
インターフェース
12. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグインとしての実装 (2) 実装例 (Androidの場合)
12
int add(int x, int y) { return x + y; } // test.c
int add(int x, int y); // test.h
libnative.so
// ゲームコード上での呼び出し(C#)
int result = add(1, 2);
// P/Invoke宣言(C#)
[DllImport("native")]
private static extern int add(int x, int y);
マネージドコード (C#)
ネイティブコード
インターフェース
13. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
必要な実装
A. 【ネイティブ】拡張機能のコア実装
B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース
C. 【マネージド】ネイティブコードとの連携実装
D. 【マネージド】利用者向け呼び出しフロントエンド実装
13
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
14. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
必要な実装
A. 【ネイティブ】拡張機能のコア実装
B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース
C. 【マネージド】ネイティブコードとの連携実装
D. 【マネージド】利用者向け呼び出しフロントエンド実装
14
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
15. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
拡張機能のコア実装 / マネージドコードから呼び出すためのインターフェース
ネイティブコード
⁃ 拡張機能のコア実装
⁃ ゲームエンジンを跨いで利用可能な技術資産にできる
インターフェース
⁃ マネージドコードから呼び出すためのインターフェース
⁃ C Linkageの関数として実装する
• 例 test.cpp
extern "C" int hoge();
int hoge() {
return 1;
}
15
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
16. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
必要な実装
A. 【ネイティブ】拡張機能のコア実装
B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース
C. 【マネージド】ネイティブコードとの連携実装
D. 【マネージド】利用者向け呼び出しフロントエンド実装
16
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
17. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブコードとの連携実装
以下の機構でネイティブコードとマネージドコードの連携を行うことができる。
マネージドコード上
⁃ P/Invoke
• ネイティブコードをC#のメソッドのように呼び出すための機構
⁃ AndroidJavaObjectなど(Androidのみ)
• JNIを通じてAndroidのJavaのコードを呼び出す機構
ネイティブコード上
⁃ UnitySendMessage
• ネイティブからマネージドコードを呼び出すためのメソッド
• 指定したGameObjectに文字列を送ることができる
17
18. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
P/Invoke (Platform Invoke)
CLI(共通言語基盤)の機能で、ネイティブコードをマネージドコードの様に呼び出
すことができる。
引数や返り値は必要に応じて マーシャリング という変換処理が行われる。
18
ネイティブコード
インターフェース
P/Invoke宣言
マネージドコード(C#)
マーシャラ
引数は
System.String
です
変換した
データを用意しま
す
char*を
受け取りましたネイティブコード
インターフェース
P/Invoke宣言
マネージドコード(C#)引数は
System.String
です
????
[DllImport("ロード対象のプラグイン")]
private static extern int add(int x, int y);
19. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
AndroidJavaObjectなど
AndroidのAPIやJARに含まれるコードを呼び出すことができるUnityのAPI
マネージドコードからクラス名を指定し呼び出すことができる。
参考: Unity マニュアル Android 用のプラグインをビルド
⁃ https://docs.unity3d.com/ja/current/Manual/PluginsForAndroid.html
using (AndroidJavaClass cls = new AndroidJavaClass("java.util.Locale")) {
using(AndroidJavaObject locale = cls.CallStatic<AndroidJavaObject>("getDefault")) {
Debug.Log("current lang = " + locale.Call<string>("getDisplayLanguage"));
}
}
上記ドキュメントに記載されている呼び出し例(C#):
19
20. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
UnitySendMessage
ネイティブコードからマネージドコードに文字列を渡すことができる。
指定したGameObjectの指定したメソッドに対して、stringを引数にして呼び出す。
ネイティブで一定処理を行った後に、結果を返したい場合などに使用する。
問題点
⁃ 非同期のため、同一フレーム間でメッセージを受け取れるわけではない
// GameObject名, メソッド名, 送信したい文字列
UnitySendMessage("GameObjectName", "MethodName", "Message to send");
20
21. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
必要な実装
A. 【ネイティブ】拡張機能のコア実装
B. 【ネイティブ】マネージドコードから呼び出すためのインターフェース
C. 【マネージド】ネイティブコードとの連携実装
D. 【マネージド】利用者向け呼び出しフロントエンド実装
21
マネージドコード (C#)
ネイティブコード
(例: OSSライブラリ)
インターフェース
C
D
A
B
22. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
利用者向けフロントエンド実装
C Linkage関数のインターフェースをC#で扱いやすくするために、ラッパーを実装
する。
実装例 マネージドコード(C#)
22
public static class HogeBindings {
[DllImport("hoge")]
public static extern IntPtr create(int x);
[DllImport("hoge")]
public static extern void remove(IntPtr context);
[DllImport("hoge")]
public static extern int exec(IntPtr context, int x);
}
public class Hoge : IDisposable {
private IntPtr context;
public Hoge(int x) {
context = HogeBindings.create(x);
}
public Dispose() { HogeBindings.remove(context); }
public int Exec(int x) {
return HogeBindings.exec(context, x);
}
}
23. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグイン作成時の注意点と対応策
23
24. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
ネイティブプラグイン作成時の注意点と対応策
マルチプラットフォーム対応
⁃ 各プラットフォーム用のライブラリ対応
⁃ 各プラットフォームごとのネイティブプラグイン呼び出し実装
⁃ ネイティブプラグインのライフサイクル
⁃ ネイティブコードからマネージドコードを呼び出す実装の注意点
安定性
⁃ フェイルセーフ性の担保
⁃ アライメント問題の考慮
実機上での実行効率
⁃ メモリコピーの回避
24
25. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
各プラットフォーム用のライブラリ対応
各プラットフォーム用(iOS / Android / macOS / Windows)に実装したライブラ
リ を用意する必要がある。
Unity Editor上で動作させるため、macOSやWindows用のネイティブプラグイン
も作成する。
プラットフォーム 形式
iOS Static Library (.a)
Android Shared Library (.so) または JAR (JNI経由)
macOS Loadable Bundle (.bundle)
Windows Dynamic Link Library (.dll)
25