スクリプターズカフェ/ログ/LSLでのタイマーカウントの内部処理はどうなっている?

ページ名:スクリプターズカフェ/ログ/LSLでのタイマーカウントの内部処理はどうなっている?

Scripters_cafeログ

08/10/11[]

「LSLのタイマーって正確じゃないよね」という話がたまに出てきますが、どの程度正確じゃないのか、どういった実装になっているのかを検証・考えてみました。


まず、wikiには以下のような記述があります。

  • Second Life Wiki 「llSetTimerEvent」
The time between timer events can be longer, this is caused by:*Time dilation - See llGetRegionTimeDilation for more information.*Default event delay - Only so many events can be triggered per second.*Event Execution - If the execution of an event takes too long.(意訳タイマーイベント間の時間は次の理由でタイマーで指定した時間よりも長くなる場合があります。*Time Dilation - llGetRegionTimeDilation を見てください*デフォルトのイベントディレイ - 1秒あたりにトリガーされるイベント数の制限*イベントの実行時間 - 1つのイベントの実行時間が長くなると、他のイベントのトリガーもその分遅れます


ここに書かれたような理由で、タイマーイベントのトリガー自体が遅れる可能性はあります。

しかし、例えば長い時間のタイマーを設定し、タイマーがトリガーされる直前などに長いイベント処理を行っていない場合でも、タイマーがトリガーされるタイミングがかなり遅れる場合があるようです。


また、タイマーを起動したプリムを一旦takeしてインベントリにしまい、それを再度rezした場合、take前の経過時間が維持された状態でrezされ、残り時間が経過するとタイマーイベントがトリガーされます。この挙動から、タイマーの「経過時間」のような値がスクリプトに従属するデータとして保存されていると考えられます。

「経過時間」をカウントしているということは、「前回イベントをトリガーした時刻」と現在時刻を比較してイベントをトリガーしているのではなくて、何らかのタイミングで経過時間を加算していき、その経過時間値が一定の値を超えたらイベントをトリガーしている、ということになります。

この加算処理は、SIM側の1フレームの処理ごとに、論理フレームタイムを加算するといった方法で行われていると推測され、フレームレートのブレがある場合、加算する時間に誤差が出てきます。タイマーの時間が長くなると、この誤差が目に見えて大きくなってしまう、と考えることができます。


これは推測の域を出ませんが、1フレームごとに加算してカウントしていく手法はゲームプログラミングでも用いられているので、このような手法である可能性は高いと考えられます。


09/06/27[]

タイマーのカウントについて、「1つのタイマーイベントの処理終了後から次のタイマーまでの間隔が計算されるのか?」という疑問があり、その場で調査しました。

調査した結果、以下のような挙動になっています。

  • 1つのタイマーイベントが発生した直後から、次のタイマーイベントまでの間隔が計算される(カウントされる)
  • イベントキューには、タイマーイベントは常に1つしか入らない
    • 1回のタイマーイベントの処理がタイマー間隔より長くなった場合、そのイベントの処理終了後、即座に次のタイマーイベントが発生する。
      • 処理時間がタイマー時間の2倍より長い状況でも、次のタイマーイベント分(1回分)だけ発生する

次のようなスクリプトにてこの挙動を検証しました。

integer COUNT;float WAIT = 4.0;float TIMER = 3.0;default { state_entry() { COUNT = 0; llSay(0, "タイマー間隔:" + (string)TIMER + "秒 " + "ウェイト:" + (string)WAIT + "秒"); llResetTime(); llSetTimerEvent(TIMER); } touch_start(integer num) { llResetScript(); } timer() { llSay(0, (string)COUNT + " " + (string)llGetTime()); if ( COUNT++ == 0 ) { llSleep(WAIT); } }}

実行結果

[15:35] Object: タイマー間隔:3.000000秒 ウェイト:4.000000秒[15:35] Object: 0 3.027057[15:35] Object: 1 7.149849[15:35] Object: 2 9.154529[15:35] Object: 3 12.160910[15:35] Object: 4 15.171420

この例では1回目のタイマーイベントで4秒のウェイトをかけているので、2回目のイベントが1回目のイベントの4秒後(llSleepが解けた直後)に発生しています。


タイマー間隔の不思議な挙動[]

上記スクリプトを、ウェイト間隔やタイマー間隔を変えながら何度か実行すると、不思議な現象に遭遇します。ウェイトからの復帰後の2回目のタイマーイベントの発生タイミングがずれます。(上記実行結果のカウンタ1と2の間隔)

例えば、タイマー間隔3秒、ウェイトを5秒にすると、以下のような結果になりました。

[15:48] Object: タイマー間隔:3.000000秒 ウェイト:5.000000秒[15:48] Object: 0 3.028843[15:48] Object: 1 8.144355[15:48] Object: 2 10.147720[15:48] Object: 3 13.148570[15:48] Object: 4 16.156180

ウェイトが4秒の時は、カウンタ0,2,3,4がほぼ3秒の倍数の間隔であったのに対し、ウェイトを5秒にするとカウンタ2以降がずれています。(カウンタ1からカウンタ2までの間が2秒というのが共通しています)


また、タイマー間隔1秒、ウェイトを2.5秒にすると、以下のようにカウンタ1とカウンタ2がほぼ連続して発生します。

[15:56] Object: タイマー間隔:1.000000秒 ウェイト:2.500000秒[15:56] Object: 0 1.005862[15:56] Object: 1 3.581643[15:56] Object: 2 3.626860[15:56] Object: 3 4.628458

この結果だけを見ると、「タイマー処理している間のtimerイベントがキューに積まれている」ようにも見えてしまいます。(タイマー間隔が1秒より短いと、このようにカウンタ1とカウンタ2だけが連続して発生します。3つ以上は連続しないようです)


この件は、もう少し調査が必要そうです。


このページのTinyURL:http://tinyurl.com/SC-timer-detail



特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。

シェアボタン: このページをSNSに投稿するのに便利です。


最近更新されたページ

左メニュー

メニュー 用語集 - これはどういう意味?用語解説 Q&A - よくある質問、定番解説、公式サポートに関する情報 トラブル・シューティング - トラブル・シューティング情...

顔文字

すでに日本の文字文化の仲間入りしたグラフィックを駆使しない表現手段。これが英語と日本語で違う。基本的に英語の顔文字は横向き。最初、わからなかったのが、この2つ...

銀行業務に関する判断・事例

2008年1月22日より施行される「銀行」に関する判断事例をまとめます。これらは「参考」であり、これによって「判断」をするものではありません。個々に記載されていない背景がある場合もありますので判例とは...

都市伝説&うわさ

目次1 Rumor & urban legend1.1 セカンドライフ全人口のうち3割はボット、半数は未使用のアカウントらしぃ1.2 キャッシュはまめにクリアしたほうがよい?1.3 支払い情報がないと...

身長

意外と知られていないが、AVの身長を計れる。llGetScaleのvectorのzを使う。ただし、靴などは脱いで計ること。SL内では2m前後が普通なようで まじめに計って 160cm程度にしたとある人...

設定

Second Lifeでは、様々な設定を行うことができます。「編集」→「環境設定」か、Ctrl + Pで呼び出せます。特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用...

複数アカウントの管理

このページの内容は公式 Knowledge Base「Alt Account FAQ」を翻訳、一部補足したものです。内容は予告なく変更される場合があるため契約を行う際は原文を確認するようにお願いします...

英語

RL/SLを問わず、世界標準語(なのか?)。人口比率的に、普通に生活していると英語を話す機会は多い。英語chatの参考に...ねっとげーむのえいかいわ。ちなみにある人の変遷 (ある人は、高卒程度の英語...

略語

日本語ほど省略しまくる言葉もないと思っていたら英語には勝てませんでした...例えば...lollaugh over laud大笑いbrbbe right backすぐもどるhbhurry back早く...

用語集

すごい作りかけです。みなさん、御協力お願いします。SIMSL内で作成される島のこと。LSLLinden Script Languageのこと。これで、オブジェクトやアバターを操作出来る。アバターSL内...

最近の出来事

最新情報です[]パスワードの盗難事件等発生していますいので、パスワードの再確認をお願いします。 --Keiji 2007年6月17日 (日) 16:46 (UTC)特に記載のない限り、コミュニティのコ...

日本人向けSIM

ここでは、日本人向けSIM(日本人利用者が多い、日本人が運営しているSIM)を並べていきます。特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

換金

日本円 →(US$)→ L$ / L$ →(US$)→日本円といった流れで換金が可能。リンデンラボ公式LindeXのみ。その他の方法Paypal経由でサードパーティを利用。例:ANSHECHUNG.C...

太陽

太陽を動かすことも可能。SLの太陽(及び月)は動くので、明るさも当然変わる。暗くなると見えにくいため、太陽を出して明るくすることもできる。メニューバーから以下の操作でコントロール。World - Fo...

外部サイトリンク

活動の軸が外部にある関連のリンク。ニュース、技術資料、ツール、サービスなど。イン・ワールドで活動している団体の説明 HPなどはこちらではなくイン・ワールド系リンクへ記載してください。目次1 ニュース1...

基本操作

初心者講座 > 基本操作ここでは、基本操作を解説します。画面の見方[]キーボードによる操作[]カメラ操作[]特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

土地の種類・分類

目次1 土地の種類2 土地の購入2.1 メインランドで土地を購入する場合2.2 プライベート・アイランドで土地を購入する場合2.3 レンタルとは?3 その他注意事項土地の種類[]セカンドライフにおいて...

土地

SL内では土地を売買・賃貸できる自分の(または所属するグループが)土地をもつと、そこを Homeとして設定できる。(CTRL+SHIFT+Hで、すぐに帰れる場所になる)土地のプリム数の範囲内で、家など...

右クリック

パイ・メニューを開いてその人や物に対して何か行う操作。何かしたい/情報を知りたいという時は、右クリックすべし。macな人に「右クリックないんですけど…」と質問されるのは定番。Optだったかを押しながら...