2009年05月02日
追跡型チップジャー
以前からお店で使っている追跡型チップジャー。
スタッフがお店の敷地に入ると自動的に頭上にくっついてくるチップジャーです。
それなりに工夫はしてるんだけど、やはりSIMが重くなる原因ではないかと言われ、大改造を施すことになりました。
以前の方法は
そこで大改造です。
という具合です。
結構大規模なスクリプトになってしまい。はじめてスタックヒープコリジョンエラーを経験しました。とりあえずスタッフ全員の情報を収めたリストを操作する際、一旦ローカル変数にコピーし、グローバルのリストを削除して、ローカルで操作した後、グローバル変数にコピーするなど、姑息な手段で回避していますが、スタッフが増え続けることを考えた場合、データベーススクリプトを別に用意して使うなどの方法が必要になるかもしれません。
これやってて気が付いたのですが、チップパネルをサーバにリンクした場合、個々のパネルに払われたチップは正しく各スタッフに転送されるのですが、払うときの価格一覧されるダイアログの設定がちゃんと反映されないのです。各パネルでllSetPayPrice()で設定しているにもかかわらず、デフォルトの支払いダイアログが表示されます。この設定はルートプリムのそれが引きずられる模様。用確認です。
スタッフがお店の敷地に入ると自動的に頭上にくっついてくるチップジャーです。
それなりに工夫はしてるんだけど、やはりSIMが重くなる原因ではないかと言われ、大改造を施すことになりました。
以前の方法は
スタッフの数だけチップジャーを用意する。というものでした。しかし、登録したスタッフの数が30人を越えることになると、30個ものチップジャーがそれぞれ10秒に一度動作しているわけで、この負荷はバカにならないのでは?現在お店のあるSIMは他にこれといった店舗もないけど、、これからモールやお店を増やすので、負荷を軽減しないとこのチップジャーは使わないようにお願いするかもしれないとのことでした。
スタッフがいないときはチップジャーは控室に整列して待機。
各チップジャーが10秒に一回、登録されたスタッフが店内に居るかどうかをチェック。
いたらスタッフの頭上に移動。
一度頭上についたら1秒ごとにスタッフの位置を確認し、移動していれば追跡。
前回と比較して動いていなければチェックの頻度を5秒に一回に落す。
動き出したら一秒ごとにチェックし、追跡。
店の外に出たら控室に戻る。
これとは別に人数分のチップパネルを設置しており、こっちはまた別に30秒に一度スタッフがいるかどうかパネルごとに調べて、いたら明るく表示、いなかったら暗色にする。なお、チップパネルとチップジャーは独自のチャットチャンネルでチップが支払われたときに通信する。
そこで大改造です。
いまお店にいないスタッフのチップジャーが常に出ている状態を改善する。
一個の「チップジャーサーバ」でスタッフがお店にいるかどうかをチェックする。数十人のスタッフをループでチェックすることを考え、負荷を減らすためにこの頻度は30秒に一度。
チップジャーをつけていないスタッフが出勤したら、チップジャーをRezしてスタッフのUUIDや各種情報を登録する。
Rezされたチップジャーは自分でスタッフの頭上に移動して、あとは以前と同様に動きをチェックする。
スタッフが敷地から出たらチップジャーはサーバに「消えるよ」というメッセージを置くって自己消滅する。
サーバはメッセージを受け取って、ジャーが出ているかどうかのフラグをおろす。
それにくわえ、チップパネルもサーバで統一管理する。
ダイアログ操作で、チップパネルを自動的にRez、リンクしてならべ、スタッフごとの設定をする。
チャットの負荷を減らすため、サーバとチップパネルの通信はllMessageLinked()を使用。
という具合です。
結構大規模なスクリプトになってしまい。はじめてスタックヒープコリジョンエラーを経験しました。とりあえずスタッフ全員の情報を収めたリストを操作する際、一旦ローカル変数にコピーし、グローバルのリストを削除して、ローカルで操作した後、グローバル変数にコピーするなど、姑息な手段で回避していますが、スタッフが増え続けることを考えた場合、データベーススクリプトを別に用意して使うなどの方法が必要になるかもしれません。
これやってて気が付いたのですが、チップパネルをサーバにリンクした場合、個々のパネルに払われたチップは正しく各スタッフに転送されるのですが、払うときの価格一覧されるダイアログの設定がちゃんと反映されないのです。各パネルでllSetPayPrice()で設定しているにもかかわらず、デフォルトの支払いダイアログが表示されます。この設定はルートプリムのそれが引きずられる模様。用確認です。
Posted by Hitomi Magne at 20:00│Comments(0)
│LSL