コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】System.Action よりも高速かつ GC の発生を抑えたイベントシステム「Relay」紹介

はじめに

「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 )
    {
    }
}