Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MMOの作り方
Search
kenjihanada
February 22, 2019
Technology
2.9k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
MMOの作り方
by july1997
kenjihanada
February 22, 2019
More Decks by kenjihanada
See All by kenjihanada
Akatsuki Summer Internship 2019 インターン成果発表
kenjihanada
0
2.3k
ゼロから始めるGo Modules
kenjihanada
0
2.9k
俺はビッグエンディアンでテストがしたいんだ!
kenjihanada
0
3k
今風トゥーンシェーディング
kenjihanada
0
3.2k
お父さんが教えるプログラミング教育
kenjihanada
0
2.8k
Other Decks in Technology
See All in Technology
取引先から届く 「セキュリティチェックシート」の読み解き方
kamadamakoto
0
110
ボトムアップ文化が強い組織で セキュリティをどう根付かせていくかの現在進行形の話 / Making Security Stick in a Bottom-Up Organization
yamaguchitk333
0
130
サイバー捜査員研修(前半)
nomizone
1
1.7k
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
1.3k
Digitization部 紹介資料
sansan33
PRO
2
7.7k
最高のシステムプロンプトを作るためにフィードバック機能を導入した話
alchemy1115
1
330
第3回しろおびセキュリティスポンサーセッション
log0417
0
150
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
19k
タクシーアプリ『GO』の実践的データ活用〜位置情報データの収集とStreamlitでの可視化〜
mot_techtalk
2
200
AIが自社のTableauを操作する世界へ:Tableau MCP超入門
tbtykk
0
110
つくって納得、つかって実感! 大規模言語モデルことはじめ ver2.0
recruitengineers
PRO
2
780
ウォーターフォール開発案件のPMとしてAI活用を模索している話
hatahata021
3
310
Featured
See All Featured
Visualization
eitanlees
152
17k
Un-Boring Meetings
codingconduct
0
370
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
420
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
460
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
480
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
119
120k
Evolving SEO for Evolving Search Engines
ryanjones
0
250
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
480
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
390
Transcript
MMOの作り方 Akatsuki Geek Live【LT会:2/22(金)】 1 twitter : @AQUA_july Email:
[email protected]
Github:https://github.com/july1997
自己紹介 HN: july1997 • 東北学院大学教養学部情報科学3年 本間 心 • 現在(wdm合同会社・仙台)ー プログラマー • たまにクラウドソーシングでプログラミング
• シェーダーとかもいじれます、PBRなど 2
概要 MikuMikuSpace サイト:https://mikumikuspace.ddo.jp/ 好きなMMDのモデルを操作できて、みんなで動画が見られたり、チャット機能のあるオン ラインゲーム。 制作人数:1人 3
4
制作の目的 5 • オンラインゲーム作りたい、技術的に関心がある • ゲームサーバー側の処理は何をどうすればいいか学びたい
クライアント編 6 やっていること • MMDモデルの描画、アニメーション • 物理演算 • ネットワーク通信 •
動画の取得、再生
開発環境 Visual Studio 2017 使用言語:C++ 使用ライブラリなど • Bullet 2.87 •
Crypto++ 5.6.5 • DXライブラリ Ver 3.20a • EffekseerRuntime 1.40 対象プラットフォーム WIndows、Android 7
ライブラリの紹介 描画処理 DXライブラリ • DirectXのラッパー(最近はAndroidにも 対応) • MMDモデル等に対応 • 更新頻度が高く初心者にオススメ
URL : http://dxlib.o.oo7.jp/index.html 物理演算 Bullet Physics • オープンソースの物理演算エンジン • ゲーム内では常に物理演算 • 色々な市販のゲームなどに使われたりし てる URL : http://bulletphysics.org/wordpress/ 8
ネットワーク関係の実装 • 描画の処理と別スレッドでメッセージを送受信 (TCP) • std::shared_ptrを用いてスレッドセーフに • 通信機能自体はDXライブラリにある機能を利用 9 Server
Player1 Player2 Player3 TCP
ID 1byte mess 3~6 byte データ (UTF-8) nbyte 10 プロトコル
• 通信の種別(ID)と通信内容(mess)をつけて 送信、スペース区切り • サーバーはプレイヤーの IDを付けたりして他 のプレーヤーに送信 Server Player1 Player2 3 RES 1 こんにちは! Player1 : こんにちは! 3 RES こんにちは! プロトコル TCP
送信データ • 移動時は30フレームごとに進行方向 のベクトルと回転の速度を送信、それ をもとに補完処理 • 加えて300フレームごとに座標と回転 値(x,y,z,w)を送信 • アニメーションは切り替わったタイミン
グで適時送信 11 方向データ キャラの方向ベクトル、 ±回転速度 座標データ キャラの絶対座標と キャラの姿勢 アニメーション 情報 再生するアニメーショ ン サーバー 受け取ったタイミ ングで他のプレイ ヤーに送信
プレーヤーの同期 • 一定期間でサーバー側がプレーヤーとの距離などで、そのプレーヤーがどのプレイヤーと同 期するのか決定 • サーバーから同期するプレーヤーのリストを受け取り、リストから消えたユーザーは削除処 理、加わったプレーヤーは追加処理を行う • モデルIDを送信して、クライアントが所持してなければダウンロードさせる 12
動画再生の仕組み • youtube-dl https://github.com/rg3/youtube-dl/ youtube-dlを使用して動画をダウンロードしながら再生。 ゲーム内ではテクスチャとして適用してゲーム内での動画再生を可能に キャッシュ(一時的に使用するためのダウンロード )にしているので問題は無いと思う 対応サイト1000以上 例(一部抜粋):youtube、ニコニコ動画等
13
14 サーバー編 やっていること • プレーヤーの同期 • ユーザーデータの管理 • セキュリティ対策 •
バージョンの通知 • モデルデータの同期
開発環境/サーバー サーバー • Ubuntu 18.04.1 LTS(AWS EC2) 開発環境 • Visual
Studio Code • 使用言語:C++ • SSH FSという拡張機能を使って編集 (おすすめ) 使用ライブラリなど • Boost 1.66 • Crypto++ • MySQL Connector/C++ 15
サーバーの種類 ゲームサーバー • プレイヤーの座標などの同期、ゲームに 関する機能を持つサーバー • ログインやデータベース登録、暗号化の 鍵交換なども全部自作 • Port
13939で常に通信待機 16 ウェブサーバー • PHPのサーバー、Laravelで作成 • 通常の表示の他、モデルファイルのアッ プロードとダウンロードを担当 • 他にもバージョンを通知したり、アップ デート等があればここに接続
ゲームサーバー 使用ライブラリ Boost.Asio • Linuxで動かすためC++でTCPが直接扱えるBoostを使用 • 実際のオンラインゲームのサーバーでも使われる • データベースへの接続は MySQL
Connector/C++を使用 17
データベース MySQL • アカウント登録はemailとパスワード、名前等 • パスワードは流出時を考え、 sha256二重で保存 • 文字コードはutf8_binなど照合順序をちゃんと考えよう 18
//ユーザー情報テーブル CREATE TABLE user_data( `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,, `email` varchar(256) NOT NULL, `password` varchar(256) NOT NULL, `name` varchar(40) NOT NULL , `create_date` DATETIME DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`user_id`)); //モデル情報テーブル CREATE TABLE model_data( `model_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(10) unsigned, `model_name` varchar(40), `model_file_pash` varchar(256), `model_file_name` varchar(256), `model_type` TINYINT, `upload_date` DATETIME DEFAULT CURRENT_TIMESTAMP, `permit` TINYINT DEFAULT 1, PRIMARY KEY (`model_id`)); //アクセスキー CREATE TABLE access_key( `access_number` int(10) unsigned NOT NULL, `access_key` varchar(10) NOT NULL, … テーブル構成
セキュリティ 暗号化 • サーバーから 4096bit RSA 公開鍵を送信 • クライアントは 128bit
AES CFB 共通鍵を暗号化し送信、以後は AESで暗号化して通信 • 公開鍵はランダムで作成し送信、署名を発行し、中間者攻撃以外には対応 • AESのセットアップ完了後通信開始、ログイン処理等 Dos対策 • 一定時間でデータ量が規定値を超えるとコマンド無視 • さらに座標値をチェックし、不正な移動の場合は座標初期化 • ログイン時は3回間違えたら切断 19
モデル同期 • モデルデータはサイトにアップロード、バリ デーション、データベース登録 • ダウンロード時にモデル IDを指定、アクセ スキーを取得 • 受け取ったデータ(Zip)は自動解凍して、
フォルダに配置(/Models/【モデルID】) • 読み込み時は設定ファイル (/Models/.config/【モデルID】.json)の情報 から読み込み処理 *アクセスキーは10桁のランダムな文字列 20 ゲームサー バー クライアント ダウンロード要求 アクセスキー ウェブサー バー アクセスキー (クエリに指定) モデルデータ(Zip) ウェブサー バー ユーザー モデルデータアップロード (Zip) モデルID
最後に 21
作ってみた感想 • 通信系の実装はデバッグなどが大変、暗号系も謎に復号化できないときがあり大変だった • これからゲームを作りたい人は Unityを使ってください • DXライブラリではモデルのリソース管理が困難 …(アニメーションとかその場で追加して再生が できない)、物理演算が事前計算で重い、リアルタイムだと破綻する
• コーディングでは積極的にテストを書いて行くのが良いと思う(あまり書けていない) 22
C++関係オススメの本 C++テンプレートテクニック 23 珠玉のプログラミング 人生を変える一冊。 テンプレートを使ったことない 人も、ある人も読める。 テンプレートの理解が根本から 変わる。 あとコーディングの参考にもな
る。 色々なアルゴリズムが乗ってい る。 ソートやらなにやら プログラムの最適化、高速化 にどうぞ 競プロにも使えそう。
終わり 24 twitter : @AQUA_july Email:
[email protected]
25 MikuMikuSpaceよろしくお願いします! https://mikumikuspace.ddo.jp/