イベントの同時発生限度数を調べました。
キューは64個までのイベントを溜め込むことが可能で、それ以上のイベントは無視されることの検証です。
キューは64個までのイベントを溜め込むことが可能で、それ以上のイベントは無視されることの検証です。
以下のようにしてstate_entryイベントから100回のリンクメッセージを送信し、実際に処理されたリンクメッセージイベントの数をカウントしてみました。
// イベントキューリミット測定LSL integer event_call=0; // リンクメッセージのコール数 integer counter=0; // 実際に処理されたリンクメッセージ数 default { state_entry(){ integer i; integer j; llOwnerSay("Sleep start, please wait."); for (i = 0;i < 10;i++){ // 1秒間隔で10回ループ llOwnerSay("Sleeping... wait(" + (string)(10 - i) + "sec)."); llSleep(1.0); for (j=0;j<10;j++){ // 10回のLinkMessageを送信 event_call ++; llMessageLinked(LINK_SET,0,"",NULL_KEY); } } // リンクメッセージのコール回数を表示 llOwnerSay("Sleep end! link message is called " + (string)event_call + "times. touch for checking 'counter'."); } touch_start(integer detected){ // カウンター(リンクメッセージが処理された回数)の確認 llOwnerSay("counter is " + (string)counter + ". link-message event is called " + (string)counter + "times."); } link_message(integer s, integer i, string n, key id){ counter ++; // 処理されるたびにカウンター増加 } }
結果:
[8:38] Object: Sleep start, please wait. [8:38] Object: Sleeping... wait(10sec). (中略) [8:39] Object: Sleeping... wait(1sec). [8:39] Object: Sleep end! link message is called 100times. touch for checking 'counter'. [8:39] Object: counter is 64. link-message event is called 64times.
llMessageLinked関数を100回実行したにも関わらず、実際に処理されたのは64回です。
llMessageLinked関数が繰り返し100回実行されているのはstate_entryイベントの処理中です。
イベントは同時に処理されないので、 link_messageイベントはキュー(処理待ちイベント置き場)に溜まります。
ところが、キューには64個までしかイベントを溜め込めないため、65回目以降のlink_messageイベントは闇に葬られます。
state_entryイベント終了後、キューに溜まった64個のlink_messageイベントが怒涛のように実行されて、カウンターの値が64まで上がります。
イベントは同時に処理されないので、 link_messageイベントはキュー(処理待ちイベント置き場)に溜まります。
ところが、キューには64個までしかイベントを溜め込めないため、65回目以降のlink_messageイベントは闇に葬られます。
state_entryイベント終了後、キューに溜まった64個のlink_messageイベントが怒涛のように実行されて、カウンターの値が64まで上がります。
実際問題として、そこまで大量のイベントがキューにたまることは通常あり得ませんが、この状態になるとイベントは何のエラーも警告もなしに「なかったこと」になります。
自分では「イベントが起こるはずだ」と想定していたのにイベントが起きない、ということになりかねません。
思わぬバグの原因になる可能性もありますので、一つのイベントの処理時間が長いLSLを組む際にはこの点は把握しておいたほうが良いかと思います。
自分では「イベントが起こるはずだ」と想定していたのにイベントが起きない、ということになりかねません。
思わぬバグの原因になる可能性もありますので、一つのイベントの処理時間が長いLSLを組む際にはこの点は把握しておいたほうが良いかと思います。