『RENA』のチラ裏

「裏」がないのが「裏」

スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
これがオンラインミッションだ!!【きぼう編】
11th型オンラインパッケージを作る人向けのちょっとコアな話(兼備忘録)

特に始めて作る方、作ってみたい方はたぶん必読。

それから
11thONのホスト問題の究明に協力する方も
読んでおいたほうがいいかもしれません。

オフライン志向の方は全く読む必要ありません。

スレッドなどの基本概念と、新スクリプトが分っている前提で解説します。
ご了承下さい。


-------------------------------------------------

オンラインパッケージっていうと
11th Islands ONLINEを見本に作ると思いますが、
(というか見本にして下さい。)
初見の感想はきっと「ごちゃごちゃしててイミフ」です。

オンラインミッションがどういう仕組みで動いてるか見ていきましょう。

--------------------------------------------------

その前にまずオンラインでの基本用語説明。

・NETWORK_ID
サーバーへログインした順に番号が割り当てられます。
0番はサーバー自身です。

・クライアント
プレイヤーです。兵士です。

・サーバー
クライアントはサーバーを通して、通信しあいます。
基地(の通信設備)です。

また、機体、兵器の性能(rsu)はすべてサーバーで管理させます。
ログイン時に、クライアント側のrsuとサーバー側のrsuがチェックされ
不一致があるとRSPエラーが発生します。

※11thONはrsuが存在せず、直接RSPに記述されています。

・ホスト
戦況によりゲームを開始したり終了させます。指揮官です。

原則としてサーバー管理人が最初に
ホスト用のクライアントをログインさせます。

NETWORK_ID:1がホスト役という前提でゲームを作ります。

・LIGHT_HOST
ホストが通常の機体で出撃→撃墜されると、ゲームに悪影響が出る恐れがあります。
そこでホストは「LIGHT_HOST」でログインさせます。
すると映像がなく、機体も動かない状態で出撃できます。

・network_data ←超大事。
略してNTD

ネットワーク変数で、一人につき0~7番の8つが割り当てられ
全員分のデータが瞬時にネットワークを通して送信、共有されます。

以下のようにコントロールします。
set_network_data(3,5);
自分のNTD3番に、5という値を書き入れます。

hogehoge = get_network_data(1,2);
NETWORK_ID=1の持つNTD2番のデータを読み込んで、変数hogehogeに代入。

基本的には
ホストが弄り、クライアントが読み込みます。
(舟_ONLINEでは、クライアント側も弄ることでチーム内通信を実装しています)

他人のデータは弄れません。リードオンリーです。

--------------------------------------------------

基本用語を抑えたところで
一気に仕組みを見てしまいましょう。下図です。

online_normal.png
(クリックで拡大)

いろいろはぶってるので何点か補足。

・ホストはクライアント用のループをベースに
専用の機能をまとめたスレッドを並列で実行しています。

・「ホストシステムの準備完了を待っています。」は
ホストのNTDが1になるのを、クライアントが待っている状態。

すなわち、いくら待っても始まらないのは
ホストから連絡がなく、NTDが初期値の0のままであるためで
これがいわゆる「ホストが固まる」現象。

・始まってしまえばNTDはずっと1なので
途中参加が可能になるわけです。

・ゲームが始まると全クライアントがループに入ります。
このとき、撃墜、損傷度などが計算され、ボイスが鳴らされたりします。

・終了の条件が満たされ(スコア、タイムアップなど)ると
ホストがNTDを2にします。
それを受信した全クライアントがいっせいにループから抜け出し(break;)
リセット処理に入ります。

・リセット処理の後、再び初期処理(地形&敵配置、ラベル設定など)に戻り
ホストがNTDを1にした瞬間に新しい対戦が始まります。

--------------------------------------------------
これがベースとなる仕組みです。
がんばって作って行きましょう。完。

--------------------------------------------------
ここから下はもっとアブノーマルコアな方のみ読めば大丈夫です。

これがオンラインミッションだ!!【はめつ編】
(付録もあるよ!)

さらにクライアント側にもスレッドを実行させると
アブノーマル複雑なことができます。
例:舟or戦車を操縦させる、チーム内通信をする、順位を出す、など。

--------------------------------------------------

スレッド開始命令は初期配置と同じ箇所に記述します。
thread_id[0] = create_thread(thread_0,0);みたいな。

また、初期配置時に特殊なスレッドが動いているとバグる可能性大なので
クライアントのリセット処理の冒頭に終了命令を記述します。

下図はそれを表わしています。

online_wrong.png
(クリックで拡大)

しかし、これは です。

なぜなら
ホストではクライアントのループも動いてるため。

スレッド番号0番のスレッドはホストスレッドが占めてますので

クライアントのリセット処理でexit_thread(thread_id[0]);なんてやると
ホストスレッドがターミネートされてしまいます。

デデン、デンデデン的な感じでゲーム全体の指揮官がYou're terminated.され
バグります。最悪の場合、製鉄所で溶かされます。2は神。

ホストスレッドだけは、終わらせちゃダメです。

--------------------------------------------------
これを防ぐために以下のようにします。

online_right.png
(クリックで拡大)

NETWORK_ID=1(ホスト)以外だけが
スレッドを終了させるようにします。

こうすると万事収まります。

--------------------------------------------------

言われてみるとアホらしいですが、
11thONにはこの部分がないので、書き入れるのを忘れやすい箇所です。

舟が空飛んでいたのもそのためです。(恐らく。10/1/24時点)
ご迷惑をお掛けしました。

--------------------------------------------------
【付録】ミニ考察?オンライン対戦でやりとりされるデータはなに?
さすがにRSEの中まではのぞけないので推測。

まずは送信してるもの。(上ほど優先度高い?)

・自分(クライアント)のログイン情報
・自分の戦場存在情報
・自分のネットワークデータx8
・自分の位置情報
・自分の角度情報
・自分の武装発射情報
・発射した自分の武装(ミサイル、機銃)の命中情報
(被弾情報ではない可能性が高い)

こんな感じではないでしょうか。

それから、受信するものとしては

・全クライアントのログイン情報
・全物体の戦場存在情報
・全クライアントのネットワークデータx8
・全物体(クライアント、NPC)の位置情報
・全物体の角度情報
・全物体の武装発射情報
・全物体の武装(ミサイル、機銃)の命中情報

あたりでしょうかね。

--------------------------------------------------
一機増えるだけで、相当負担が増えるのが分ります。
さらに子オブジェクトがいっぱいくっついてる、とか
ミサイル大量!とかだと級数的に増えそう。

--------------------------------------------------
こっから下はさらに素人丸出しで書きます。
たぶん間違ってます。

通信キャパが100のとき
参加人数が2人のとき受信データは2ですので、速度は50ですね。

(実際、自分とHikoさんだけでやりあったとき、
それほどラグもひどくなく、ちゃんとボッコボコにされました。)

ところが
参加人数が4人になると25で、位置情報が欠落しはじめ、
飛び飛びが激しくなります。これがラグです。

参加人数が10人になるとたったの10です。

10とかになると、データの遅延によるデータの欠落が酷くなり
位置情報以前に、そもそも存在情報が送られてこないので
クライアントは「あ、こいついないんだな」と判断します。

これが消えるバグで

その直後に存在情報が送られてくるので
また「あ、やっぱいるわ」となり出現します。

以上の推測が当たっているならば(キリ

たぶんスクリプト側でできることは
「無駄な物体を入れない」程度のもので
RSE側の改善を待つしかないのかなー、と。

コメント投稿
管理者にだけ表示を許可する

トラックバックURL
http://renars3.blog46.fc2.com/tb.php/55-28136815

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。