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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
白金鉱業Meetup_Vol.24_「AIエージェントは分けるほど良い」は本当か? / Is it true that “the more you divide AI agents, the better”?
brainpadpr
1
400
SONiCのLinuxベースを活かしたZabbix監視
sonic
0
180
気づかぬうちにセキュリティ負債を生むAPIキー運用
sgwrmctk
0
160
なぜ Platform Engineering の土台に Kubernetes を選ぶのか
r4ynode
2
650
「エンジニア進化論」2028年の開発完全自動化、エンジニアはどう進化するか
cyberagentdevelopers
PRO
6
5.3k
自律型AIエージェントは何を破壊するのか
kojira
0
160
2026 TECHFRESH 畢業分享會 - 開發日常大解密!從領域驅動到企業級上線
line_developers_tw
PRO
0
1.1k
スキルと MCP ツール、責務をどう分けるか? AI が迷わないインターフェース設計の戦略
cdataj
1
1.1k
AIのReact習熟度を測る
uhyo
2
600
自宅LLMの話
jacopen
1
600
日本 Fintech 未来予測レポート 2027〜2028年(手動編集版)
8maki
0
2.4k
MCP Appsを作ってみよう
iwamot
PRO
4
670
Featured
See All Featured
Side Projects
sachag
455
43k
Prompt Engineering for Job Search
mfonobong
0
340
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
590
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
210
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
300
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Scaling GitHub
holman
464
140k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Test your architecture with Archunit
thirion
1
2.3k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
250
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/