トップページgamedev
743コメント242KB

( ´∀`)ネットゲー作る技術持っている人? 2

■ このスレッドは過去ログ倉庫に格納されています
0001喫煙者は臭い02/06/01 12:05ID:If0C3IRY
( ´∀`)この板にいるの?
http://www.hayariki.com/
http://game.2ch.net/test/read.cgi/gamedev/1016812752/l50
0570名前は開発中のものです。02/11/21 20:49ID:G9GGkiQ6
>>568
あ、どうも私の文章はわかりづらいようですね。
それでも読んで答えてくださるとは嬉しい限りです。

recvスレッドで、プレイヤーの1動作分蓄えてます
例えば:
[CM_MOVE, 80, 90] クライアントメッセージ、キャラ移動80の90に
[CM_ATTACK, 105] 105のオブジェクトに攻撃
などです。

一度のrecvで取得できるとは限りませんから、1動作分recvするまでは蓄え(「通信データブロック」のリスト)には書きません
568さんのおっしゃる通りの方法だと思います

ただ、「リストに追加する」「リストから排除する」を、
メインスレッドはプレイヤーの数だけするわけです。
1命令の間のクリティカルセクション入りが小石とはいえ、
1000人だとしたら最大2000回小石につまづく可能性を考えると、大丈夫なのかなぁと
ひとつの部屋に1000人いること自体問題かもしれませんが…

>>569
はい、それに関しても私が質問しました。
今はこのレスの上記のように「小石」について考えていますが、
RagnarokOnline式を用いない場合「エリア境界線でのデータ受け渡し」という「大石」な問題がでてきますね…。
とりあえず部屋移動はワープという、ragnarok式で作っています。

(´・ω・`)115さんすごいなぁ…
0571名前は開発中のものです。02/11/21 21:01ID:G9GGkiQ6
う…蓄えなんていうからわかりづらくなった気が…
今こんな方法でやっております

・recvスレッド
while(1){
・1動作分のデータをローカル変数に保存
・1動作分「プレイヤー行動リスト」にコピー
}

・メインスレッド
while(1){
for(int i = 0; i < player_num; i++){
・プレイヤーiさんの「プレイヤー行動リスト」から、一つローカル変数にコピー
・その行動について検討
・結果を「プレイヤー行動結果リスト」に書き込み(このプレイヤーを視認できる人全員に送る必要あり)
}
}

・sendスレッド
while(1){
・「プレイヤー行動結果リスト」から、一つローカル変数にコピー
・送る
}

・プレイヤー行動リスト
・プレイヤー行動結果リスト
の部分を排他しなければいけないので結構大変かもしれません

特にsendスレッドは、送らなければならないデータが溜まっているかを常に監視する必要があります。
クリティカルセクションに入ったり出たりと忙しそう…
057211502/11/21 22:31ID:PIqR+xfj
私の場合はWSAAsyncで処理してます。
サーバ側のゲーム処理は30fps単位でメッセージループから呼び出しているので
同期問題を気にする部分がほとんどなくて楽です。
#最初はプラットフォーム依存を少なくしようと思ってスレッドで作ってたのですが
#楽なもんでもう戻れないです...
sendについては、データをメモリに貯めて、
各フレームの最後にまとめて送信、全部送れなかった場合には
バッファが空いたメッセージがきた時点で残りを送信。という感じです。

マップをエリアで分ける、というのは多分
当たり判定を全ての組み合わせでやるのは負荷が高い、
遠くにいる敵キャラ等のメッセージまで送信すると帯域が足りなくなる。
という理由を考えてのことだと思います。
私の場合には距離が近いかどうかを保持してしていて
当たり判定、送受信は近い距離の場合のみ行っています。

距離が近いか遠いかの判定はキャラ数によって負荷が高くなる可能性がありますが、
必ずしもフレーム単位で行う必要があるわけではなので便利です。
このデータはマトリックスと線形リスト両方で持っていて、
処理に便利な方を使う、というようになっています。

一般的なやり方/適切な方法かどうかはわからないのですが...。
0573名前は開発中のものです。02/11/21 22:35ID:7YHJYPa6
>>570
>ただ、「リストに追加する」「リストから排除する」を、
>メインスレッドはプレイヤーの数だけするわけです。
プレイヤーごとに排他処理をすれば良い。
つまりリストをプレイヤー分よういして、それぞれに対応するmutexを作って
それぞれの追加/取り出ししょりで対応するmutexを使ってロックする。
送信も同じ。

>特にsendスレッドは、送らなければならないデータが溜まっているかを常に監視する必要があります。
ポーリングしようとしてる?
シグナル等とメインからsendに伝える方法はいくらでもありそうだけど。

>「エリア境界線でのデータ受け渡し」という「大石」な問題がでてきますね…。
スレッドならデータは共有されてるわけだから、こういう問題は起きないかと。

>>571
というか、どこをクリティカルセクションに仕様としているか示してくれると議論しやすそう。
0574560から色々質問してる人02/11/21 23:07ID:G9GGkiQ6
アドバイスありがとうございます。
115さんのやりかたおもしろいですね。
なるほど近いかどうかを「何フレームかに一度」判定して保持しておくわけですか。
たしかにMMOなら毎フレームシビアにする必要ありませんね。ナイスアイデアです。
そして環境依存の話ですが…。>>573さんの話と絡めてします。

>>573さん
もちろんプレイヤー数分クリティカルセクションを持っています
「余談」
 WindowsではMutexよりダントツにクリティカルセクションのほうが速いようです
 ttp://www-6.ibm.com/jp/developerworks/linux/020118/j_l-rt5.html

>エリア境界線でのデータ受け渡しによる「大石」
ご指摘の通りです。色々考えているうちに混乱したようです。
1つのマシンな限り、問題ないですね
0575560から色々質問してる人02/11/21 23:08ID:G9GGkiQ6
>どこがクリティカルセクション仕様?
・プレイヤー行動リスト
・プレイヤー行動結果リスト
この二つに読み込み、書き込みするのですが、
それが重ならないようには作ってあります。
具体的には
・256行動分プレイヤーコマンドを保存する変数を配列で確保する
・読み込み場所ポインタ、書き込み場所ポインタを用意する
・読み込むたび、書き込むたびにポインタを一つ加算する
・限界まできたらポインタを配列の最初に
・書き込みしてポインタを加算したとき、読み込みポインタと書き込みポインタが一緒だったら1周して追い越した。エラーとして通信遮断
・↑以外の時、読み込みポインタと書き込みポインタの位置が一緒なら、リストにデータは溜まっていないと判断
こうつくってあるので、
「ポインタをローカル変数にコピーする時だけ排他すればOKです」

つまり、
・プレイヤー行動リスト
・プレイヤー行動結果リスト
を読み書きする寸前にちょびっとということになります
>ポーリングしようとしてる?
>シグナル等とメインからsendに伝える方法はいくらでもありそうだけど。
シグナルを調べてみたのですが、これは便利ですね。
ただ私が調べた限りlinuxにおいて同等の機能がありません。(´・ω・`)
115さんもAASync使っていらっしゃるようですが、なるべくならサーバーはLinuxとしたいところ。
(Linuxの勉強をかねているので)

自分自身にソケットでコネクション張って、recvで待たせ、メインからsendで1バイトのデータを送れば信号代わりにできそうですね!
……(´・ω・`)
0576560から色々質問してる人02/11/21 23:14ID:G9GGkiQ6

>115さんAASyncについて
つまり115さんはスレッドを使ってない。
ちょっとsockについて詳しく調べたわけではないので恐縮ですが、
回線細い人にsendしたり、回線が実は切れてる人にsendすることによって、全体のパフォーマンスが落ちたりはしないのでしょうか
*「↑この疑問が出た理由」
*以前AASyncを使ってファイル送受信ツールを作ったことがあります
*そのさいためしにsendで大きなデータを送ろうとしたら、そのsendで処理がしばらく止まりました(もちろん送れはしました)
*非同期設定なのにこのsend。送信し終わるまで待つのかな?? と疑問に思ったのです

関連して、
・sendで時間をとられると、人数が多くなった時にゲームが一定間隔(FPS20とか)で進まなくなるかなぁ
・AASyncの受信メッセージって、ちゃんと偏らず全員からまんべんなくいただけるのかなぁ
という疑問が生じました

質問ばかりですいません。
なるべく実装結果の報告などで情報提供に努めますのでご容赦ください
0577名前は開発中のものです。02/11/21 23:40ID:7YHJYPa6
実は俺もスレッド初心者。
ちょっと同じようなことをやってたもんで。

>>575
>を読み書きする寸前にちょびっとということになります
問題なさそうに見えるけど、それでも問題でるんだろうか?

>ただ私が調べた限りlinuxにおいて同等の機能がありません。(´・ω・`)
pthreadつかってるなら、
pthread_sigmask(how, set, oset)
pthread_kill(thread, signal)
がそれ相当かな。
UNIXのシグナルをスレッド毎に使える仕組み。
select(), pause(), read(), write(), recv()とかなら、シグナル受けると
EINTRでブロックが中断される。

pthread_cond_*でもできそうだけど実はよく知らないw
LinuxとWindowsネイティブのこともよく知らなかったり…。
0578名前は開発中のものです。02/11/21 23:45ID:7YHJYPa6
こっちみたほうが早いかも。

スレッドプログラミング相談室 その2
http://pc3.2ch.net/test/read.cgi/tech/1037636153/
マルチスレッドプログラミング相談室
http://pc3.2ch.net/test/read.cgi/tech/997345868/
pthread地獄
http://pc.2ch.net/test/read.cgi/unix/1010933537/
057956002/11/22 00:54ID:gCRvC6O9
ioctlsocket関数を使うことで、recvをスレッドする必要がなくなるかもしれません
FIONREADでrecvに溜まっているデータ量を調べて、1行動分あるならrecvでゲット。

>>561さんはこれのことを知っていたので「当然なの?」ときたのかも
早速実装してテストしておきます
0580名前は開発中のものです。02/11/22 22:37ID:tU50iy3f
hoge
058156002/11/24 01:31ID:NHE65aTZ
( ´Д`)ノシ とりあえず鯖側がうまくいったようです
次はクライアントがんばるぞー
0582名前は開発中のものです。02/11/24 02:40ID:qyjJh111
がんがれ
058356002/11/25 01:22ID:UneiBCjf
クライアントも(歩いてしゃべる程度)できたところで、鯖をもうちょっとMMO向けにしたいと思います。
アドバイスなどあればお願いいたします。
・ワールド鯖  ・ログイン鯖  ・ゲームエリア鯖

「ワールド鯖」(世界の数だけ存在する。UOでいう無限鯖、瑞穂鯖などの単位)
世界中に存在するキャラのデータが入っている。
ゲー鯖、ログイン鯖からLANを通して参照される。
いわゆるセーブデータ領域。
起動した時にHDDから全データを読み込む。
(とりあえず単純にtxtに保存するつもりです。いちいちfopenなんぞしてられない)

「ログイン鯖」(1つだけ存在する予定。複数必要なほど頻繁にアクセスはないと思う)
最初にここへ繋いでもらう。IDとパスを管理。
ワールド鯖からログインしたID用のキャラデータをロードする必要がある。
使うキャラ(1ID3キャラくらいいる?)のいるゲー鯖IP:PORTをクライアントに伝えなければいけないし、
キャラセレの時にもキャラデータは見えるべきです。

「ゲームエリア鯖」(ワールド鯖1つにつき複数。多いほど快適ヽ(´Д`)ノ)
世界を構成するたくさんのエリア。それら一つ一つをつかさどる鯖です。
クライアントは、自分のいるエリアのゲームエリア鯖と通信をする。
敵動かしたり、PC動かしたりするメインの鯖ですね。
PCがエリア内に現れると、ワールド鯖からデータをロードします。
PCがエリアから抜ける(エリア移動orログアウトする)と、ワールド鯖にデータをセーブします

問題はログイン鯖からゲー鯖への移行時…。
いきなりゲー鯖に繋がれて(チートされて)も、平気なようにするには…
うまくやらないとラグナロクのようにキャラクターチェンジ現象が起こってしまう
何か良い手を思いつかれるかたいませんでしょうか
0584名前は開発中のものです。02/11/25 01:38ID:+0Ik5l5O
チケット管理鯖というのを作って、ログイン時にログイン鯖から
認証情報(アカウントID,時刻,IPアドレス)を送っておくというのはどうかな。
クライアントにはチケットIDを送る。

クライアントはゲー鯖に繋ぐと、最初にチケットIDを送る。
ゲー鯖はチケット鯖にチケットを照会して、
正しいアカウント/時刻/IPアドレスであるかを確認する。
一度使ったチケットは破棄される。

チケット鯖はログイン鯖に同居しても構わないと思う。
参考になりましたらどうぞ。

kerberos認証とかをちょっと勉強してみるといいかもしれないよ。
0585New Thread02/11/27 08:22ID:a9vr698J
なるほど
0586あぼーんNGNG
あぼーん
0587名前は開発中のものです。02/11/27 08:44ID:u4GoXNHd
●演技性人格障害

過度に人の注意を引こうとする障害です。自分が注目されていないと楽しさを感じないので、誇張した表現を用いたりします。
自己演技化するような感じですね。

●反社会性人格障害

社会的な規則を平気で無視し、人を傷つけたり衝動的な暴力を振るったりします。
自分にブレーキをかける事ができないので、周りの人も大変迷惑します。

●分裂病型人格障害

親密な関係で突然不快になったり、認知的または知覚的な歪曲行動の奇妙さが伺える障害です。

話も細かい事にこだわりすぎたり、まわりくどかったりします。家族以外には親しい友人がいなかったりもします。
 
0588あぼーんNGNG
あぼーん
058956002/11/28 20:40ID:yuQtZVAK
思っていた以上に大変です(;´Д`)
通信部やデータ管理部は最低限作ったものの、
例えばキャラのステータス1つ書き換えただけで、全ての鯖とクライアントを書き換えなきゃいけない
うう、めんどい…
0590名前は開発中のものです。02/11/29 23:39ID:MjrDrSuB
鯖同士は独立してたりしないの?
059156002/11/29 23:43ID:PdCH3V+M
もちろん独立していますが、
ステータスが1つ増えた(体力パラメータを追加した)ら、
クライアントはもちろん、ワールド鯖のセーブデータの型も変わりますし、
ゲーム鯖も体力パラメータを実装

ログイン鯖くらいですかね、変えなくても済むのは(iniファイルでパケットの大きさを設定できるようにしておく)
0592名前は開発中のものです。02/11/29 23:49ID:ONQzsoNN
XMLとまでは言わないけど、ある程度拡張可能にしてないと
つらいと思うよ・・・
059356002/11/29 23:56ID:PdCH3V+M
とりあえず、iniファイル使ってアカウントやキャラを管理しているのですが・・・

キャラのステータス部は変更も多そうですし、ひとつのdat扱いにしたほうが良さそうですね
そうすればdat部に変更があっても、そのサイズをiniで指定するだけで済みます
ワールド鯖はdat部の中身には興味ありませんし、login鯖も同様。
変更があってもクライアントとゲー鯖だけで済みますね
0594名前は開発中のものです。02/11/30 12:03ID:iUWTFlA2
通信データの取り扱い部分は、全プログラム共通のソースとかじゃないのかな?


059556002/11/30 12:29ID:aykncWXi
全部の機能を備えたものをつくって、INIファイルで動作を変えたほうが楽な気がしてきました
全部の機能とは、ログイン、ゲーム、データベース鯖のことです
0596名前は開発中のものです。02/11/30 12:35ID:qb/xrxwu
最初はそこからでいーんでないの
059756002/11/30 16:30ID:aykncWXi
なんとか軌道にのってきました。
そこでまた相談

まずログイン鯖。これは入口として必須。なるべくずっと同じIP:ポートに存在
IDとパスと使うキャラを渡すと、「あなたはこのIP:PORT鯖からスタートです」と、
自分が前ログアウトした鯖のIP:PORTをくれる

これは良いんですが、マップ移動するとき(別のゲーム鯖に繋ぎなおすとき)、
一旦ゲームから切断して、再びログイン鯖に繋げるべきですかね
もちろんクライアントの機能で、自動で同じIDとパスを送信するのですが

・利点
簡単なシステム

・欠点
ログイン鯖にアクセス集中
IDとPASSが何度も何度もネット上を流れる
059856002/11/30 16:37ID:aykncWXi
もしくは、ゲー鯖にIDPASS認証くらいつけるとか
0599名前は開発中のものです。02/11/30 18:32ID:qb/xrxwu
>>597
>>584を読んでないんか?
0600名前は開発中のものです。02/11/30 19:25ID:/ZeGUqgS
パッチ鯖が無い
060156002/11/30 19:50ID:aykncWXi
>>599
いえ、読んだのですがチケットを盗聴されると
そのチケットでゲー鯖に入られるのは必至。
そうなるとID:PASS認証とあまり変わらないかなと

今のところ「どうしても一回Login鯖通れ!」という理由も見つからず、
ゲー鯖でID:PASS認証。ログイン鯖の代わりにキャラメイキング鯖でも置こうか

とか考えていたのですが、やっぱり同アカウント使用管理はログイン鯖かなぁとか
色々苦悩中。
ゲー鯖から別ゲー鯖、ログイン鯖からゲー鯖に接続を移動する時の認証に困ってるわけですが・・・
私が>>584を理解しかねてるのかもしれません
060256002/11/30 20:00ID:aykncWXi
アイデアとしてこんなのを考えたんですけど、どうでしょう
クライアントをC
元居たゲー鯖(ログイン鯖)をX鯖
移動先のゲー鯖をY鯖とします
ワールド鯖(キャラ管理鯖)をWとします

XとCはコネクト中Y鯖への移動することになった
XはWに、そのキャラが移動中であることを伝え、CにはYへ繋ぐよう命令
CはYに繋ぐ
YはCのキャラをWに問い合わせ、移動中であることを確認。Yは移動PASSを作成してWに送る
Wは移動PASSを書き込み、Yに書き込み完了を伝える
YはCに移動PASSを教える
CはXに移動PASSを教える
XはWに問い合わせて正しいことを確認。WはCは移動完了済みと書き込む
XはCに成功と伝え接続を切る
CはYに成功と伝える
YはWに問い合わせて完了済みと確認
やっとY鯖で遊べます

これでどうでしょう。途中移動PASS等を盗聴されてもOKにしたつもりなんですが、
穴があればご指摘願います。
技術持ってる人スレなのに、相談ばかりで申し訳ありません
0603名前は開発中のものです。02/11/30 20:02ID:iUWTFlA2
>一旦ゲームから切断して、再びログイン鯖に繋げるべきですかね
誰が次の鯖IPとポートを教えるかって問題だよね?
全鯖が同じ機能を持っててINIで動作指定してるってなら、どうせ機能共有してるんだし
前にいた鯖が次の鯖を教えてあげればいいと思うんですが。

>IDとPASSが何度も何度もネット上を流れる
気になるなら公開鍵暗号とか使えば盗聴対策にはなるよ。
0604名前は開発中のものです。02/11/30 20:07ID:iUWTFlA2
>そうなるとID:PASS認証とあまり変わらないかなと
ゲーム鯖はクライアントのIP+ポート+チケットで認証すればそんなに問題は起きない。
Webのクッキーが問題になるのは、IP情報をチェックしてないからだね。
Webの場合はProxy切り替えでアクセスごとにIPが変わる可能性があるから。
0605名前は開発中のものです。02/11/30 20:20ID:iUWTFlA2
というか、Kerberosのこと調べてないでしょ?
いいURLしらないけど、↓くらいなら雰囲気は分かるかな?
http://www.computerworld.jp/resource/keyword/back/200010sw.html
060656002/11/30 20:54ID:aykncWXi
>>603-604
なるほど。チケットを盗聴したあげくIPまで一緒というのはそうそう無いことですね
同じLAN内の人の仕業?
次のゲー鯖IPを教えるのは各ゲー鯖に機能を持たせます。
あとは暗号化ですね。

>>605
ありがとうございます。
一応何個か調べたのですが専門的なサイトだったようで(;´Д`)こんな感じに
ご紹介のサイト見てみようと思います
060756002/11/30 21:49ID:aykncWXi
なるほどすごい技術ですねケルベロス。
これならログイン鯖とターゲット鯖との接続がなくても、保証できそうです。

ただ、今回の私のではログイン鯖とターゲットのゲー鯖との間に、
ワールド鯖を介したつながりがあります。
このあたりを考えて>>602を考えたのがいかがだったでしょうか?
0608名前は開発中のものです。02/11/30 23:56ID:iUWTFlA2
クライアントが複数のゲー鯖につながらないように管理できてればOKでしょう。
移動パスとかはいらなさげ。

というか、DB鯖(ワールド鯖)が接続管理もやってることに違和感を覚えるんですが。
060956002/12/02 12:02ID:/eBd4hmu
お世話になっております。
>>608
DB(ワールド)鯖が接続管理をやっているというのとはちょっと考え方が違います。
DB鯖は「プレイヤーがどんなステータスでゲームを終了したか」を保存しますよね。
その「ステータス」の「現在の接続状況」の項目に「鯖移動中」を保存しているのです。

これはログイン鯖やゲー鯖からの「これこれをセーブしてくれ」という命令に基づくもので、
DB鯖はその内容が何を示しているかについては興味を持ちません。
DB鯖は淡々と頼まれたセーブロードを行い、それが完了したら完了通知を返すだけです

>>602の方法は、あるキャラへのSAVEができるのは絶対に1クライアントであるということを利用しています
わかりやすく書きなおすと
・CはXからYのアドレスをもらう
・YはCからキャラ番号をもらう
・CはYからまず重ならないPASS(通し番号でも可ですね)をもらい、Xに伝える
・XはWにPASSの書き込みをお願いする
・YはPASSがちゃんと書き込まれているのを確認

実際は、W鯖への書き込み・読み込み完了通知をちゃんと待ってから次のアクションを起こします
061061002/12/05 06:30ID:VKHhHYSt
・CはYからXのアドレスをもらう
・WはYからキャラ番号をもらう
・YはCからまず重ならないPASS(通し番号でも可ですね)をもらい、Xに伝える
・WはXにPASSの書き込みをお願いする
・CはPASSがちゃんと書き込まれているのを確認

これで・・・
061161002/12/05 06:32ID:VKHhHYSt
まぁXとCはコネクト中Y鯖への移動することになったのでXはWにそのキャラが移動中であることを伝えCにはYへ繋ぐよう命令しCはYに繋ぎYはCのキャラをWに問い合わせ移動中であることを確認しYは移動PASSを作成してWに送る
Wは移動PASSを書き込みYに書き込み完了を伝えYはCに移動PASSを教えCはXに移動PASSを教えXはWに問い合わせて正しいことを確認しWはCは移動完了済みと書き込みXはCに成功と伝え接続を切りCはYに成功と伝えYはWに問い合わせて完了済みと確認すればOK。

同じこといってたらスマソ
061256002/12/05 13:24ID:3Zgyidkz
そうですね。同じことかと思います。
最も噛み砕いて言うと
Y「おらC。お前キャラ○○なんやて?本当なら今から俺が言う数字を
  (Cがキャラ○○であると保証済みである)X鯖を通してデータベースに
 書き込んでみーや。それができたら認めたる」

 と言ってるわけですね
0613嫌煙02/12/09 09:24ID:ifwLS5NL
なるほど
0614あぼーんNGNG
あぼーん
0615再開02/12/11 08:48ID:3WrMQ7GU

今日、松浦亜弥秋コンサート、ラスト名古屋公演いってきました。
新曲の、草原の人 が聞けました。
あややの楽曲のジャンルに、また新しいのが加えたような感じがしました。
 あややも、この曲の意味を理解し、表現できるまで成長したのですね。
したがって、衣装が若干、変わっていました。
オレンジ色のふさふさのドレスのやつがなくなっていました。

柴田:(手を挙げて)今回柴田がリードボーカルを担当してるんですが、
     やっぱりね、切ない中にも彼とのね明るい思い出とか
     そういうのをイメージして歌ったので、
     そこらへんにも注目してください。
「今回柴田がリードボーカルを担当」って言ってますけど、柴田以外がシングル
でリードボーカルを担当することなんて、あるんだろうか。「柴田がリードボー
カルを担当していない」6月発売の前曲では、ソロパートの6割柴田だったし。
その前は、あー、何だっけ、「♪愛のボタンを連射連射」、その曲では場違いな
黒のスーツ着てラストフレーズ歌ってました、確か。
 ラストフレーズ→ソロパートの6割→リードボーカル。ドンドンドンと来てま
すよ。でも、もうこれ以上はないと思うんですけど。もう普通の4人組です。
0616あぼーんNGNG
あぼーん
0617bloom02/12/11 09:21ID:EVS8SY4x

http://www.agemasukudasai.com/bloom/
061856002/12/11 16:15ID:FqfpEXIw
保守ご苦労様です

私はというと、データセーブのところで悩んでおります
ゲー鯖とデータベース(以下DB)鯖を1本コネクションをはり、これで全部まかなうつもりだったのですが
ゲー鯖から一気に人が落ちた時にsendバッファをオーバーする危険性に気づきました

かといってプレイヤーの数分だけDB鯖とコネクションを張ると、
DB鯖が人数分(個人ではありえないけど10000人分とか)のコネクションを張る必要があります
確か張れるSocketの数には制限があったはず

だいたい、DBとconnectをするとき非同期にしなければならないという問題点もやっかい
セーブデータも全部ゲー鯖が持ってれば、データの呼び出し書き込みのタイムラグ気にせず作れるのにー
0619あぼーんNGNG
あぼーん
0620名前は開発中のものです。02/12/13 08:35ID:cx8+DBFs
セーブするのはプレイヤーが落ちたときだけなの?
鯖落ちなんかのときに、セーブデータが矛盾しちゃったりしないのかな。

(sendバッファってどこのバッファだろう…?)
062156002/12/13 09:04ID:RcgmxMKS
おはようございます
sendバッファとは、winsockの送信バッファのことを指しています
コネクションが切れた時に、プレイヤークラスがDBとコネクションを張っているsockに、
自分のデータをsendすればいいかなと思ったのですが、

セーブデータ量×人数>送信バッファ

の時にめんどうくさいことになるなと
これは、プレイヤーとのコネクションが切れてもプレイヤークラスがデータを保持しつづけ、
DBとのコネクションを張っているデータセーブロードクラスが読みに行ってあげる と言う方法で決着しそうです
(送信バッファの空きが分かる関数が欲しいですねぇ…。自分でカウントするしかないか…)
062256002/12/13 09:09ID:RcgmxMKS
失礼。上の
セーブデータ量×人数>送信バッファ
は、外部とのケーブル切断や経路腐りなどで一斉に人が落ちた場合です。
普段はそうそうありません

セーブはプレイヤーが落ちた時、プレイヤーが別ゲー鯖へ移動(部屋移動)したときにするつもりです
ゲー鯖が強制終了などした場合は、矛盾が生じる場合はおおいにありえますね
・Aさん、Bさんからアイテムをもらう
・Bさん別部屋に移動(データ保存)
・Aさんのいる部屋が強制終了(データセーブされず)
アイテムが消えてしまいますね。逆に増える場合もあるわけで
これに対応する方法はちょっと思いつきません
まさかアイテム移動なり経験値取得なりあるたびにセーブするわけには…
0623名前は開発中のものです。02/12/13 23:11ID:cx8+DBFs
>アイテムが消えてしまいますね。逆に増える場合もあるわけで
>これに対応する方法はちょっと思いつきません

クリティカルな(アトミックな)操作は、必ずその場で保存するようにする、のがいいのかな?
たとえば、アイテムトレードなんかは、ダイアログボックスが出てたりして、
多少ラグがあってもかまわないわけですよね。
だから、アイテムトレードが成立した時点で、その情報だけは、そのつどDB鯖に送るとか。
(DBで言うトランザクションをちゃんと考えろってことでしょうか。)

アトミックな操作ってのは、システム的に分離できない操作のことね。
AとBのアイテムトレードなら、
・AがBからアイテムIを受け取る
・BがAにアイテムIを渡す
という動作は、分離できない行為で、それぞれが別々のタイミングでセーブされると、
データが矛盾してしまうタイミングが必ず存在してしまいますよね。
経験値やお金なら、1キャラクタの問題だから、矛盾は起きない、と。

って、現行のMMORPGがどういう処理をしているのかは知らないけど、一般論として。
0624名前は開発中のものです。02/12/15 15:20ID:/qOF98KW
サーバー側にトレード仲介人がいて、そいつが担当するのがいいんじゃないかなあ。
双方の意思を確認して、DBへのトランザクションを開始する、と。

ただ、これをやり始めるとあちこちを再設計しなおす必要があったりするんだなあ。
0625火星人02/12/18 08:59ID:4hRM2Dy7

WOWOWアナログ超キャンペーン。
http://hedo.mariansela.com/service/shopping/wow/index_wow.html
http://hedo.msweb.jp/service/shopping/wow/index_wow.html
内容は、”デコーダ無償進呈+アナログ加入料(3000円)弊社負担”です。
 BS放送受信環境下にある方々には、毎月の視聴料のみで、WOWOW視聴できますので、ご勧誘の促進にもお役に立てることを願っております。
 適用期間は、1月20日記入済み加入申込書弊社到着分までです。
0626あぼーんNGNG
あぼーん
0627名前は開発中のものです。02/12/18 11:04ID:5za/bNyy
http://www.real-unreal.com
0628あぼーんNGNG
あぼーん
0629名前は開発中のものです。02/12/19 03:09ID:0yo6QriM
いきなりだけど、素人の質問。
PSOとかはローカルにキャラクターデータを保存してるから(なのかな?)
ゲーム中にさえサーバ間移動とか楽にできたじゃん?
だけとラグナロクとかはサーバごとに別キャラクターをつくんなきゃいけない。
サーバ側でキャラクターを管理してて同じキャラクターがサーバを移動するって
のは技術てきに難しいのかな?
0630名前は開発中のものです。02/12/19 04:05ID:PjwhMgFF
>>629
 単に相手がクライアントかサーバーかの違いだけ。

 UOはシャード間の移動はできないけど、シャード自体は複数のサーバーで構成されてる。
 PSOは部屋主をサーバーにしてデータをやりとりしてる。

 要はシステムデザインとしてそういう仕様にするかどうかだけ。
0631名前は開発中のものです。02/12/19 08:34ID:SNWeNmYM
MMORPGでサーバ間移動を無制限に許しちゃうと、経済とかアイテムのバランスが崩れちゃうしね。
技術的ではなくそういうゲームデザイン的な理由からそうなってるんだと思うよ。
063262902/12/20 02:04ID:5ViDbUfc
>>630
なるほど。よくわかったです。
>>631
つまり技術的には問題ないんすね。


どうもありがとうございました。
0633あぼーんNGNG
あぼーん
0634名前は開発中のものです。02/12/20 14:31ID:z0PhX7D8
age
0635あぼーんNGNG
あぼーん
0636名前は開発中のものです。02/12/29 14:17ID:ZfKBWkqX
sage
0637名前は開発中のものです。02/12/29 14:30ID:VYaJz7K+
http://eternal.s19.xrea.com/
ここがいしゅつ?
小規模MMOにスレたってたんだが、
製作者はちゃねらっぽい
キャラ絵とBGMがへぼいけどそこそこできてんじゃないのかな
0638嫌煙03/01/03 11:22ID:uWzQjRM6

北方水滸伝で感心したのは、食い物の描写。
魯智深の左腕もうまそうだった。
ほかに、阮家三兄弟のきもを溶かし込んだスープで煮込む鍋、
朱貴の店の魚肉入り饅頭、祝家荘の野戦料理、解珍の鹿刺。
随所に食べ物と、それを食うシーンが出てきて、よだれが出てくる。

おれは楽しみにしているTV番組がひとつもなく
単に灯り代わり、あるいは時報代わりにTVをつけているだけ。
でもナンシーの文春での連載は楽しく読ませて頂いていた。
今でも腹を抱えて笑った文章を覚えているのだが
キナシノリタケが一般視聴者を業界風イケテル男に鍛えると
六本木に連れだしてイロイロなイケてる遊びを仕込む。
で、遊び仲間を次々連れてくるが
イチローの兄とか、バブルガムブサザーズの痩せている方とか
どう考えても会って嬉しくは無い人がゾロゾロ。
ナンシーさんもそこを衝いていたけど、
番組を見てないおれでも、その情景が浮かんでニンマリしてしまった。
0639名前は開発中のものです。03/01/03 12:27ID:awoaqleP
お勧めの本はこちら↓
http://atkinson-web.hp.infoseek.co.jp/atkinson/osusume_book_ryouhou.htm
お勧めのソフトはこちら↓
http://atkinson-web.hp.infoseek.co.jp/atkinson/security_soft_ryouhou.htm

0640あぼーんNGNG
あぼーん
0641名前は開発中のものです。03/01/04 04:30ID:RfbjdfuE
はい?
0642名前は開発中のものです。03/01/04 04:31ID:RfbjdfuE
↑誤爆です、スマソ。

>>115さんの、
ttp://www.geocities.co.jp/Playtown-Knight/8949/dev/index.html
ttp://robrob.tripod.co.jp/mmo
どちらにもないんですけど終わっちゃったのですか?
9月ごろ遊ばせていただいて、久しぶりにこのスレ見て
どの位ver.upしてるか楽しみにしてたのですけど・・・
0643名前は開発中のものです。03/01/04 09:06ID:/B4YJjKl
>>642
http://robrob.tripod.co.jp/mmo/
0644名前は開発中のものです。03/01/07 04:48ID:6+7zORqy
>>642
http://game3.2ch.net/test/read.cgi/mmominor/1036747427/
小規模MMOにもスレできてるぞ
0645名前は開発中のものです。03/01/07 09:04ID:p71Rp6wc
age
http://hayari.tripod.co.jp/
0646あぼーんNGNG
あぼーん
0647名前は開発中のものです。03/01/25 10:20ID:4i9SddhF
ない!
やるならやれ
0648名前は開発中のものです。03/01/29 02:23ID:bK9zvgXb
すっごいやん
0649名前は開発中のものです。03/02/06 18:06ID:O236pvM2
煽り 荒らし コピペ荒らし
家ゲー板 家ゲー攻略板 PCゲー攻略板 ゲーハー板潰し
これで・・・・・・
やっと半分ってところだよ・・・・
もうワカったろう
滅茶苦茶にヤラれたンだよ メチャクチャに
現在ゲーム関連板は、絶望的な状況下を懸命に死と戦っている
今、我々のなすべきこと
それは、専用ブラウザを使い、状況を傍観することか?
俺たちは、教育集団でもなければ宗教団体でもない
俺たちゃよォ・・・・・・・
2ちゃんねらーだッッッッ
戦う団体なんだぜェッッ
荒らしを2ちゃんねる100の板に配布しろッッ
2ちゃんねらー300万の手で、必ず探し出せッッ
2ちゃんねらーは、後ろを見せんッッ
ゲーム関連板の無念を晴らすッッ
いいかァ!!!
0650あぼーんNGNG
あぼーん
0651416 ◆quHoSW/FCI 03/02/20 13:35ID:uCP8+9cO
 今、なんとなく考えてるのは、空域(地形)を処理する鯖を中心に、親が接続して、
さらに子が接続。それ、MXやんというツッコミはおいといて、親は戦艦クラスを
指揮して、子は言わば戦闘機な。
 親がネットから切断されると子も巻き込むけど、それはPSOと同じ仕様で、子の
一つが親になることで維持できるようにと。

 主鯖は親鯖の判定に徹して、子同士の判定はそれぞれの親鯖が判定することで、
処理を分散させようかと。

 ゲーム内容は単純。自分の旗本艦を守りつつ、相手の旗本艦を撃墜すればok。
宇宙物にするかWW物にするかは未定。
0652名前は開発中のものです。03/02/20 17:58ID:X8LPTJ7z
親が、自分の空域から出たら旗艦の指揮権を失う、とどまったら相手の空域まで
行けない、というジレンマを楽しむゲームですか?
0653名前は開発中のものです。03/02/20 22:26ID:oxR38k8D
親同士が戦闘空域に入ったら子は相手の親に繋ぎ替えて攻撃とかすればいいのか?
あー、あれだ。SFでもWWでもなくて、ウイルスモノにすれば良い。
親鯖を守るワクチンや敵鯖をクラックするウィルスを操作する。
0654名前は開発中のものです。03/02/21 00:31ID:eCjWRLRD
>>653
Terrariumみたいですな。
あれのAIじゃなくて人が操作するやつ?
0655名前は開発中のものです。03/02/21 00:37ID:rMyGH6Rk
そだね。ハッカーが電脳世界でなんかやってるカンジ。
まぁ、設定なんざどうでもいいんだけどさ。
0656名前は開発中のものです。03/02/21 01:29ID:ihpAW+hG
>>651
βテスターが必要だったらいつでも協力するんでガンガッテください
0657416 ◆quHoSW/FCI 03/02/22 01:47ID:86PlkbSg
>>652
>>653
 親鯖にぶら下がった子の判定は、原則親鯖が処理するってだけの話では
ありますがー。ゲーム上で異なる親鯖の戦闘機が交戦した場合は、

a親←─→b親
↑      ↑
↓      ↓
a子     b子

という繋がりになりますな。

 区域単位で管理して、子であっても未管理区域に進入したら、そいつが親になる
のも面白そう。

 つまりは個人で強力な鯖はなかなか立てれないから、非力な鯖(PC)でも
それなりに動くモノを考えているわけです。

>>655
 ハッカー戦も面白そうなんやけど(攻撃経路が変わってラグ差で負けたとか)、
攻撃方法のビジュアル化がなかなか難しいなぁ。攻殻機動隊2の描写もけっこう
単調になってるし。

>>656
 ありがとー。
0658名前は開発中のものです。03/02/22 13:45ID:GmlVLw2J
>>657
そういうことね…。

そうすると、親同士の戦闘が1対1なら問題ないけど、
多対多になると、親同士の通信が問題だね。
ここにP2Pの(ブロードキャスト)ネットワークを使おうってこと?

というか、この方法だとラグが馬鹿でかそう。
リアルタイムには向かんと予想。
0659名前は開発中のものです。03/02/22 15:45ID:Et9zQqhM
親Aの子aと親Bの子bのやり取りが面倒臭そう。
0660416 ◆quHoSW/FCI 03/02/24 03:42ID:tU4jUkpn
 あー、空間単位の処理判定は、「プリテン前銀行(要はユーザーが一ヶ所に
集中したときの負荷)」の問題があったんや。強力な鯖でないと無理やから不採用。

>>658
 親同士の通信量問題は、アプリケーション・プロトコルの低バイト化や圧縮と、
判定処理の頻度を下げる方法があるやね。
 「a子─a親─b子」としたり「a子─b子」にするような経路の短縮化もありだけど、
IPがより多くにさらけ出される状況は、あんまり好かんやろしなぁ。

 ラグは・・・ADSL以上だと平均0.2秒以下(TCP)だったか。56Kが平均0.5秒だから
もっと速かったかな。ラグが大きいときは、判定範囲を広げるのが楽なんだが、
スタートレックみたく、本体判定じゃなくてEフィールドだと判定が広く取れる。

>>659
 全体を見ると
「a子─a親─b親─b子」やけど、実際には
「a親─a子」「a親─b親」「b親─b子」のパターンの組み合わせなんよ。
 ぶっちゃけ、時間軸を無視した独立スレッドにしても可。
0661名前は開発中のものです。03/02/24 08:18ID:0QZAzSjo
>>660
>親同士の通信量問題は、アプリケーション・プロトコルの低バイト化や圧縮と、
そうじゃなくて、同じ場所に親が20サーバくらい集まってきたら?って言う話。
20サーバがそれぞれ他の19サーバと通信するの?
0662416 ◆quHoSW/FCI 03/02/25 06:55ID:7RB6Pij3
>>661
 そういうことになりますな。もちろんポートは1つで事足りますがー。

 一応、親に子が16ぐらいぶら下がることを想定していて、あとは、主鯖に親が
いくつぶら下がるかですな。これも16なら最大256+16参加。
 しかしながらADSL(上下1M)なら、1つの鯖でも512くらいならさばける予感も
しないでもなく。けど、512箇所へ送信するCPU負荷はものすごいものになる悪寒。

 帯域だけじゃなくてパケットを作る時間も考えないといけないし。
 うちのPC、ギガってないし・・・。
0663名前は開発中のものです。03/02/25 22:38ID:KX+31/mx
主鯖?
0664名前は開発中のものです。03/02/26 20:52ID:Mnbpt9dp
UDP通信で上がりと下りに一つづつポートを用意したんだけど、これって無駄かな?
上がりと下りでぶつかるってことがないなら、統一し方がいいような・・・
誰かおせーて。
0665 ◆LaMxrMc/mk 03/02/26 23:07ID:E53rEbuD
>>664
別に大丈夫です。衝突諸々の問題は、TCPやUDPよりずっと下の層でなんとかして
くれているので。
0666名前は開発中のものです。03/02/27 00:16ID:JgISecEd
>>665
レスありがとう。
やっぱり、無駄だったのか・・・
ポートをまとめようと思います。
0667名前は開発中のものです。03/03/08 21:19ID:jh6KoF1V
ROBROBさんのとこ新Ver公開されてるね。

それにしても下がりすぎ。
0668名前は開発中のものです。03/03/08 21:58ID:5nHgOgta
いい!
http://hkwr.com/
0669あぼーんNGNG
あぼーん
■ このスレッドは過去ログ倉庫に格納されています