⏱️

【推測】ClusterScriptの回数制限の具体的なロジック

2024/08/07に公開

ClusterScriptの各種関数に存在している一定時間での回数制限(「最大で10回/秒」というあれ)が、実際にどういうロジックなのかを推測した結果を書いた記事です。

0:あくまで推測です

CSEmulatorで対応するにあたり、結構丁寧に調べたのでおおよそ正解だとは思います。
しかし、真相は中の人でないと分かりませんので、これはあくまで推測です

1:CSEmulatorにソースコードがあります

主に、例えば
Assets\KaomoLab\CSEmulator\Components\CSEmulatorItemHandler.cs
に書いてあります。


playerhrottleがtypoしてるのに気付いた

2:時間系の制限にはパラメーターが2つある

一つづつ解説していきます。
ここでは、ItemHandle.sendを例にして進めます。

2.1 時間を入れる容器の個数が決められている

まず、各アイテム各処理毎に、時間を入れる容器があると考えます。

この容器にはsend()を行う度に決められた時間を入れます。

調査の結果、「最大で10回/秒」という場合は、5個+0.09秒と推測しています。
0.1秒でない理由は、計算誤差等々の理由で一時的に僅かに超えても大丈夫なバッファ的な考えからかと思います。

そして、この容器から溢れたタイミングでRateLimitのExceptionとなります。

「瞬間的にこの制限を超えることはできます」という文言の意味するところは、この5個の容器のことと考えています。
例えば、1フレーム内で一気に送れる回数は5回までということです。

2.2 時間を流出させていく

send()にて容器に入れられた時間をなんとかしないと、いつまで経っても次のsend()が行えません。

調査の結果、フレームの経過時間($.onUpdateで言うところのdeltaTime)分の秒数を、フレーム毎にこの箱から出しているようです。

このようにして、0.09秒分の時間が流出すると1枠空きます。
そうすることで、次のsend()が実行可能になります。

この時間流出の処理で、結果的に「10回/秒」を実現しています。

3:他のタイプの時間系制限のパラメータは?

すみません。厳密(0.01秒レベルでの精度)には調査してないです…!!!!
しかし例えば「100回/分」であれば「5個+1.66秒前後」ではあります。

良き回数制限ライフを!!!!!!!!!!!!!!!

Discussion