simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

クライアントサイドが学ぶサーバーサイド技術

■前置き1

クライアントサイド、サーバーサイドを語る前に、まずはゲームが関数であることを説明したいと思います。
f:id:simplestar_tech:20180519185122j:plain

■クライアントサイド

クライアントサイドは、単一機材で処理が完結する関数を最適化するお仕事ととらえることができます。
f:id:simplestar_tech:20180520103945j:plain

次のステップを踏みながら関数の最適化を行います。

  1. ゲームプランの要求分析
  2. オブジェクト指向設計により不具合の特定が行いやすく、また複数人で分業しやすいスケルトン(骨組み)を作成
  3. アジャイルスクラムテスト駆動開発を例に、プロジェクト全員の進捗意識を統一しながらタスク管理
  4. 情報技術/数学/物理の知識を駆使し、ゲーム内の4次元の機能を1次元のプログラムコードに展開
  5. シナリオ、イラスト、音声、BGM、効果音など、ユーザーが直接観測するアート部分を量産・管理できる体制・ツールを作成
  6. ハードウェアとソフトウェアの知識を駆使したデータ指向設計を行い、機能ごとのパフォーマンスを最適化

図でいうところの真っ赤な吹き出しに注目してください。
このCPUとメモリの間の読み書きする部分がボトルネックになります。
機能を入れ終えた後は、最後にこのボトルネックの最適化を行ってパフォーマンス向上をはかります。

あえて GPU による描画処理を書きませんでした。
描画負荷が一番のボトルネックになるのは当たり前のことです。

■サーバーサイド

サーバーサイドは、サーバーにアクセスが集中する負荷の対策を行うお仕事ととらえました。

f:id:simplestar_tech:20180520210037j:plain

次のステップを踏んでコストパフォーマンスを計算しながら大量アクセス集中におけるサービス停止を未然に防ぎます。

  1. ゲームプランの要求分析
  2. 運用コストを計算
  3. 疎通確認済みのスケルトンを作成
  4. チート対策
  5. 負荷対策
  6. サービス運用

図でいうところの真っ赤な吹き出しに注目してください。
ボトルネックとなる箇所が三つあり、それぞれ
①ネットワーク帯域負荷
②ゲームロジックの計算負荷
③データベースアクセス負荷
となっています。

このうち①と②の対策は単純で、マシン性能の限界を数字で示してプランナーにゲームプランを見直しをお願いします。
ネットワーク帯域負荷を下げるには、通信する情報量を減らします。例えば無数に発生する雑魚キャラクターの位置の同期をやめるなど
ゲームロジックの計算負荷を下げるには、サーバーで行う計算量を減らします。例えば無数に発生する雑魚キャラクターの経路計算をサーバーではなくクライアントで行うようにするなど
ただし、これにはチート対策とトレードオフとなることがあるため慎重に決める必要があります。

残る③のデータベースアクセス負荷の低減がサーバーサイドの技術として注目に値しました。
やっと前置きが終わりました(相変わらず長い…)

■サーバーサイド技術とは
サーバーサイド技術とは、データベースアクセス負荷を分散するためのシステムを設計構築する技術です。

既存のゲームがどのようにして負荷を分散するシステムを実現したのか見ていきましょう。

パラレルワールド方式

データベースアクセス負荷を分散するためのシステムとして、パラレルワールド方式があります。
これはユーザー数が一つのデータベースアクセス負荷の限界を超えるところまで来たら、新しいデータベースサーバーを立てて、以降の新規ユーザーからは新しいサーバーを利用する方式です。

レプリケーション

データベースの複製を10個作っておき、処理をその10台のマシンに分散させれば、理論上、1台の時の最大10倍の量の処理を行うことができます。

■データベースの水平分割と垂直分割

データベースサーバー内には、当たり前ですがデータベースがあります。

データベースはテーブルと呼ばれる集合によって構成されています。
読み書きが集中するテーブルを分割して、別のデータベースサーバーを立てれば、磁気ディスクのヘッド数を増やしたことになるため、読み書きの負荷を分散することが可能です。

テーブルを複数のテーブルに分割する操作には、二通りが考えられます。

一つはテーブルの種類を増やす対応(ユーザー情報、所持アイテム情報、クエストログ、スキルセット情報、メール情報、チーム情報、といったデータごとにデータベースサーバーを立てる対応)これが垂直分割
一つは同じテーブルをユーザーIDごとに分割する対応(頭文字aのユーザーIDだけのテーブル、頭文字bのユーザーIDだけのテーブル、と分けて、それぞれにデータベースサーバを立てる対応、予想される負荷は1/26に減らせます。)これが水平分割
水平分割でデータベースサーバーを増やすことを DB sharding(シャーディング)と呼びます。