Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
mixC++勉強会@TokyoDXライブラリでMMO作ったよ!
自己紹介HN:   h2so5C++とかRubyとか色々いじってるデザイン系の学生。              http://h2so5.net/              github: @h2so5
MMOっ 何?     て MMD + Online → MMO                              H2SO5MikuMikuDance                         MikuMikuOnline   ...
なぜ作った?•	ネットワークプログラミング面白そう•	パフォーマンス重視なら C++ が活かせるかも•	類似プロジェクトで完成しているものが少ない
クライアント編サーバー編デバッグ編
開発環境  VisualStudio2010•	MinGW+gccを使っていたが色々あって移行•	C++11に対応してないのが残念
描画処理      DXライブラリ     http://homepage2.nifty.com/natupaji/DxLib/•	ソフトウェアのコアとなるライブラリ•	MMDモデルに対応したDirectXのラッパー•	モデル・画像の描画をすべ...
スクリプトV8 JavaScript Engine       https://developers.google.com/v8/•	UIのカスタマイズ・マクロ機能•	チャット機能などはJavaScriptで記述•	UIウィンドウごとに独立した...
設定ファイル           JSON           http://www.json.org/•	Web系ではおなじみのフォーマット•	設定項目の拡張が簡単•	パースにBoost.PropertyTreeを使用
ユーザーインター ェース        フ実は一番時間がかかっている•	ほとんどフルスクラッチ•	3 回くらい作り直したけど満足出来ていない•	透明にして低解像度でも圧迫感を抑える
ネッ ワーク  ト        Boost.Asio    http://www.boost.org/doc/libs/release/libs/asio/•	DXライブラリの処理とは別スレッド•	スレッドセーフなキューを用意してメッセージを...
モデル座標の同期             Server    TCP   Player1   Player2    Player3   Player4             Channel1             Channel2•	一定時...
クライアント編サーバー編デバッグ編
開発環境 Ubuntu/Eclipse/gcc•	サーバーで常時稼動させるならLinuxが便利•	VisualStudioでもビルドはできる
プロトコル        TCPストリームデータ     デリミタ    ヘッダー       データ      デリミタ     ヘッダーnbyte   1byte   2byte      nbyte     1byte   2byte  ...
データ圧縮                 lz4       https://code.google.com/p/lz4/•	圧縮率より速度重視のアルゴリズム•	サイズが100byteを超えるデータに適用•	チャッ ッセージ等に有効     トメ
データの同期 (1)
データの同期 (2)
ュ ティ 1)セキ リ (    通信内容の暗号化•	鍵交換用に 3072bit RSA•	コマンドの暗号化に 128bit AES CFB•	初回起動時にクライアントの公開鍵を発行
ュ ティ 2)セキ リ (       DoS対策•	データ量が規定値を超えるとコマンドを無視•	さらに超過すると一方的に切断•	クライアント側でも制限機能がある
サーバーステータス                      MMO         PHP   UDP                     Server•	外からステータス確認できるよう急遽作った•	パケットロス対策ため一度に数回送信
クライアント編サーバー編デバッグ編
デバッグ環境      PC ×3 + VPS•	基本的にローカルネットワークでテスト•	Wireshark等でパケットを監視•	低速回線のエミュレートに帯域制限ソフト
簡易プロファイラ    *** PlayerCharacter::Impl::Update    count:   353814    total:   4177429ms    average: 11.8069ms    max:     9...
再現性の低いバグ  サーバーをデバッグモードで起動         ↓クライアントを起動しまくるスクリプトを実行         ↓         寝る
最後に
っ みた感想作 て•	通信関係は接続数が少なければ何とかなる•	まともな UI を作るのがとにかく大変•	DX ライブラリの仕様上、モデルデータの細か  いリソース管理が困難•	いい加減な仕様だと後方互換性が問題に
mixC++勉強会@Tokyoおしまい
DXライブラリでMMO作ったよ!
DXライブラリでMMO作ったよ!
Upcoming SlideShare
Loading in …5
×

DXライブラリでMMO作ったよ!

11,637 views

Published on

Published in: Technology
  • Be the first to comment

DXライブラリでMMO作ったよ!

  1. 1. mixC++勉強会@TokyoDXライブラリでMMO作ったよ!
  2. 2. 自己紹介HN: h2so5C++とかRubyとか色々いじってるデザイン系の学生。 http://h2so5.net/ github: @h2so5
  3. 3. MMOっ 何? て MMD + Online → MMO H2SO5MikuMikuDance MikuMikuOnline MMDのモデルを使ったチャッ ソフト ト http://m2op.net/
  4. 4. なぜ作った?• ネットワークプログラミング面白そう• パフォーマンス重視なら C++ が活かせるかも• 類似プロジェクトで完成しているものが少ない
  5. 5. クライアント編サーバー編デバッグ編
  6. 6. 開発環境 VisualStudio2010• MinGW+gccを使っていたが色々あって移行• C++11に対応してないのが残念
  7. 7. 描画処理 DXライブラリ http://homepage2.nifty.com/natupaji/DxLib/• ソフトウェアのコアとなるライブラリ• MMDモデルに対応したDirectXのラッパー• モデル・画像の描画をすべて丸投げ
  8. 8. スクリプトV8 JavaScript Engine https://developers.google.com/v8/• UIのカスタマイズ・マクロ機能• チャット機能などはJavaScriptで記述• UIウィンドウごとに独立したContextを持つ
  9. 9. 設定ファイル JSON http://www.json.org/• Web系ではおなじみのフォーマット• 設定項目の拡張が簡単• パースにBoost.PropertyTreeを使用
  10. 10. ユーザーインター ェース フ実は一番時間がかかっている• ほとんどフルスクラッチ• 3 回くらい作り直したけど満足出来ていない• 透明にして低解像度でも圧迫感を抑える
  11. 11. ネッ ワーク ト Boost.Asio http://www.boost.org/doc/libs/release/libs/asio/• DXライブラリの処理とは別スレッド• スレッドセーフなキューを用意してメッセージをやりとり ネットワーク関係の詳細はサーバー編で
  12. 12. モデル座標の同期 Server TCP Player1 Player2 Player3 Player4 Channel1 Channel2• 一定時間ごとに絶対座標等をサーバーに送信• あまり最適化はしてない
  13. 13. クライアント編サーバー編デバッグ編
  14. 14. 開発環境 Ubuntu/Eclipse/gcc• サーバーで常時稼動させるならLinuxが便利• VisualStudioでもビルドはできる
  15. 15. プロトコル TCPストリームデータ デリミタ ヘッダー データ デリミタ ヘッダーnbyte 1byte 2byte nbyte 1byte 2byte • コマンドの区切りをデリミタ(0x7E)で判断 • HDLC(High-Level Data Link Control)を 参考にしたプロトコル • テキストエンコーディングはUTF-8
  16. 16. データ圧縮 lz4 https://code.google.com/p/lz4/• 圧縮率より速度重視のアルゴリズム• サイズが100byteを超えるデータに適用• チャッ ッセージ等に有効 トメ
  17. 17. データの同期 (1)
  18. 18. データの同期 (2)
  19. 19. ュ ティ 1)セキ リ ( 通信内容の暗号化• 鍵交換用に 3072bit RSA• コマンドの暗号化に 128bit AES CFB• 初回起動時にクライアントの公開鍵を発行
  20. 20. ュ ティ 2)セキ リ ( DoS対策• データ量が規定値を超えるとコマンドを無視• さらに超過すると一方的に切断• クライアント側でも制限機能がある
  21. 21. サーバーステータス MMO PHP UDP Server• 外からステータス確認できるよう急遽作った• パケットロス対策ため一度に数回送信
  22. 22. クライアント編サーバー編デバッグ編
  23. 23. デバッグ環境 PC ×3 + VPS• 基本的にローカルネットワークでテスト• Wireshark等でパケットを監視• 低速回線のエミュレートに帯域制限ソフト
  24. 24. 簡易プロファイラ *** PlayerCharacter::Impl::Update count:   353814 total:   4177429ms average: 11.8069ms max:     9547ms min:     6ms• フレームレート低下の原因を調査• 関数ごとの実行時間などを計測• 当たり判定の処理が重いことが判明
  25. 25. 再現性の低いバグ サーバーをデバッグモードで起動 ↓クライアントを起動しまくるスクリプトを実行 ↓ 寝る
  26. 26. 最後に
  27. 27. っ みた感想作 て• 通信関係は接続数が少なければ何とかなる• まともな UI を作るのがとにかく大変• DX ライブラリの仕様上、モデルデータの細か いリソース管理が困難• いい加減な仕様だと後方互換性が問題に
  28. 28. mixC++勉強会@Tokyoおしまい

×