mori

インターンシップに参加した学生さんにインタビューしてみました@大阪


こんにちは。人事の森です。

毎年10月、Aimingには、HAL3校(東京/名古屋/大阪)から、インターン生の皆さんがやってきて、1カ月に渡って社内でゲーム制作を中心に、みっちりと就業体験を行います。

今日は、大阪スタジオでのその様子について、学生さんへのインタビューも併せて、レポートしたいと思います!今年は大阪へ、16名の学生さんがきてくれました。

まずは概要から。

概要1

16名を2チームに分け、それぞれでゲームを制作してもらいます。

今年はのテーマは、

「「Aim(狙う)」をコンセプトに、Unityを使って、通信機能のあるPCゲームをつくろう!」です。各チーム、エンジニア5名、プランナー2名、デザイナー1名という構成で行います。メンターとして、Aiming新卒スタッフの2名がフォローにあたりました。

(どんなAimなゲームが出来るのでしょうか、わくわく・・・!)

概要2

ゲーム制作以外にも、「先輩トーク」なる、Aimingの様々な職種、レイヤーのスタッフがそれぞれの分野について紹介するという講座を全7回で実施しました。

また、

いくつかの題材について、グループワークも行いました。

 

その中から、「アジャイル開発をぎゅぎゅっと凝縮、LEGO®を使ったスクラム体験」を紹介します。(インターンさんから、これがおもしろかった!という意見が多数あったため。)

スプリント計画

スプリント計画の様子

(プロダクトバックログに従い、LEGO®を触ってイメージを描きます。)

タスク管理はカンバンで

タスク管理はカンバンで

(落とすべきアクションが具体的になっていきます。全てDONEできるかな?)

成果物!

成果物!

(プロダクトオーナーもびっくりの立派なお城ができました。)

 

成果

最終日、1カ月かけて作ってきたお互いのゲームを、Aimingスタッフに向けてプレゼンし、試遊会を行いました。

Aチーム、Bチームそれぞれのゲームをちょこっと紹介

Aチーム

チーム名: あいサー ゲーム: IMPERSOMAID

タイトルA

(3Dの隠れんぼと鬼ごっこを足したような通信対戦ゲーム。侵入者は屋敷内のお宝を狙い、メイドロボット側は侵入者をつけ狙います。窓を拭くなどのメイドらしいアクションもできたりします。)

ゲーム画面Aゲーム画面A_2

3D三人称視点による、侵入者とそれを撃退するロボット側とに分かれての4人通信対戦のゲームです。侵入者はロボットに紛れ、広い屋敷内にある金塊を一定数盗み出せば勝利。ロボット側は仲間とスタンプでコミュニケーションを取りつつ、侵入者用の転送装置を全て破壊できれば勝利というのが基本ルールです。

お互いに気づかれないように行動する必要があり、プレイ中は緊張感が絶えずハラハラドキドキしたプレイ体験ができる中々手応えのあるゲームが完成しました!

ロボットが気付かれないように、窓を拭いて演技をする仕草が可愛かったです。


 

Bチーム

チーム名: はがねで じゅうはち えふ ゲーム: ハロウィンパーティーホラーゲーム

(なかなか個性的なチーム名ですね。)

スクリーンショット 2016-11-04 10.33.01

(ハロウィン感たっぷりの可愛らしい仕上がり。ロゴも決まってます。演出が凝っていて、演出だけに1人を割いて仕上げてきた完成度はすごい。ローディングもおしゃれで楽しい。)

キャラクターセレクトBゲーム画面B

3D見下ろし型の人とおばけによる鬼ごっこ。1人vs3人で通信対戦ができます。人はロウソクを拾って3つの燭台に火を灯せば勝利。おばけは3人を気絶させれば勝利というのが基本ルールです。灯したロウソクの明かりの範囲内に入るとおばけの姿が見え移動が遅くなったり、気絶から復帰できたりと、このロウソクがゲームデザインのコアになっています。

鬼ごっこの追われ逃げ惑うという体験が再現されており、ロウソクによるゲーム的なフィーチャーも上手く作用して楽しいゲームプレイができます。ロウソクの操作に慣れるまではおばけがとても強い!試遊会の一発目は、おばけに瞬殺されていました。また、タイトルやマッチング画面などインゲーム以外のヴィジュアルも凝っていて見て楽しいゲームになっていました。

 

学生インタビュー

各チームを代表して、それぞれのリーダーに、この1カ月を振返ってのインタビューを行いました。(インタビュー:森、Aチームリーダー:張くん、Bチームリーダー:白水君)

森:1カ月お疲れ様でした!インターンを通して、率直にいかがでしたか?

張:すごく勉強になりました。これまで学校で経験したチーム制作は、「チーム制作」とはいえど、出来る人の力量に頼って個人が進めていくことが多かった。ですがここで経験したチーム制作は、本当に役割を分業し、切り分け、全員で制作にあたることができました。

白水:概ね良好に進めることが出来ました。今回ここに集まったメンバーは、皆が意欲、モチ ベーションがすごく高いので、何か問題が発生した時に、チーム全員がその解決に向けて 全力で取り組む姿勢があった。その中で開発を行うことが出来た経験は自分にとってもプラスになりました。

森:インターン期間に期待していた体験ができましたか?

白水:実際の現場でネットワークや運営知識を吸収したいと期待していましたが、まさにその体験ができました。調べても出てこないところを現場の方に掘り下げて聞くことが出来たことが本当に良かったです。

張:プロの開発現場の雰囲気を知りたいと思ってました。実際、現場を見て不安が減りました。開発室が一体となっていて、作業をこなすというよりは、「皆でゲームを作ってる」という雰囲気を肌で感じることができた。

森:一番印象に残ってることを教えてください。

張:全部が勉強でした。学校の勉強より、「勉強してる」と実感しました。グループワークのスクラム体験はとても面白かったです。

白水:初日です。16人をまとめて会社に連れてきた時、「大丈夫かな」と心配だったけど、 スタッフの方が温かく迎えてくれたので、安心しました。でもすごく緊張していました。あと、学校に戻ったら、教わったアジャイル開発の知識を生かせるかもしれない。チーム作業に取り入れてみたいと思いました。自分は職歴があり、前職はSEをやっていたから、上流工程、下流工程の意識が根付いてた。なのですごく新鮮でした。

森:Aimingのココが変だなって感じたところはありませんでしたか?

白水:良い意味で、なのですが、プランナーの人ってもう少し、ガツガツと自分の意見を通していく、推しの強いイメージがあったのですが、Aimingで接したプランナーは皆さん物腰が柔らかく、丁寧で意外でした。それでもおっしゃる意見は核心をついていて、コミュニケーション力の高さを感じました。

張:イメージでは、「ゲーム業界=辛い」、皆がヘロヘロになり仕事してると思ってたけど、そんな雰囲気を感じなかった。

森:(そんなこともないのですけどね、辛そうな時もありますけどね)

森:成果物を自己採点すると?

張:60点です。皆良い意見を持っていて、それぞれが良い意見なので、想いが強く、まとまらない時があった。後半は改善しようとしたけど、コミュニケーションをもっととるべきだった。もっと他者を理解すべきだった。プログラムがバグだらけになってしまった。でも演出は素晴らしい、演出担当の2人のおかげです。

森:ハロウインの演出は本当によく出来ていて、驚きました!

白水:80点くらいです。やりたいことは詰め込めたけど、ゲームを面白くするところまで持っていけなかった。試遊した人が「おもしろい」って素直に言ってくれる人が少なかったです。それは、そこまでいけなかったから。あと、チーム間でもっと連携し、閉鎖的にならず、コミュケーションとりあった方がよかったね。

張:鎖国になってしまってごめんね。

森:(実際の開発でもありそうだね)

 

森:学校に戻ったらこの経験は生かせそうですか?

白水:プログラミングについての理解が深くなりました。就職作品展にも活用できそう。

森:それは楽しみ!

張:ゲーム会社に入りたい気持ちが一層強くなりました。頑張らないと!

森:ありがとうございました!

まとめ

11月に入り、16名の皆さんは学校に戻られていきました!インターンでの体験が少しでも役立ち、参考になれば嬉しいです。Aimingでは、通年を通してインターン生の受入れを行っておりますので、学生の皆さま、是非お越し下さいませ。

※社会人も歓迎です。

おまけ


リザルトB

 

 

 

 

ハッピーハロウィン(おそい)

おわり。


菅野 明洋

第2回 Game Gatling LTに登壇してきました!


はじめに

初めての人は初めまして、前回の記事(まべ☆てっく vol.1に登壇してきました!)見てくれてる人こんにちは!
大阪スタジオ インフラチームの菅野明洋です。
業務では、大阪スタジオのサービスインフラを担当させていただいております。

今回は、2016年10月2日の日曜日に大阪で開催されました第2回 Game Gatling LTにて、スピーカーとして私と藤井が登壇させていただきましたので、レポートとしてまとめました。

GGLTとは

関西でゲーム開発に携わるエンジニア、デザイナー、プランナー等の人が集まり、ライトニングトークを行うイベントになります。

今回発表させていただいた内容について

今回の発表は、剣と魔法のログレス いにしえの女神で使われている技術やノウハウの話になります。

■菅野明洋:スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話

■藤井章暢:スマホ版ログレスにポストエフェクトを組み込んだ話


私の方ではAnsibleでの設定例を中心に発表しております。
Ansibleとなりますと、色んな書籍やブログ等でベストプラクティスや使用方法が記載されていると思いますが、今回の発表ではグローバル展開を想定した際に、どのように工夫をしたのかをまとめました。
グローバル展開を行ったとしても、サーバの構成が一切変わらないとなれば特に悩む必要はないのですが、現地のインフラ事情や新規実装を行うとなると日本版と全く同じサーバ構成と言うわけにはいかないケースもあると思います。
構成を国やデータセンター毎の差分を管理を行い、各地で行った改善内容を別の地域へ反映するなど相互的に良い事を取り込み合うことが出来たら良いかなと思いました。

藤井の発表では、クライアントにポストエフェクトを導入した話になります。
戦闘中のシーンに合わせて放射線状にブラー処理を入れ、従来の戦闘シーンをより迫力のあるシーンにしています。詳しくはスライドをご覧ください。

■発表中の様子

2016102402

発表中の菅野

2016102401

発表中の藤井

感想

LTとなりますと、「あれもこれも話したい。でも時間がない」といった葛藤があります。
ベースとなる発表資料は一週間から数日前には完成していたのですが、発表直前までスライドの編集したり脳内練習したり等、発表直前まで調整していました。

結果的には、一回目のドラがなったラスト1分前で私の喋りがスピードアップし、制限時間の終了を表すドラと同時に「ご静聴ありがとうございました」と言う形になりました(ギリギリセーフ?)。

最後に

GGLT運営の皆様、会場に来場した方々、登壇の機会を頂きありがとうございました。
とても貴重な経験をさせていただくことができました。


菅野 明洋

まべ☆てっく vol.1に登壇してきました!


はじめに

初めまして。
大阪スタジオ インフラチームの菅野明洋です。
業務では、大阪スタジオのサービスインフラを担当させていただいております。

今回は、2016年9月8日 木曜日の東京にて開催された株式会社マーベラス様主催の「まべ☆てっく vol.1」にて、スピーカーとして登壇させていただきましたので、レポートとしてまとめました。

まべ☆てっくとは

株式会社マーベラス様が主催する勉強会です。
今後もゲームに関わらず色々な題材を取り扱った技術系の勉強会を開催していくそうです。

今回発表させていただいた内容について

発表資料は以下のとおりになります。


本発表は、昔、私が開発業務を行っていた際に、DB周辺の品質向上や機械的な設計レビューの省力化を行う目的で実装した物を成果物として発表させていただきました。

内部処理の話をすると時間オーバーする見積もりだったので、内部の話は入っていません。

発表内容は下記のとおりになります。

  1. どんなツールか?
    1. ツールコンセプト
    2. 実行環境
  2.  ツールが出来るまでの流れ
    1. その時起きた問題
  3. 考えた解決策
  4. 実装後の成果
  5. 将来の実装予定(願望)

参加してみて

超豪華な登壇者に囲まれながら、初めて勉強会で発表しましたので、とても緊張しました。

今回の勉強会はゲーム業界の人が少なかったので、もうちょっとゲーム開発に関わっていた時の内容を含めて背景を説明したほうが、参加者の反応が良くなったのでは無いのかな?と思いました。

次回の登壇では、その辺りも注意しようと思います。

最後に

主催者の皆様のご厚意で、とても貴重な経験をさせていただくことができました。
関係者の皆様、ありがとうございました。

次回以降も何かご協力できることがありましたら、お手伝いさせて頂きたいと思います。


chiepomme

静的コード生成を用いたシリアライゼーション高速化


こんにちは、とある新規開発プロジェクトで主に C# でクライアントとリアルタイムサーバーを書いている 水上智絵(@chiepomme)です。今回は私のプロジェクトで行った、C#におけるシリアライゼーションの高速化についてお話ししたいと思います。

はじめに

いま私が関わっているプロジェクトで以前、通信が多くなると動作がカクカクしてしまう問題が出ていました。Unity のプロファイラで調査したところ、ほとんどがシリアライズ・デシリアライズのコストだったことから、シリアライズの処理を高速化する必要が生まれました。今回はその方法についてご紹介します。

そもそもシリアライズってなんだ!

シリアライズというのは、プログラムの中のオブジェクトを、ファイルに書き込んだり通信に乗せたり出来るようなバイト列(文字列)に変換することです。逆にバイト列からプログラム中のオブジェクトに変換することをデシリアライズといいます(由来は知らないのですが、シリーズとかシリアルと同じ言葉なので、一続きのもの、つまりバイト列一本にするからシリアライズというイメージで私は考えてます)。

たとえば、以下のようなクラスがあったとします。

class SerializableObject
{
    public int A = 10;
    public int B = 20;
}

これをファイルに保存したい、通信に乗せたいとなった場合には、「A:10, B:20」のようなテキストでの表現や、値である「10 20」をそれぞれバイト列に変換してつなげるというのが素直な方法だと思います。こういった処理をシリアライゼーション、動詞だとシリアライズする、と言います。

リフレクションを用いた汎用的なシリアライザーとパフォーマンス

さて、こうしたシリアライゼーションは小さな物であれば個別のクラス毎に定義することが可能ですが、規模が大きくなってくるとそうするのは現実的では無くなってきてしまいます。そこで色んなクラスに汎用的に使えるシリアライザーが必要となります。

汎用的なシリアライザーとしては代表的なのは C# を使い始めた頃きっとだれでもお世話になるであろう XmlSerializer です。コードは GitHub で見られます。
https://github.com/dotnet/corefx/tree/master/src/System.Xml.XmlSerializer/src/System/Xml

このコードを見てもらうと分かるのですが、通常こういったシリアライザーを作る場合にはリフレクションが必要となります。しかしリフレクションは動作が遅く、保存データの読み書きであれば問題になることは少ないと思いますが、リアルタイム通信に用いるような箇所に使用すると速度的にボトルネックになりやすいという問題点があります。

最新の C# を使えてかつ動的コード生成に対応している環境であれば、様々な方法でリフレクションを用いずにも、動的にオブジェクトにアクセスすることが可能です。具体的な方法は以下の岩永さんのブログをご覧ください。

[雑記] 動的コード生成のパフォーマンス – C# によるプログラミング入門 | ++C++; // 未確認飛行 C

しかし、Unity の C# は若干古く、また iOS では動的コード生成ができないという制約があります。よって、私たちのプロジェクトでもキャッシュを用いて改善を試みましたが、それだけでは満足のいく改善が見られませんでした。その後も細かなチューニングをしてみたもののそもそものリフレクションのパフォーマンスの問題があるため、天井が見えてしまっていました。

リフレクションから静的コード生成へ

大きな改善のためには根本的な発想の転換が必要だと思い、動的な仕組みでは無くシリアライズの方法自体を静的に生成してしまうという方法を考えました。ただ C# には静的なコード生成をサポートするような仕組みはないので、本当にコードそのものを生成してあげる必要があります(幸い Aiming には JSON Schema を用いた Generator のような、通信定義 DSL を書くことで通信ファイルを生成する仕組みがあるため、それに載せて使用しています)。

では、実際に C# のコードで比較してみましょう。

シリアライズしたいクラス

話を単純にするために以下のような、入れ子を伴わず、フィールドの型も int もしくは string のみのクラスを対象とします。また、シリアライズ先のフォーマットはテキストで「フィールド名<タブ>値<改行>…」とします。

public class SimpleSerializableObject
{
    public int Int1;
    public int Int2;
    public int Int3;

    public string String1;
    public string String2;
    public string String3;
}

(from https://github.com/chiepomme/SampleSerializer/blob/master/Serialization/SimpleSerializableObject.cs)

リフレクションを使用したコード

using System;
using System.Reflection;
using System.Text;

namespace Serialization
{
    public class StringSerializerWithReflection
    {
        public string Serialize<T>(T serializableObject) where T : new()
        {
            var stringBuilder = new StringBuilder();

            // シリアライズ対象クラスの全てのフィールドを取得
            var fields = typeof(T).GetFields(BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance);
            foreach (var field in fields)
            {
                // キー + タブ + 値 の形で文字列にする
                stringBuilder.AppendLine(field.Name + "\t" + field.GetValue(serializableObject));
            }
            return stringBuilder.ToString().Replace("\r\n", "\n");
        }

        public T Deserialize<T>(string serializedString) where T : new()
        {
            var resultObj = new T();
            // デシリアライズ対象クラスの全てのフィールドを取得
            var fields = typeof(T).GetFields(BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance);

            foreach (var line in serializedString.Split('\n'))
            {
                // キー + タブ + 値 の形で格納されているのを取り出す
                if (string.IsNullOrEmpty(line)) continue;
                var nameAndValue = line.Split('\t');
                var name = nameAndValue[0];
                var rawValue = nameAndValue[1];
                var field = Array.Find(fields, (e) => e.Name == name);

                SetValueToField(resultObj, field, rawValue);
            }

            return resultObj;
        }

        void SetValueToField<T>(T resultObj, FieldInfo field, string rawValue)
        {
            // テキストをフィールドの型でパースして実際の値にする
            if (field.FieldType == typeof(int))
            {
                field.SetValue(resultObj, int.Parse(rawValue));
            }
            else if (field.FieldType == typeof(string))
            {
                field.SetValue(resultObj, rawValue);
            }
        }
    }
}

(from https://github.com/chiepomme/SampleSerializer/blob/master/Serialization/StringSerializerWithReflection.cs)

シリアライズ時には、リフレクションで全てのフィールドを走査して、それぞれの名前をキーとして StringBuilder に追加していき、最終的な文字列を構築します。デシリアライズ時にはその逆のことを行うだけの単純な物です。

静的コード生成による方法

リフレクションを使わず静的コード生成を用いる時には、ビルドより前にシリアライズ対象のクラスに対応したシリアライズ・デシリアライズメソッドを生成する必要があります。今回の場合にリフレクションを使わずリフレクションと同じ事をするためのコードは以下のようになるでしょう。

// このファイルは StaticStringSerializerGenerator によって生成されました
using System.Text;

namespace Serialization
{
    public partial class SimpleSerializableObject
    {
        public string Serialize()
        {
            // キー + タブ + 値 の形で文字列にする
            var sb = new StringBuilder();
            sb.AppendLine("Int1\t" + Int1);
            sb.AppendLine("Int2\t" + Int2);
            sb.AppendLine("Int3\t" + Int3);
            sb.AppendLine("String1\t" + String1);
            sb.AppendLine("String2\t" + String2);
            sb.AppendLine("String3\t" + String3);
            return sb.ToString().Replace("\r\n", "\n");
        }

        public SimpleSerializableObject(string serializedString)
        {
            foreach (var line in serializedString.Split('\n'))
            {
                // キー + タブ + 値 の形で格納されているのを取り出す
                if (string.IsNullOrEmpty(line)) continue;
                var nameAndValue = line.Split('\t');
                var name = nameAndValue[0];
                var rawValue = nameAndValue[1];

                switch (name)
                {
                    case "Int1": Int1 = int.Parse(rawValue); break;
                    case "Int2": Int2 = int.Parse(rawValue); break;
                    case "Int3": Int3 = int.Parse(rawValue); break;
                    case "String1": String1 = rawValue; break;
                    case "String2": String2 = rawValue; break;
                    case "String3": String3 = rawValue; break;
                }
            }
        }
    }
}

(from https://github.com/chiepomme/SampleSerializer/blob/master/Serialization/SimpleSerializableObject.Serializer.cs)

これは、シリアライズ対象の SimpleSerializableObject を 以下のような Generator に通して自動生成したものになります。

using System;
using System.IO;
using System.Reflection;
using System.Text;

namespace SerializerGenerator
{
    class StaticStringSerializerGenerator
    {
        public void Generate(Type type)
        {
            File.WriteAllText(type.Name + ".Serializer.cs", Stringify(type));
        }

        public string Stringify(Type type)
        {
            var fields = type.GetFields(BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance);

            // 本当はハードコードじゃなくて何かしらのテンプレートを使ってね!
            var sb = new StringBuilder();
            sb.AppendLine(@"// このファイルは StaticStringSerializerGenerator によって生成されました");
            sb.AppendLine(@"using System.Text;");
            sb.AppendLine();
            sb.AppendLine(@"namespace " + type.Namespace);
            sb.AppendLine(@"{");
            sb.AppendLine(@"    public partial class " + type.Name);
            sb.AppendLine(@"    {");
            sb.AppendLine(@"        public string Serialize()");
            sb.AppendLine(@"        {");
            sb.AppendLine(@"            var sb = new StringBuilder();");
            // 全フィールドの値を出力する部分を生成
            foreach (var field in fields)
            {
                sb.AppendFormat(@"            sb.AppendLine(""{0}\t"" + {0});", field.Name);
                sb.AppendLine();
            }
            sb.AppendLine(@"            return sb.ToString().Replace(""\r\n"", ""\n"");");
            sb.AppendLine(@"        }");
            sb.AppendLine();
            sb.AppendLine(@"        public " + type.Name + "(string serializedString)");
            sb.AppendLine(@"        {");
            sb.AppendLine(@"            foreach (var line in serializedString.Split('\n'))");
            sb.AppendLine(@"            {");
            sb.AppendLine(@"                if (string.IsNullOrEmpty(line)) continue;");
            sb.AppendLine(@"                var nameAndValue = line.Split('\t');");
            sb.AppendLine(@"                var name = nameAndValue[0];");
            sb.AppendLine(@"                var rawValue = nameAndValue[1];");
            sb.AppendLine();
            sb.AppendLine(@"                switch (name)");
            sb.AppendLine(@"                {");

            // 全フィールドのパース部分を生成
            foreach (var field in fields)
            {
                if (field.FieldType == typeof(int))
                {
                    sb.AppendFormat(@"                    case ""{0}"": {0} = int.Parse(rawValue); break;", field.Name);
                }
                else if (field.FieldType == typeof(string))
                {
                    sb.AppendFormat(@"                    case ""{0}"": {0} = rawValue; break;", field.Name);
                }
                sb.AppendLine();
            }

            sb.AppendLine(@"                }");
            sb.AppendLine(@"            }");
            sb.AppendLine(@"        }");
            sb.AppendLine(@"    }");
            sb.AppendLine(@"}");

            return sb.ToString();
        }
    }
}

(from https://github.com/chiepomme/SampleSerializer/blob/master/SerializerGenerator/StaticStringSerializerGenerator.cs)

コードはだいぶ読みづらくなってしまっていますが、先ほどのリフレクションを使わずにシリアライズするコードをテンプレートとして、個別のフィールドの部分を動的に生成するようにしたコードです。

このようにクラス毎のシリアライズのコードをファイルとしてそのまま生成してしまうというのが、静的コード生成の基本的な戦略になります。

リフレクションによるものと静的コード生成のパフォーマンスの比較

実際に上記の2つの方法+キャッシュ有りを比較したのが以下のグラフになります。

シリアライズ(1000回)

シリアライズ(100000回)

試行回数を問わず、静的コード生成バージョンはリフレクションを用いる物に比べて、最低でも2倍以上の速度が出るようになりました。

なお、シリアライザーのコードも計測コードもまとめて chiepomme/SampleSerializer にアップしてありますので、興味があれば是非ご覧ください。

おわりに

動的なものに比べるとこういった静的なコード生成は泥臭い印象がありますが、速度面で有利なことが多いです。その一方でコードのサイズは膨れてしまうので、場合によっては使用するべきではないシチュエーションもあると思います。このあたりはプロジェクトによるところなので、より理想に近い物を選んでいきたいですね。

ちなみに実際のプロダクトでは、シリアライズのフォーマットは MessagePack を用い、キーとしてフィールドの名前を使わず数字を使うなどの方法でさらに最適化していますが、基本的な考え方はこの記事の内容と同じです。シリアライズ周りのパフォーマンスで困っている方がいらっしゃったら何かの参考になればうれしいです。


t_fujino

「GameServerDevelopers Vol.1」に参加してきました!


こんにちは、Aimingエンジニアの藤野です!

5/28(土)に大阪で開催された、「GameServerDevelopers Vol.1」に参加しましたので、
その記事を書かせていただきます。

サーバ周りに特化した講演会

GameServerDevelopersということで、サーバに関するお話しを聞けるのが大きな特徴です!入社2カ月目の私でも理解できるような わかり易い導入から、負荷試験の種類と それぞれの実施方法について等の、とても濃いお話まで!色々盛り沢山でした!

弊社の山藤も登壇しました

GameServerDevelopersVol1_1
実はこの会、弊社の山藤も登壇させていただきました!お話しさせていただいた内容は、
Aimingで実際に使われている通信技術について!大規模MMORPGを動作させるために
必要な通信の基盤は、どんな設計をしているのかを紹介いたしました。

当日使用した資料です。

まとめ

今回が初の開催となる 「GameServerDevelopers Vol.1」 なんと100名以上の参加があり、これからも開催したいと締めくくりがありました!私もこの会で、新たな知見を得ることができ、知り合いが増え、グッズも貰い(これが目的じゃないですよ!)、本当に楽しい1日となりました!

個人的に、特に面白かったのは、負荷試験のお話しです。負荷試験とは、サーバ群の性能を図るテストです。組み上げたサーバ群が、どこまで耐えられるか?どこかに無駄がないか?等を知るために行います。
負荷試験って楽しくないですか?楽しいですよね!というところに共感しました!
本題は、サーバのスペックを正しく把握することで、必要最低限のサーバ構成にすることや、スムーズにスケーリングできること等のメリットがあるから、負荷試験大切!を学びました!

次回も是非、参加させていただきたいと思います!