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
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
240
サイバー捜査員研修(前半)
nomizone
1
2k
Head First モブプログラミング / Head First Mobprogramming
takaking22
10
12k
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
130
【CEDEC2026】Creative Approaches to Localizing the Dialects and Unique Speech of Umamusume: Pretty Derby Characters in English
cygames
PRO
3
24k
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
350
関東Kaggler会発表資料
takoi
1
240
Breaking the Seal: Static Deobfuscation of Compiled V8 JavaScript Bytecode Malware
hshrzd
0
820
TypeScript入門 2026
recruitengineers
PRO
3
610
SO-101×VLAによる3色キューブのピック&プレース
abeja
0
210
20260807_第6回_関東kaggler会LT_claw系bot xangiと始める、"寂しくない" kaggle
sugupoko
0
300
LLM・AIエージェントシステムベストプラクティス
shibuiwilliam
6
1.4k
Featured
See All Featured
My Coaching Mixtape
mlcsv
0
230
Navigating Weather and Climate Data
rabernat
0
480
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
WENDY [Excerpt]
tessaabrams
11
39k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.4k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
470
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
66
57k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
460
Docker and Python
trallard
47
4.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
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/