こんにちわ、DOTween大好きオオバです。

DOTweenのメソッドを洗っていると気になるものが目につきました。

この記事の内容

SetRecyclableメソッド

いかにも内部でTweenerインスタンスをPoolし、
再利用することでガベージコレクションの発生率を下げてくれるのではと。

あわよくばパフォーマンスも上がるかもしれないと。

こちらのコードとUnityのProfilerでにらめっこしながら検証しました。

検証サンプル

Unity DOTweenのガベコレ頻度を下げる方法_0

強制的にガベージコレクションを発生させるため、
大量のオブジェクトを生成しTweenさせています。

結果

ガベージコレクションの頻度が下がりました。

SetRecyclable未使用 Ver.

Unity DOTweenのガベコレ頻度を下げる方法_1

SetRecyclable使用 Ver.

Unity DOTweenのガベコレ頻度を下げる方法_2

DOTweenのソースを確認する

ではどのように処理しているのかソースコードを見ていきます。

[object Object]

Tweenが終了したタイミングで isRecyclable フラグがtrueのものは
_pooledTweeners 配列に格納されています。

if (_maxPooledTweenerId < maxTweeners - 1) {  
    _pooledTweeners[_maxPooledTweenerId + 1] = t;  
    _maxPooledTweenerId++;  
    if (_minPooledTweenerId > _maxPooledTweenerId) _minPooledTweenerId = _maxPooledTweenerId;  
} else {  
    for (int i = _maxPooledTweenerId; i > -1; --i) {  
        if (_pooledTweeners[i] != null) continue;  
        _pooledTweeners[i] = t;  
        if (i < _minPooledTweenerId) _minPooledTweenerId = i;  
        if (_maxPooledTweenerId < _minPooledTweenerId) _maxPooledTweenerId = _minPooledTweenerId;  
        break;  
    }
}

[object Object]

Tweenerを取り出す部分で_pooledTweeners
存在していたらPoolされたものを使用しています。

for (int i = _maxPooledTweenerId; i > _minPooledTweenerId - 1; --i) {  
    Tween tween = _pooledTweeners[i];  
    if (tween != null && tween.typeofT1 == typeofT1 && tween.typeofT2 == typeofT2 && tween.typeofTPlugOptions == typeofTPlugOptions) {  
        // Pooled Tweener exists: spawn it  
        t = (TweenerCore)tween;  
        AddActiveTween(t);  
        _pooledTweeners[i] = null;  
        if (_maxPooledTweenerId != _minPooledTweenerId) {  
            if (i == _maxPooledTweenerId) _maxPooledTweenerId--;  
            else if (i == _minPooledTweenerId) _minPooledTweenerId++;  
        }
        totPooledTweeners--;  
        return t;  
    }
}

このようにインスタンスを生成しない分、
ガベージコレクションを下げているのが分かります。

まとめ

大量のオブジェクトを何度もTweenさせる場合であれば、
ガベージコレクションによるスパイク頻度を
軽減させる方法 としては良い気がします。

検証コード

大量のオブジェクトを何度もTweenさせる場合はSetRecyclable(true)にした方がよいかもと検証したサンプルコード · GitHub

期間限定 最大95%オフセール
効率UPメガバンドル開催中!最大95%オフ!!!
期間 : 11月1日午後15時59分まで
オススメ記事
検証環境