Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
Satoshi Yamafuji
PPTX, PDF
20,232 views
Imprementation of realtime_networkgame
2016.05.28 GameServerDevelopers リアルタイム通信ゲームの実装例
Engineering
◦
Read more
17
Save
Share
Embed
Embed presentation
Download
Downloaded 25 times
1
/ 63
2
/ 63
3
/ 63
4
/ 63
5
/ 63
6
/ 63
7
/ 63
8
/ 63
9
/ 63
10
/ 63
11
/ 63
12
/ 63
13
/ 63
14
/ 63
15
/ 63
16
/ 63
17
/ 63
18
/ 63
19
/ 63
20
/ 63
21
/ 63
22
/ 63
23
/ 63
24
/ 63
25
/ 63
26
/ 63
27
/ 63
28
/ 63
29
/ 63
30
/ 63
31
/ 63
32
/ 63
33
/ 63
34
/ 63
35
/ 63
36
/ 63
37
/ 63
38
/ 63
39
/ 63
40
/ 63
41
/ 63
42
/ 63
43
/ 63
44
/ 63
45
/ 63
46
/ 63
47
/ 63
48
/ 63
49
/ 63
50
/ 63
51
/ 63
52
/ 63
53
/ 63
54
/ 63
55
/ 63
56
/ 63
57
/ 63
58
/ 63
59
/ 63
60
/ 63
61
/ 63
62
/ 63
63
/ 63
More Related Content
PDF
Building the Game Server both API and Realtime via c#
by
Yoshifumi Kawai
PDF
Embulkを活用したログ管理システム
by
Akihiro Ikezoe
PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
by
Yoshifumi Kawai
PPTX
EmbulkとDigdagとデータ分析基盤と
by
Toru Takahashi
PDF
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
by
Yoshifumi Kawai
PDF
東京Node学園 今できる通信高速化にトライしてみた
by
Yoshiki Shibukawa
PDF
Ruby で高速なプログラムを書く
by
mametter
PDF
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
by
Yoshifumi Kawai
Building the Game Server both API and Realtime via c#
by
Yoshifumi Kawai
Embulkを活用したログ管理システム
by
Akihiro Ikezoe
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
by
Yoshifumi Kawai
EmbulkとDigdagとデータ分析基盤と
by
Toru Takahashi
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
by
Yoshifumi Kawai
東京Node学園 今できる通信高速化にトライしてみた
by
Yoshiki Shibukawa
Ruby で高速なプログラムを書く
by
mametter
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
by
Yoshifumi Kawai
What's hot
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
by
UnityTechnologiesJapan002
PPTX
Chunked encoding を使った高速化の考察
by
Yoshiki Shibukawa
PDF
分割と整合性と戦う
by
Yugo Shimizu
PDF
Implements OpenTelemetry Collector in DotNet
by
Yoshifumi Kawai
PPTX
Gocon2017:Goのロギング周りの考察
by
貴仁 大和屋
PDF
Python × Herokuで作る 雑談slack bot
by
dcubeio
PDF
The Usage and Patterns of MagicOnion
by
Yoshifumi Kawai
PDF
A quick tour of the Cysharp OSS
by
Yoshifumi Kawai
PPTX
最速C# 7.x
by
Yamamoto Reki
PDF
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
by
mametter
PDF
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
by
Yoshifumi Kawai
PDF
Rubyの会社でPythonistaが3ヶ月生き延びた話
by
Tokoroten Nakayama
PDF
[Postgre sql9.4新機能]レプリケーション・スロットの活用
by
Kosuke Kida
PDF
NextGen Server/Client Architecture - gRPC + Unity + C#
by
Yoshifumi Kawai
PDF
DXライブラリでMMO作ったよ!
by
h2so5
PDF
Machine learning CI/CD with OSS
by
yusuke shibui
PDF
僕とヤフーと時々Teradata #prestodb
by
Yahoo!デベロッパーネットワーク
PDF
ソーシャルアプリを分析してみた
by
Drecom Co., Ltd.
PPTX
今さら聞けない人のためのGitLabの始め方 Ubuntu編
by
VirtualTech Japan Inc./Begi.net Inc.
PDF
Multipeer connectivityを使った 動画のリアルタイム端末間共有
by
Imajin Kawabe
【Unite Tokyo 2019】Understanding C# Struct All Things
by
UnityTechnologiesJapan002
Chunked encoding を使った高速化の考察
by
Yoshiki Shibukawa
分割と整合性と戦う
by
Yugo Shimizu
Implements OpenTelemetry Collector in DotNet
by
Yoshifumi Kawai
Gocon2017:Goのロギング周りの考察
by
貴仁 大和屋
Python × Herokuで作る 雑談slack bot
by
dcubeio
The Usage and Patterns of MagicOnion
by
Yoshifumi Kawai
A quick tour of the Cysharp OSS
by
Yoshifumi Kawai
最速C# 7.x
by
Yamamoto Reki
超絶技巧プログラミングと Ruby 3.0 (大江戸 Ruby 会議 05 コミッタ LT)
by
mametter
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
by
Yoshifumi Kawai
Rubyの会社でPythonistaが3ヶ月生き延びた話
by
Tokoroten Nakayama
[Postgre sql9.4新機能]レプリケーション・スロットの活用
by
Kosuke Kida
NextGen Server/Client Architecture - gRPC + Unity + C#
by
Yoshifumi Kawai
DXライブラリでMMO作ったよ!
by
h2so5
Machine learning CI/CD with OSS
by
yusuke shibui
僕とヤフーと時々Teradata #prestodb
by
Yahoo!デベロッパーネットワーク
ソーシャルアプリを分析してみた
by
Drecom Co., Ltd.
今さら聞けない人のためのGitLabの始め方 Ubuntu編
by
VirtualTech Japan Inc./Begi.net Inc.
Multipeer connectivityを使った 動画のリアルタイム端末間共有
by
Imajin Kawabe
Viewers also liked
PDF
サーバーのおしごと
by
Yugo Shimizu
PDF
負荷がたかいいんだから~♪(仮)
by
Yohei Hamada
PPTX
MMOのサーバについて 剣と魔法のログレス ~いにしえの女神~ での実装例
by
Satoshi Yamafuji
PDF
Fluentd and Embulk Game Server 4
by
N Masahiro
PDF
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】
by
Youichiro Miyake
PPTX
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
by
Yugo Shimizu
PDF
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
by
johgus johgus
PDF
自宅で出来る!ゲームサーバの作り方
by
光晶 上原
PDF
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
by
Manabu Koga
PDF
ゲームサーバ開発現場の考え方
by
Daisaku Mochizuki
サーバーのおしごと
by
Yugo Shimizu
負荷がたかいいんだから~♪(仮)
by
Yohei Hamada
MMOのサーバについて 剣と魔法のログレス ~いにしえの女神~ での実装例
by
Satoshi Yamafuji
Fluentd and Embulk Game Server 4
by
N Masahiro
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】
by
Youichiro Miyake
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
by
Yugo Shimizu
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
by
johgus johgus
自宅で出来る!ゲームサーバの作り方
by
光晶 上原
サーバー未経験者がソーシャルゲームを通して知ったサーバーの事
by
Manabu Koga
ゲームサーバ開発現場の考え方
by
Daisaku Mochizuki
Similar to Imprementation of realtime_networkgame
PPTX
Mmo game networking_1
by
Katsutoshi Makino
PDF
ガールアックス:リアルタイム通信処理の効率的な実装
by
dena_study
PPTX
ゲームの通信をつくる仕事はどうなるのだろう?
by
Kengo Nakajima
PDF
Hokkaido.cap#2 一般的なプロトコルのパケットを覗いてみよう
by
Panda Yamaki
PPT
20060520.tcp
by
Ken SASAKI
PDF
20220602コンピュータネットワーク.pdf
by
risakitagawa
PDF
第7回勉強会 ネットワークの基礎
by
hakoika-itwg
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
by
Naoya Kishimoto
PDF
Rps・rfs等最新linux kernel事例
by
Takuya ASADA
PDF
197x Timer with Your Messages
by
Kuniaki Igarashi
PDF
ゲーム会社でのRuby : rails活用事例
by
Yasutomo Uemori
PPTX
リアルタイム性に厳しいアプリケーションに対する通信遅延を考慮した実装と通信遅延を抑えるための研究
by
Takaaki Sawa
PDF
法政大学情報科学部 2012年度コンピュータネットワーク-第11回授業-Web公開用
by
Ruo Ando
PPT
Agu itr 20100901_communication
by
Kiminari Homma
PDF
Armored core vのオンラインサービスにおけるクラウドサーバー活用事例
by
erakazu
PDF
CEDEC 2025 『ゲームにおけるリアルタイム通信への QUIC導入事例の紹介』
by
SEGADevTech
PDF
DNSのRFCの歩き方
by
Takashi Takizawa
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
PPTX
透過型確率的パケットマーキング装置の提案と開発(オープンルータコンペティション発表資料)
by
Akira Kanaoka
PDF
10分で作るクラスライブラリ
by
_norin_
Mmo game networking_1
by
Katsutoshi Makino
ガールアックス:リアルタイム通信処理の効率的な実装
by
dena_study
ゲームの通信をつくる仕事はどうなるのだろう?
by
Kengo Nakajima
Hokkaido.cap#2 一般的なプロトコルのパケットを覗いてみよう
by
Panda Yamaki
20060520.tcp
by
Ken SASAKI
20220602コンピュータネットワーク.pdf
by
risakitagawa
第7回勉強会 ネットワークの基礎
by
hakoika-itwg
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
by
Naoya Kishimoto
Rps・rfs等最新linux kernel事例
by
Takuya ASADA
197x Timer with Your Messages
by
Kuniaki Igarashi
ゲーム会社でのRuby : rails活用事例
by
Yasutomo Uemori
リアルタイム性に厳しいアプリケーションに対する通信遅延を考慮した実装と通信遅延を抑えるための研究
by
Takaaki Sawa
法政大学情報科学部 2012年度コンピュータネットワーク-第11回授業-Web公開用
by
Ruo Ando
Agu itr 20100901_communication
by
Kiminari Homma
Armored core vのオンラインサービスにおけるクラウドサーバー活用事例
by
erakazu
CEDEC 2025 『ゲームにおけるリアルタイム通信への QUIC導入事例の紹介』
by
SEGADevTech
DNSのRFCの歩き方
by
Takashi Takizawa
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
透過型確率的パケットマーキング装置の提案と開発(オープンルータコンペティション発表資料)
by
Akira Kanaoka
10分で作るクラスライブラリ
by
_norin_
Imprementation of realtime_networkgame
1.
リアルタイム通信ゲームの 実装例 2016.5.28 株式会社Aiming 山藤 智之
2.
自己紹介 • 山藤 智之 •
株式会社Aiming所属 • 携わった作品 – Blade Chronicle – 剣と魔法のログレス(PC) – 剣と魔法のログレス いにしえの女神 • 猫大好き!猫アレルギー系エンジニア
3.
Aiming? • オンラインゲームの会社 • 各職人材募集中です!!
4.
今日の内容 • オンラインゲームを作るのに必要になる 通信技術のお話 – 通信規格 –
通信内容 – 通信ライブラリ • RPC(Remote Procedure Call) • IDL (Interface Definition Language)
5.
通信規格 • UDP – 単方向通信 •
届いたか?までは責任持たない • 保証しようとするとTCPと同じ処理をアプリケー ション側で適切に実装しないといけない • TCP – 双方向通信 • 配送が順序通り届いた事を保証してくれる • UDPに比べて速度は遅い • UDPに比べて通信量は多い
6.
常時接続 / 非常時接続 •
非常時接続(単方向通信) • リクエストに対してリプライ • クライアントからの要求が必須
7.
常時接続 / 非常時接続 •
常時接続(双方向通信) • リクエストに対してリプライ • サーバ側からのプッシュが可能 • クライアントに要求できる
8.
通信内容 • キーフレーム形式 – フレーム毎のコントローラーからの入力を交換し 合う –
対戦格闘ゲームとかで有効 • メッセージ形式 – 手続き呼び出しをメッセージ化して、必要なパラ メータをやり取りする – MMOとかで有効 – 手続き毎にコードを記述するので大規模向き • ゲーム、プロジェクト規模に合わせて適切な 企画・形式を選ぶ
9.
メッセージ / キーフレーム •
通信量の少なさ – キーフレーム > メッセージ • 処理の簡単さ(高速) – キーフレーム > メッセージ • 拡張の容易さ – メッセージ > キーフレーム • 複雑なデータのやり取りのし易さ – メッセージ > キーフレーム
10.
通信ライブラリ • 作った理由 – 社内共通ライブラリにしたかった •
アプリケーションの移植性向上 – 当時はあまりちゃんとした物がなかった – 送信・受信時のメモリ管理をキチンとやりた かった – 自社製品のそれまでのノウハウを活かした かった
11.
通信ライブラリ • 要件 – とりあえずメッセージベースの物 –
アプリケーションが変わっても、あまり変わ らないネットワーク処理部分を分離させた物 – クライアント端末が変わっても大丈夫な様に • PC • スマホ • 家庭用ゲーム機
12.
通信ライブラリ • 主にこの部分
13.
通信ライブラリ • 主にこの部分
14.
通信ライブラリ • 主にこの部分 Windows WinSock Linux Unix Socket Mac BSD
Socket ソケットをラップした何か 通信関数 ゲームアプリケーション
15.
通信ライブラリ • 主にこの部分 Windows WinSock Linux Unix Socket Mac BSD
Socket ソケットをラップした何か 通信関数 ゲームアプリケーション
16.
通信ライブラリ • メッセージ形式を利用したライブラリ – ソケット部分のコード •
幾つかのプラットフォームをサポート • 異なるプラットフォーム間での通信の提供 – RPC(Remote Procedure Call)の提供 • プログラム記述難易度の低減 • 通信プロトコルの隠蔽 – HTTP / ゲーム専用プロトコル – IDL(Interface Definition Language)の提 供
17.
RPC (Remote Procedure
Call) • プログラムから別のマシンで動いている サブルーチン(手続き)を呼び出す仕組 み • 通常はネットワーク越しに、通信対象の マシンで動作するプログラムの手続きを 呼び出す
18.
RPC (Remote Procedure
Call) Network.function_call(“デザイナー”); void function_call(std::string types) { printf(“%s募集中n” , types); }こんな感じに書くと コレが実行される
19.
RPCを実現するために • RPCを実現する為に必要になりそうな情報 – どの関数を呼ぶ? –
各関数に渡さないといけない引数リスト • 呼び出し順序の保障 • 適切な単位(メッセージ毎)の受信 – 引数が途中で途切れたりしない様に • バイトオーダーの吸収 – リトルエンディアン / ビッグエンディアン
20.
リトルエンディアン 8bit 16bit • バイトオーダーに影響を受けない数値の 受け渡し方 ビッグエンディアン データの表現 0A 0B
0C 0D 0A0B 0C0D 0D 0C 0B 0A 0C0D 0A0B 8bit 16bit 整数値 0x0A0B0C0D
21.
データの表現 • バイトオーダーが異なる2台で通信する と…? 0D 0C
0B 0A 整数値 0x0A0B0C0D リトルエンディアン 8Bit リトルエンディアン 16Bit 0D0C 0B0A 整数値 0x0B0A0D0C メモリのイメージをそのまま移すと
22.
データの表現 • バイトオーダーが異なる2台で通信する と…? 0D 0C
0B 0A リトルエンディアン 8Bit リトルエンディアン 16Bit 0D0C 0B0A メモリのイメージをそのまま移すと 表現したい数値が変 わってしまう!! 整数値 0x0A0B0C0D 整数値 0x0B0A0D0C
23.
• バイトオーダーに影響を受けない数値の 受け渡し方 データの表現 0D 0C
0B 0A 送りたい数値 リトルエンディアン 8Bit リトルエンディアン 16Bit
24.
• バイトオーダーに影響を受けない数値の 受け渡し方 データの表現 0A 0B
0C 0D 0D 0C 0B 0A 送りたい数値 ネットワーク経路上 一度整列 リトルエンディアン 8Bit リトルエンディアン 16Bit
25.
• バイトオーダーに影響を受けない数値の 受け渡し方 データの表現 0A 0B
0C 0D 0D 0C 0B 0A 0C0D 0A0B 送りたい数値 受信側受け取り時 リトルエンディアン 8Bit リトルエンディアン 16Bit ネットワーク経路上 一度整列
26.
• 数値をやり取りする際の容量軽減 – 小さい数値のやり取りが多い場合有効 整数値
0x00000A0B データの表現 0A 0B 00 00
27.
整数値 0x00000A0B • 数値をやり取りする際の容量軽減 –
小さい数値のやり取りが多い場合有効 データの表現 0A 0B 00 00 0000_0000 0000_0000 0000_1010 0000_1011
28.
整数値 0x00000A0B • 数値をやり取りする際の容量軽減 –
小さい数値のやり取りが多い場合有効 データの表現 0A 0B 00 00 0000_0000 0000_0000 0000_1010 0000_1011 011000_0101 後続するデータがあるので最上位は1
29.
整数値 0x00000A0B • 数値をやり取りする際の容量軽減 –
小さい数値のやり取りが多い場合有効 データの表現 0A 0B 00 00 0000_0000 0000_0000 0000_1010 0000_1011 0101100_00101000_0101 後続するデータがあるので最上位は1
30.
整数値 0x00000A0B • 数値をやり取りする際の容量軽減 –
小さい数値のやり取りが多い場合有効 データの表現 0A 0B 00 00 0000_0000 0000_0000 0000_1010 0000_1011 0100_00001100_0010 00001000_0101 後続するデータが無いので最上位は0
31.
整数値 0x00000A0B • 数値をやり取りする際の容量軽減 –
小さい数値のやり取りが多い場合有効 データの表現 0A 0B 00 00 0000_0000 0000_0000 0000_1010 0000_1011 0100_00001100_0010 0000_00001000_0101 0000_0---
32.
整数値 0x00000A0B • 数値をやり取りする際の容量軽減 –
小さい数値のやり取りが多い場合有効 データの表現 0A 0B 00 00 0000_0000 0000_0000 0000_1010 0000_1011 0000_00000100_00001100_0010 0000_00001000_0101 この2Byteは送らなくても良くなる
33.
パケット構造 • RPCを実現する為に必要になる通信内容 – プロトコルバージョン番号 •
エンコード、デコード形式 – 制御用カウンタ • 何回目の通信なのか? – どの関数を呼ぶ? • 関数番号(ID) – 関数に合わせた引数 • 関数毎に引数の数、型、長さが変わる – 1手続きを実行するのに必要なデータ総容量 • 正しく受信するために必要
34.
圧縮有 圧縮無 パケット構造 Version (1Byte) PacketNumber (4Byte) PayloadSize (4Byte) Compress (1Byte) Size (4Byte) CompressData (Size) MessageID (4Byte) Parameters Compress (1Byte) MessageID (4Byte) Parameters Payload (PayloadSize)
35.
レイヤー構造による処理 • 送信 /
受信で処理する順にレイヤを構築 Compressor データの圧縮 SplitToContract メッセージ一つを処理 Packetize 送受信ヘッダー処理 送信 受信
36.
レイヤー構造による処理 • 各レイヤーで行う処理 必要に応じて圧縮 メッセージデータをバイナリストリーム化 ネットワークに流す形式に変換 送信 受信 ネットワークから流れてきたデータの変換 必要に応じて伸長 バイナリストリームのメッセージ化 OS低レベルAPIによる送受信処理
37.
データの流れ Compressor データの圧縮 SplitToContract メッセージ一つを処理 Packetize 送受信ヘッダー処理 送信 受信 MessageID (4Byte) Parameters
38.
データの流れ Compressor データの圧縮 SplitToContract メッセージ一つを処理 Packetize 送受信ヘッダー処理 送信 受信 MessageID (4Byte) Parameters Compress (1Byte)
39.
データの流れ Version (1Byte) PacketNumber (4Byte) PayloadSize (4Byte) MessageID (4Byte) Parameters Compress (1Byte) Compressor データの圧縮 SplitToContract メッセージ一つを処理 Packetize 送受信ヘッダー処理 送信 受信
40.
データの流れ Compressor データの圧縮 SplitToContract メッセージ一つを処理 Packetize 送受信ヘッダー処理 送信 受信 Version (1Byte) PacketNumber (4Byte) PayloadSize (4Byte) MessageID (4Byte) Parameters Compress (1Byte)
41.
データの流れ Compressor データの圧縮 SplitToContract メッセージ一つを処理 Packetize 送受信ヘッダー処理 送信 受信 Version (1Byte) PacketNumber (4Byte) PayloadSize (4Byte) MessageID (4Byte) Parameters Compress (1Byte)
42.
データの流れ Compressor データの圧縮 SplitToContract メッセージ一つを処理 Packetize 送受信ヘッダー処理 送信 受信 MessageID (4Byte) Parameters Compress (1Byte)
43.
データの流れ Compressor データの圧縮 SplitToContract メッセージ一つを処理 Packetize 送受信ヘッダー処理 送信 受信 MessageID (4Byte) Parameters
44.
データの流れ Compressor データの圧縮 SplitToContract メッセージ一つを処理 Packetize 送受信ヘッダー処理 送信 受信 関数呼び出し MessageID (4Byte) Parameters
45.
実装における問題点 • 通信内容を一つ追加する都度、追加・修 正しないといけないコード量が多い – 送信関数 –
受信関数 – 受信関数の呼び分け部分(Dispatcher) • これを簡易化する為に IDL(Interface Definition Language)を用意する
46.
IDL • IDL(Interface Definition
Language) – 通信に載るメッセージ(RPC)の内容定義を 抽象化した物 – マルチプラットフォーム向けに変数定義 (型)も抽象化する • この定義を元に、最低限必要になるコー ドを自動生成する仕組み • 定義ファイルとコードジェネレータ
47.
IDL • 送信側 – 受信側が識別可能な一意なメッセージID –
メッセージ毎のパラメータ格納 • 受信側 – どのメッセージを受信したのか?(適切な手 続きの呼び出し) – メッセージ毎のパラメータ展開 • 受信後の処理はアプリケーションレベル の実装
48.
IDL サーバ用 受信 クライアント用
送信 メッセージ定義 --------------------- WANTED string Occupation --------------------- Generator
49.
IDL メッセージ定義 --------------------- WANTED string Occupation --------------------- C++ C C++ C サーバ用 受信
クライアント用 送信 Generator
50.
メッセージ定義 --------------------- WANTED string Occupation --------------------- Generator IDL C++ C C++ void send_WANTED(std::string
Occupation); C void send_WANTED(char* Occupation); サーバ用 受信 void WANTED(char* Occupation); クライアント用 送信 void recv_WANTED(std::string Occupation);
51.
IDL • ゲーム内の操作は、こんな感じでメッ セージ化されています。(MMOの場合) MessageID Message
概要 パラメータ 1 CHAT_SEND チャットに発言 Msg:発言内容 2 CHAR_MOVE 移動 X:X座標 Y:Y座標 3 CHAT_SHOW 誰かがチャットした Who:誰が? Msg:何て言った? 4 ATTACK キャラクターが攻撃 Target;誰に攻撃する? How:どうやって攻撃する?
52.
IDL • 実際の例 <?xml version=“1.0”
encoding=“utf-8” standalone=“yes” ?> <contract name=“GameMessage”> <party primary=“Client” secondary=“Server” /> <call name=“CHAT_SEND”> <parameter name=“Msg” type=“String” /> </call> <typedefine name=“id” type=“int” /> <receive name=“CHAT_SHOW”> <parameter name=“Who” type=“id” /> <parameter name=“Msg” type=“String” /> </receive> </contract>
53.
<?xml version=“1.0” encoding=“utf-8”
standalone=“yes” ?> <contract name=“GameMessage”> <party primary=“Client” secondary=“Server” /> <call name=“CHAT_SEND”> <parameter name=“Msg” type=“String” /> </call> <typedefine name=“id” type=“int” /> <receive name=“CHAT_SHOW”> <parameter name=“Who” type=“id” /> <parameter name=“Msg” type=“String” /> </receive> </contract> IDL • 実際の例このメッセージ群(通信定義)の名前
54.
<?xml version=“1.0” encoding=“utf-8”
standalone=“yes” ?> <contract name=“GameMessage”> <party primary=“Client” secondary=“Server” /> <call name=“CHAT_SEND”> <parameter name=“Msg” type=“String” /> </call> <typedefine name=“id” type=“int” /> <receive name=“CHAT_SHOW”> <parameter name=“Who” type=“id” /> <parameter name=“Msg” type=“String” /> </receive> </contract> IDL • 実際の例 以下に記すメッセージ定義の方向指定、 このファイルの場合 “Client to Server” このメッセージ群(通信定義)の名前
55.
<?xml version=“1.0” encoding=“utf-8”
standalone=“yes” ?> <contract name=“GameMessage”> <party primary=“Client” secondary=“Server” /> <call name=“CHAT_SEND”> <parameter name=“Msg” type=“String” /> </call> <typedefine name=“id” type=“int” /> <receive name=“CHAT_SHOW”> <parameter name=“Who” type=“id” /> <parameter name=“Msg” type=“String” /> </receive> </contract> IDL • 実際の例 以下に記すメッセージ定義の方向指定、こ のファイルの場合 “Client to Server” このメッセージ群(通信定義)の名前 call なので Client -> Server Server -> Client
56.
• クライアント typedef id
int; class GameMessageReceiver { public: void dispatch(network_data& data) { function_number = data.pop<int>(); switch (function_number) { case 789012: id Who = data.pop<id>(); std::string Msg = data.pop<std::string>(); CHAT_SHOW(Who, Msg); break; } } virtual void CHAT_SHOW(id Who, std::string Msg) = 0; }; IDL class GameMessageSender { public: void CHAT_SEND(std::string Msg) { push_args<int>(123456); // function number push_args<std::string>(Msg); } };
57.
• サーバー <Client_RPC.h> typedef id
int; class GameMessageReceiver { public: void dispatch(network_data& data) { function_number = data.pop<int>(); switch (function_number) { case 123456: std::string Msg = data.pop<std::string>(); CHAT_SEND(Msg); } } virtual void CHAT_SEND(std::string Msg) = 0; }; IDL class GameMessageSender { public: void CHAT_SHOW(id Who, std::string Msg) { push_args<int>(789012); // function number push_args<id>(Who); push_args<std::string>(Msg); } };
58.
IDL GameMessageSender::CHAT_SEND(“募集中”);
59.
IDL GameMessageReceiver::CHAT_SEND(std::string) { GameMessageSender::CHAT_SHOW(user_id, string); }
60.
IDL GameMessageReceiver::CHAT_SHOW(id Who, std::string) { std::string
name = get_charname(Who); Display(“%s %s”, name, string); } エンジニア 募集中 エンジニア 募集中
61.
まとめ • 通信方式(TCP/UDP/常時/非常時) • 通信内容(メッセージ/キーフレーム) •
通信ライブラリ – RPC • データの表現方法(バイトオーダー) • メッセージの表現(パケット構造) • メッセージを処理するレイヤー構造 – IDL • IDLの例
62.
御清聴ありがとうございました
63.
質疑応答
Download