おけやの日々

株式会社おけやのブログです。業務、企画、技術の事など様々な事を書きます。

不具合との戦い

プログラマの吉田です。

まじょのおしごとのリリースノートなどは「まじょごと」ブログに載せておりますのでそちらをご覧いただくとして

witch-work.hatenablog.com

こちらのブログではその裏側のお話をさせていただきます。

いきなり謝罪から始めますがver 1.5 以降不具合が続きまして非常に申し訳ありません。現在その対応をがんばっていますので、そのあたりのお話をさせていただきます。

まじょのおしごとはそもそも二人で開発していることもあり「負荷や速度はさておき、実装を急ぐ」「嬉しいほうの悲鳴になりそうな事の対応は行わない」という方針でやってきていたのがここで破綻した感じです。何が起こってどういう対策を行っているかをお話させていただきます。

サーバーが落ちた

ちょうどこないだの日曜日 9/27 のことです。サーバーが落ちましてゲームが出来なくなりました。まじょごとは AWS で ELB + appサーバー2台 + RDS(multi AZ) という構成で動いています。 その app サーバーのうち1台が out of memory になりました。out of memory というのは単純にメモリが足りなくなったということです。 2台あるので1台落ちても1台ががんばってる間に復旧させればいいやと思っていたのですが、ここで問題が一つありまして、監視システムの設定が失敗していてどちらか1台だけ落ちてもアラートが飛びませんでした。こうして発見が遅れ、遅れてる間も1台のサーバーはがんばっていたのですが、1台だけではまかなく事が難しかったようで 502 エラーを頻発していました。最終的にプレイヤーの方に連絡のメールをいただいてから復旧作業となり、影響が大きくなった事は非常に反省するところです。

この障害に対する対策としては監視設定を見直し、もう少し細かい監視を行うようにしたうえで2台構成であった app サーバーを1台追加して3台としました。これでだいぶ余力が出来ましたのでまだしばらく大丈夫です。また app サーバーについては将来的には Docker に移行したいななどの構想もあります。

アプリが落ちる

ver 1.5.0 移行アプリが落ちてしまう方が増えています。こちらについても 1.5.0 でハードモードを追加し、おばけやステージが増えてしまったため、使用メモリが増加し特にメモリをあまり多く積んでいない Android 端末の方には引き続きご迷惑をおかけしておりまして非常に申し訳ありません。

こちらについても現在対策を行っております。具体的に言いますと 複数の画像を1枚の画像に連結し、使用する時に範囲指定して取り出して使う SpriteSheet という最適化技法がありまして、これを行っております。ゲームの画像の描画や演算を行う GPU というハードウェアがスマートフォンや各種ゲーム機には積んでいます。GPU は2の累乗サイズでメモリを確保するため、例えば 50x50 の画像が2枚あったばあい、64x64 の領域を2つ確保するので 64x128 の領域が使われ 14x28 28x50 14x100 の領域が余ることになります。もし余ったサイズに納まるサイズのアイコンがあった場合それらを結合して1枚の画像として扱ったほうがメモリの利用に無駄がなくなりますし、1度のメモリ確保で済むため時間的にも有利となります。こういった細かい最適化処理をいろいろ施しています。

またローディング中に画像をメモリに載せる処理を行っている間「なうろーでぃんぐ」の文字の点滅が止まってしまい、固まったように見えてしまうところも処理を Thread で(バックグラウンドで)行うようにして点滅が止まらないようにしました。さらに画像サイズそのものの見直しも行っておりトータルで使用するそもそものメモリ量も減らすようにしました。10月のなるべく早い時期にこの最適化を行ったバージョンをリリースすべく作業を行っております。

最適化が必要になった

いろいろな処理を速くしたり、使用するメモリ量やディスク量を削減するためにプログラムに手を入れることを「最適化」といいますが、プログラミングの最適化に対する格言として「最適化は(なるべく)するな」というのがあります。最適化というのは大抵の場合人ではなく機械のほうに合わせるようにプログラムを書くようになるため可読性が落ちたり汎用性が落ちたりするため現実的な時間で処理が行えているのであれば最適化はしないほうが良いということです。また最適化というのはそのスコア(処理時間やメモリ量の削減)が目に見えてわかってしまうためプログラマにとっては楽しいものです。しかしながら別にそこが遅くても問題無い箇所を0.01秒速くするために3日使うようなことをするのは無駄ですね。そういうことをしてはいけないということです。

この格言に私も従っていたのですがついに最適化が必要になったという点で感慨深いです。私の予想では年内は大丈夫だろうと予想していたのですが、予想以上に遊んでいただいている方も多いし追加ステージの要望も多く結果的に機能追加をがんばった結果最適化が必要になりました。これは本当に嬉しい悲鳴です。

ここで上げたこと以外にも不具合のご報告をいただいており、そちらの対応も進めています。次に出すバージョンはもっと安定して遊べるバージョンになる予定です。その先にはさらなる機能追加やステージの追加も予定しておりますので楽しみにお待ちいただければと思います。

がんばっているなんて事実に価値は無くアウトプットにのみ価値があるというのは私自身そのように考えております。しかしながらたまにはがんばっているところも記録としてこのように残しておきたいな気持ちもあります。いろいろ怒涛の日々を過ごしておりますが「まじょのおしごと」を皆様に提供出来ていることそのものが今の私のモチベーションです。不具合で不快な思いをさせてしまい非常に申し訳ありません。しっかり対策を取らせていただきますので今後も「まじょのおしごと」よろしくお願いします。