ラグを減らす為の工夫(スクリプト編)

 LSLWIKIからの転用(和訳、むしろパクリ)
 スクリプトを軽くする為、以下の工夫をしてください。
 みんなで少しづつ協力しながら改善してラグを減らそう!


1.サーバ側の負担を減らす

色を頻繁に変えるのであれば「llSetTextureAnim」を使って切り換えてください。
 「llSetColor」で色を変えるより複数の色を含む一つのテクスチャを貼り付けて
 切り換えたほうが軽いです。
 (画像の表示する座標を切り替えるだけで済むので軽くなります。)

回転をさせるだけなら「llTargetOmega」や「llSetTextureAnim」を使ってください
 (「llSetRot」等で回転させるとそのつど処理が走ります。
 回転看板等、同じ動きをさせるのであれば「llTargetOmega」を使いましょう
 また文字が回転するだけなら「llSetTextureAnim」でも十分です)

常にセンサーで監視する必要が無いのであれば「llSensor」を使ってください。
 
「llSensorRepeat」は一定間隔でセンサー処理をします。単発なら処理も軽い 

・センサーより衝突イベントを使ってください
 もし、センサーを自動ドアなど、近づいた時だけに反応する場合は
 衝突イベントをつかってください。「collision/collision_start/collision_end」
 触れた(乗った)時に反応するようにすれば処理が軽くなります。

・付近に誰も居ないとき、あなたの高度なスクリプトを停止するようにしてください。
 タイマーで停止させたり「llVolumeDetect」を使って処理を軽減させる事もできます。
 その為に「llSensorRepeat」を使うのも軽くするというのも一つの方法です。

・どうしても「llSensorRepeat」を使いたいのであれば本当に必要な時間を考えてください
 例)だれが近くにいるかを検索する場合
  人が居る場合は0.5秒で検索/人が誰も居ないときは10秒で検索するように切り替える
  (つまり人が居ないときは検索頻度を落として処理を軽くするわけです。
  ちなみにOinariの休憩所レーダは30秒に1回検索(間隔固定))

センサーの範囲は必要な範囲だけ使ってください
 センサーの範囲が5m以下であればllVolumeDetectを使ってください。
 (5m以上ならセンサー(なるべく狭く)、5m以下なら円プリムを置いて
  衝突イベントで判断できるのでセンサーより衝突を使ってくださいという事です。)

・スクリプトにはなるべく少ない数のListenを使ってください。
 また、なるべく同じチャンネルを使うようにしてif文で判断するようにしてください。
 もし「Listen」が不要になったら「llListenRemove」で「Listen」を停止してください。
 複数のプリム間で通信するならば「llMessageLinked」を使用するようにしてください。

・「Listen」のチャンネルは「0」以外を使用してください。
 「0」はすべての会話を受信してしまうので行う処理が多くなってしまいます。

・一つの言葉だけを受信で終了するスクリプトなら、処理終了後はListenを
 停止してください。
 ダイアログのメニューを開いてボタン選択なんて、まさにコレですよ
 選択した後、必ず「llListenRemove」でListenを停止させましょう。

・For文やwhile文で処理を常に走らせないようにしてください。
 常に処理が走る状態になるので処理が重くなります。

・文字を検索する場合For文等で検索するより「llListFindList」を使ってください。
 また文字をソートする場合は「llListSort」を使うようにしてください。
 まぁ自作のソート、サーチアルゴリズムより処理は早いかと
 むしろあるならそれ使ったほうが楽ですな(笑

・もしSIMのステータスを見る関数「llGetRegionTimeDilation」や「llGetRegionFPS」を
 使いたいならタイマーイベントを使って分単位で計測してください。(秒はダメ)

 SIMの状態監視スクリプトは重いらしい、まぁwindowsのタスクマネージャも重いよな

・同じリステンチャンネルとはいえスパムの様に送ると重くなる。
 (ってことだと思う、翻訳自信なし(笑))

・オブジェクト間の通信に「llKey2Name」を試してください。
 (オブジェクト間の通信が決められたオブジェクト間なら
 Listenのkeyの値から対象以外の処理はif文等ですぐ終了するように
 すべきという事だと思います。)

・「llRemoteLoadScriptPin」を活用すれば少し軽くなるらしい。
 (使い方が謎、時間あったら調べてみます)

・「listen」をポーズボール等に入れないで下さい。
 ※実は大半のポーズボールにはListenが入っています。(ボールを表示/非表示の為)
  私はListenが余り好きではないので、私が作成したポーズスクリプトには
  入っておりませんが通常は含まれています。
  ポーズボールを大量に置くと重くなるっていう理由はここに有ります。
  (あと、ポーズボールはポーズを取るとスクリプト数値が一気にあがりますね)

・タイマーより「llSleep」の方が処理が軽くなるようです。
 (うぉ、虫の音を「llSleep」方式からタイマー方式に変えちゃったよ(笑)
  間隔長いからまぁいいか)


2.クライアント側の負担を減らす

・光源処理(PRIM_MATERIAL_LIGHT)は重くなります。
 もし明るく見せたいだけならば光源処理ではなく
 オブジェクトEditのテクスチャ指定の所にある
 "full bright"を使ってください。

   

・テクスチャの描写には時間が掛かります。
 (128x128, 256x256, 512x512)等の小さいサイズにしましょう
 また、透明を含む画像をアップロードするなら32Bitもしくは24Bitの
 テクスチャをアップロードしてください。

・正方形ではないテクスチャをアップロードすると伸ばされて表示されます。
 これは問題ありません、テクスチャを貼り付けたときに調整してください。
 (これ、ラグと関係なくね?(笑))

・鳴らす必要の無い音を「llPreloadSound」で読み込まないで下さい。
 ジュークボックスなどで使わない音まで先に読込とかは正気ではないです。
 (まー先にクライアントに音を読み込んで置くと音が途切れないんだけども
  いくらなんでも選択しないと使わないような音まで先行して読込なんてしちゃ
  それ自体が過負荷だよって事ですな)

・ゲームなど、あなただけが必要とする音は「llPreloadSound」でロードしないでください
 関係ない人もその音をロードしてしまい、余計な負荷をかけてしまいます。
 (音のズレとかは防止できそうですが、全然関係ない人も音をダウンロードするので
  その分無駄な通信が発生してしまうという事ですね)

・あなたのスクリプトをチェックしてください。
 (念押された(笑))


おまけ
 センサーとListenえらく嫌われてるねぇ
 この辺使うといろいろ面白いんだが(まあListenは前からあんまり好きじゃなかったけど)

 まぁ命令もそうですが、プログラムは行う処理が多ければ多いほど
 処理にCPUが頻繁に使われます。
 プログラムは「シンプル イズ ベスト」つまり最小限のシンプルな処理にすれば
 処理速度は上がる、軽くなる、バグが出にくい(出てもすぐ直せる)と良い事いっぱいです。
 良く、複雑なプログラムを書いたりすると、周りからスゴイ、カッコイイと思われたりしますが
 正直複雑な処理は重くなるし不具合の温床になるのでオススメしません(笑

 私も若いときは無駄に複雑な処理をさせたプログラムがカッコイイと勘違いして
 組んでたけどそれは間違いです(笑  でも、それも良い経験だったかな^^;
 ま、SIMを快適にする為にも軽いスクリプトを組んでいきましょう。
 「最低限の処理で高機能!」を目指しましょう。

参考ページ:lslwikiのLag項目