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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
19k
LanceDB入門
mocobeta
8
560
カートの信頼性を担保するWireMockを使ったe2eテスト
ykagano
0
350
[ChatGPT Work LT]事務作業が苦手な人のための バックオフィスの「半」自動化
chimaki_iot
0
300
なぜ Temporal の大小比較には compare しかないのか / Why Does Temporal Only Have compare() for Comparisons
kazukihayase
1
130
グローバル基準のSREは、運用現場でどう機能したか:成熟度アセスメントの実践 / SRE NEXT 2026
sorawatanabe
0
260
ハーレムエンジニアリング
kazuma777777
0
170
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.4k
Breaking the Seal: Static Deobfuscation of Compiled V8 JavaScript Bytecode Malware
hshrzd
0
820
生成 AI の基礎 〜 サンプル実装で学ぶ基本原理
enakai00
7
4.4k
FPGAが実現する遠方宇宙の高空間分解能天体撮影 -大型地上望遠鏡の視力を補正する「補償光学」とは?-
komei_mt
0
270
Agent 時代の Kaggle 展望 / kaggle-in-the-agentic-era
upura
1
770
Featured
See All Featured
The SEO Collaboration Effect
kristinabergwall1
1
520
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
610
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
240
4 Signs Your Business is Dying
shpigford
187
23k
Building Adaptive Systems
keathley
44
3.2k
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
A better future with KSS
kneath
240
18k
Optimizing for Happiness
mojombo
378
71k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
390
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
300
Are puppies a ranking factor?
jonoalderson
1
3.8k
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/