2014年4月26日土曜日

SLコンバットにおけるタマのお話

具体的な数値とかコードは一応漏れるといろいろとまずいので
やるとダウトなもんだけを適当に挙げていく感じに


・弾丸内部のスクリプトをmonoコンパイルしない

 monoはVM初期化時のメモリ確保量がLSO(LSL2時代のスクリプト形式)より多いです
 その分がちょいとディレイの原因になります

 んでまぁこれついさっき知ったのですが
 monoコンパイルのスクリプトはバイナリロード時点で
 シグネチャ(注1)のチェック処理があるのでrezが遅くなるとのこと

 なのでまーrezされるタマにmonoコンパイルを使うのをやめませう
 体感で3倍くらいSIMFPS低下量が違います


・発射レートが高いタマを他プリムにしたり大量のスクリプトを突っ込まない

 最悪エフェクト再生処理コケて消えるくらいの方がスマートです
 7年以上前のタマにdieとエフェクト再生を別スクリプトにしてるのがありますが
 あの時代と全体的なスクリプトの動作速度が10倍くらい違うので
 あーいうのは今使っても重いだけです やめませう


・着弾後にエフェクト再生するタマは最優先で物理off+ファントム化してしまいませう

 フルオートのタマだと着弾後に物理のままだと
 後からくるタマのせいで多重コリジョンイベントが発生します

 それを解決するためにフィルター弾を作る場合も有りますが
 あれはコリジョンイベントが発生しないだけで物理エンジンのコリジョンは発生するので
 ファントムにしてしまうのが一番安全です

 一部コンバットフィールドで"タマが残る"とか"pushされる"とかの理由で
 使用禁止になる銃は大抵ここの処理サボってます



・所謂"RLの実弾の寸法や形状"にこだわるのはやめませう 不毛です

  というか物理エンジン的に全長が短いタマは不具合ばっかり出て碌なことはありません

  同じ理由で射出されるタマにスカルプを使わないこと 重いです


・prim_temp_on_rezは万能ではありません 必ずtimerでのdie処理を併用しませう

 一時プリムは進入禁止の土地に引っかかると解除されることが稀に良く有ります

 あまりに長距離は描画距離でターゲットが見えなくなるってのもありますので
 3SIM以上飛翔しない程度のタイマーを設定しませう
 DIE_AT_EDGEも併用するとかなりタマが残りづらくなります

・タマでllDie();使うときはreturn;も併用

 return;してないと発生してるイベント内の別処理が動作してしまうことがよくある


・独自CS用のタマ作るならダメージ処理はコリジョン名でやるのが軽い

 say使う方法もまぁあるのですが
 発射レート高いと確実にディレイかかるしイベントスタックします
 最悪検出コケますので 可能な限りコリジョン名使う方向にしませう


・同時rezで自爆コリジョンが出るなら基本はタマ形状とrez位置で解決

 フィルター弾はあくまで最終手段


ってなところかね


以上

注1:当時のリンデンの発言がシグネチャになってたんだけど
       仕組み的にUUIDかMD5チェックサムだと思う

たまーにまぁコンバットsandbox等で"強い銃"的な論争になりますが
そういうのって大抵の場合
その銃自体の負荷でSIMFPSを極端に下げて他の銃を動作不良にして
その状況下でも自分の銃だけきちんと撃てるから勝てる
とかそんなのばっかりなのでとりあえず無視しませう

ちなみにまぁこれを全部クリアするのは
パブリック系のフィールドでは”最低限”なので
これをクリアしてないのに売上が伸びないとか
重いとかBANされたとか言ってるうちは甘いです

0 件のコメント:

コメントを投稿