はじめに
「Relay」は System.Action よりも高速かつ
GC Alloc の発生を抑えたイベントシステムです
検証環境
- Unity 2017.4.1.f1
検証用スクリプト
検証結果
リスナーの追加や削除、イベントの実行を 1000000 回行った結果
かかった時間(秒) | GC の発生回数 | |
---|---|---|
delegate | 1.377 秒 | 55 回 |
relay | 0.574 秒 | 23 回 |
使用例
using Sigtrap.Relays; using UnityEngine; public class Example : MonoBehaviour { public Relay<bool> onTest = new Relay<bool>(); private void OnEnable() { // 永続リスナーの数を取得 print( onTest.listenerCount ); // 1回限りのリスナーの数を取得 print( onTest.oneTimeListenersCount ); // 永続リスナーを追加 onTest.AddListener( OnTest ); // 永続リスナーを追加(既に追加されていても追加) onTest.AddListener( OnTest, true ); // 1回限りのリスナーを追加 onTest.AddOnce( OnTest ); // 1回限りのリスナーを追加(既に追加されていても追加) onTest.AddOnce( OnTest, true ); // 実行。1回限りのリスナーは呼び出された後に削除 onTest.Dispatch( true ); // 永続リスナーを削除 onTest.RemoveListener( OnTest ); // 1回限りのリスナーを削除 onTest.RemoveOnce( OnTest ); // すべてのリスナーを削除 onTest.RemoveAll(); // すべての永続リスナーを削除 onTest.RemoveAll( true, false ); // すべての1回限りのリスナーを削除 onTest.RemoveAll( false, true ); // 指定された永続リスナーが存在する場合 true; var contains = onTest.Contains( OnTest ); } private void OnTest( bool value ) { } }