BlackSheep-LSL@Wiki experiment > eventque
※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

イベントの同時発生限度数を調べました。
キューは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まで上がります。

実際問題として、そこまで大量のイベントがキューにたまることは通常あり得ませんが、この状態になるとイベントは何のエラーも警告もなしに「なかったこと」になります。
自分では「イベントが起こるはずだ」と想定していたのにイベントが起きない、ということになりかねません。
思わぬバグの原因になる可能性もありますので、一つのイベントの処理時間が長いLSLを組む際にはこの点は把握しておいたほうが良いかと思います。