FANDOM


Scripters_cafeログ


08/12/27 編集

オブジェクトへ複数のアバターがほぼ同時にタッチした場合の処理についてです。

これは、少しスクリプトを書いたことがある方なら、ほぼ同時にタッチした複数のアバターのそれぞれの名前が表示するには、以下のように記述するでしょう。

touch_start( integer num_detected ) {
    llSay( 0, (string)num_detected );
    integer i;
    for ( i = 0; i < num_detected; ++i ) {
        llSay( 0, llDetectedName( i ) );
    }
}

このスクリプトをインワールドで作成し、3 人や 4 人のアバターで一斉に 1 回だけタッチしてみると、全員が 1 回確かにタッチしたにも関わらず、名前が表示されないアバターがかなり高い確率で出てきます。

つまり、正しく書けば、アバターのタッチイベントはイベントキューがあふれない限り取りこぼすことはない、という認識は間違いです。サーバーのどのバージョンからこのような動作なのか分かりませんが、現時点(1.24.10)では、特定の条件でイベントが切り捨てられます。


サーバー側でのイベントの処理を詳しく見てみると、以下のようになっていると推測されます。 touch_startの処理がサーバー側で 2 フレーム必要だと想定します。

処理フレーム 1|アバターA タッチ|→イベントキュー|→touch_start
        |アバターB タッチ|→イベントキュー| (num_detected=2)
----------------------------------------------------------------------------
処理フレーム 2|アバターC タッチ|→切捨て    |(処理中→完了)
----------------------------------------------------------------------------
処理フレーム 3|アバターD タッチ|→イベントキュー|→touch_start
        |         |        | (num_detected=1)

この図のように、サーバー側で同一のフレームで取得したタッチイベントはイベントキューに入ってすべて処理されますが、スクリプトでタッチイベントが実行されている間は、キューに追加されずに切り捨てられます。

今のところ、touch_start / touch_end イベントでこのような動作を確認しています。

link_message イベントや listen イベント、money イベントでは、1 つのイベントの処理中であってもこれとは異なり、きちんとイベントがキューにたまります。



このページのTinyURL:http://tinyurl.com/SC-multiple-touch-start

広告ブロッカーが検出されました。


広告収入で運営されている無料サイトWikiaでは、このたび広告ブロッカーをご利用の方向けの変更が加わりました。

広告ブロッカーが改変されている場合、Wikiaにアクセスしていただくことができなくなっています。カスタム広告ブロッカーを解除してご利用ください。

FANDOMでも見てみる

おまかせWiki