Event : Visual Studio Users Community Japan #1
Date : 2019/09/14
ソフトウェア/サービス開発において最も後回しにされるものの代表が「パフォーマンスの向上」です。C#/.NET の最大の武器は開発生産性ですが、C# 7.0 以降はパフォーマンス向上のための機能追加が多数行われています。いくつかのポイントを押さえることで実装時からより高速なコードを書くことができるようになります。
このドキュメントでは、そんなポイントとなる箇所をふんだんにお届けします。
Event : Visual Studio Users Community Japan #1
Date : 2019/09/14
ソフトウェア/サービス開発において最も後回しにされるものの代表が「パフォーマンスの向上」です。C#/.NET の最大の武器は開発生産性ですが、C# 7.0 以降はパフォーマンス向上のための機能追加が多数行われています。いくつかのポイントを押さえることで実装時からより高速なコードを書くことができるようになります。
このドキュメントでは、そんなポイントとなる箇所をふんだんにお届けします。
セル生産方式におけるロボットの活用には様々な問題があるが,その一つとして 3 体以上の物体の組み立てが挙げられる.一般に,複数物体を同時に組み立てる際は,対象の部品をそれぞれロボットアームまたは治具でそれぞれ独立に保持することで組み立てを遂行すると考えられる.ただし,この方法ではロボットアームや治具を部品数と同じ数だけ必要とし,部品数が多いほどコスト面や設置スペースの関係で無駄が多くなる.この課題に対して音𣷓らは組み立て対象物に働く接触力等の解析により,治具等で固定されていない対象物が組み立て作業中に運動しにくい状態となる条件を求めた.すなわち,環境中の非把持対象物のロバスト性を考慮して,組み立て作業条件を検討している.本研究ではこの方策に基づいて,複数物体の組み立て作業を単腕マニピュレータで実行することを目的とする.このとき,対象物のロバスト性を考慮することで,仮組状態の複数物体を同時に扱う手法を提案する.作業対象としてパイプジョイントの組み立てを挙げ,簡易な道具を用いることで単腕マニピュレータで複数物体を同時に把持できることを示す.さらに,作業成功率の向上のために RGB-D カメラを用いた物体の位置検出に基づくロボット制御及び動作計画を実装する.
This paper discusses assembly operations using a single manipulator and a parallel gripper to simultaneously
grasp multiple objects and hold the group of temporarily assembled objects. Multiple robots and jigs generally operate
assembly tasks by constraining the target objects mechanically or geometrically to prevent them from moving. It is
necessary to analyze the physical interaction between the objects for such constraints to achieve the tasks with a single
gripper. In this paper, we focus on assembling pipe joints as an example and discuss constraining the motion of the
objects. Our demonstration shows that a simple tool can facilitate holding multiple objects with a single gripper.
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matchingharmonylab
公開URL:https://arxiv.org/pdf/2404.19174
出典:Guilherme Potje, Felipe Cadar, Andre Araujo, Renato Martins, Erickson R. ascimento: XFeat: Accelerated Features for Lightweight Image Matching, Proceedings of the 2024 IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR) (2023)
概要:リソース効率に優れた特徴点マッチングのための軽量なアーキテクチャ「XFeat(Accelerated Features)」を提案します。手法は、局所的な特徴点の検出、抽出、マッチングのための畳み込みニューラルネットワークの基本的な設計を再検討します。特に、リソースが限られたデバイス向けに迅速かつ堅牢なアルゴリズムが必要とされるため、解像度を可能な限り高く保ちながら、ネットワークのチャネル数を制限します。さらに、スパース下でのマッチングを選択できる設計となっており、ナビゲーションやARなどのアプリケーションに適しています。XFeatは、高速かつ同等以上の精度を実現し、一般的なラップトップのCPU上でリアルタイムで動作します。
論文紹介: Exploiting semantic segmentation to boost reinforcement learning in vid...
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