#はじめに
こんにちは。CYBIRDエンジニア Advent Calendar 10日目の伊藤です。9日目は@sanjaponさんの今年開催された社内勉強会(インフラ編)でした。若手エンジニアのアニキとして慕われていて、業務の傍ら、いろいろな勉強会を開いてエンジニアの意識を高めてくださっています!
お詫び
今日のエントリは「痛恨のミス 2016」の予定だったのですが、書いてみたら悲惨すぎて公開できるものではありませんでした(やっぱり。)そこでセーフなタイトルに変えさせていただきます。
#「海外へのゲーム配信で注意すること」
自分はスマホ向けゲームスタジオの技術プロデューサーをしています。
今年リリースした某ゲームは日本、香港、欧州、アメリカ、アジアで計31カ国に配信しています。
日本で作ったゲームを外国で配信する場合、ローカライズが取りざたされますが、開発上で注意するべきこともあります。
チェックリストにしてみましたので、これから海外配信するゲームを作る方はご活用ください。
チェックリスト
a. 通信速度が遅い国対策、レイテンシ対策
(1) 下り1Mbpsでも動くか?
(2) CDNを使っているか?
(3) DNSサーバは分散してるか?
(4) 多重リクエスト対策しているか?
(5) アプリ本体の容量vs差分ダウンロードの容量の配分は、意図的に決めてあるか?
b. チート対策
(1) root化 /Jailbreakチェックしてるか?
(2) 通信のSSL化してるか?
(3) APIに渡すパラメタにはハッシュをつけて突合してるか?
(4) 値の限界チェックしてるか?
(5) API再送チェックしてるか?
c. そのほか
(1) Google Play developer Consoleでスペックの足りない機種を非対応化してるか?
(2) タブレット対応してるか?
(3) SNSログインできるか?
(4) 30度以下に放熱を抑えてあるか?
(5) タイムゾーンごとにバッチが回る場合、1時間以内で終わるようになってるか?
説明
a. 通信速度が遅い国対策、レイテンシ対策
###(1) 下り1Mbpsでも動くか?
キャリア通信速度
東京 | ロンドン | 香港 |
---|---|---|
10〜20Mbps | 1〜5Mbps | 1Mbps以下〜20Mbps |
公衆Wi-FI速度
ロンドン | 香港 |
---|---|
1MBps〜3Mbps | 20〜40Mbps |
出張時、あるいは現地のQA会社にデバッグを依頼したときに、ついでにモバイルデータ通信速度を測ってみたところ、同じ国でもピンキリでした。
いろいろ聞いてみると、スマホゲームを遊んでくださる方は、アプリをダウンロードする時は家や学校とか会社ののWi-FIを使って、出先ではしょうがないから3G(まれに4G)を使うパターンが多いようです。
出先で隙間時間に遊んでもらえるようにするには、「全く通信しないで遊べる」ゲームか、「通信するけど軽い」必要があります。
我々は通信が必要なゲームを作っているので、APIの通信が1Mbps以下でも動く条件を守るようにしました。
(2) CDNを使っているか?
静的ファイル配信はCDNを使うのがセオリーですが、10分の1とかに短縮できるわけではないです。
例)AWS CloudFrontでの、某ゲームのアセットダウンロード時間
東京 | ロンドン | エッジが近くに無い国 |
---|---|---|
30秒 | 1分 | 4分 |
ロンドンをはじめ、AWSのCloudFrontエッジロケーションは世界の大都市付近には配置されていますが、大都市だけなので、田舎のほうにも対応したい場合、Akamai CDNを導入すると良いと思います。
(3) DNSサーバは分散してるか?
1画面を表示するために何回もAPIや静的ファイルをリクエストするアプリの場合は、リクエスト毎のURLのドメインの名前解決にかかる時間のチリツモが見過ごせない長さになってしまうでしょう。AkamaiとかAWSを使うと良いと思います。Ddos対策にもなりますし。
(素材ファイルを固めてダウンロードし、ストレージに保管してそこから表示するタイプのアプリならこの項目はあまり関係ないです)
(4) 多重リクエスト対策しているか?
回線が不安定だと、上りはいけても下りが切れることがあります。課金やガチャやイベントなど、リトライすると内容が変わってしまう処理は、レスポンス内容をサーバー側で一定時間キャッシュしておき、同じリクエストが来た場合にキャッシュ内容を返却するのが良いと思います。
(シーケンス図をここにいれる)
(5)アプリ本体の容量vs差分ダウンロードの容量の配分は、意図的に決めてあるか?
日本だと、appストアやGooglePlayで配信するアプリ本体は100MB以内を死守して、そこに入りきらない素材を、初回起動時にダウンロードをしている場合が多いと思います。
しかし全く逆の考えの風潮があります。
・アプリのダウンロード時はどうせWi-Fiを使うのでアプリ本体は100MBを超えても良い.
・逆にWi-Fi圏内にいない時に大量の素材ダウンロードが発生するとユーザー離脱につながる.
日本や韓国など一部のスマホ先進国をのぞいて、ほぼすべてこちらのようです。
残念ながら、AppストアもGoogle Playも日本とその他でアプリのバイナリを分けることができないので、どちらかに合わせることになってしまいます。
配信国をきめるさいの戦略に関わりますので、開発前に決めてる必要があります。
b. チート対策
詳しくは企業秘密になってしまうので、一般的な範囲でのご説明になります。
八門神器などのメモリ改ざんツールの使い方はYoutubeで動画解説されており、しかも安易に入手できるので、熱心に遊んでいる方が一線を超えてしまうことがあり、Banせざるを得ないのは非常に残念です。システムの防御力をあげて、お客様を悪の道に走らせないことがとても大事だと思います。
###(1) root化 /Jailbreakチェック
・いろいろなチートツールは要root化/JailBreakなので。
・新しいアプリや手法がどんどんでるので定期的にパトロールする必要あり。
###(2)通信をSSL化してるか?
・80番も開けてたとかのダサいミスがないように
###(3) APIに渡すパラメタにはハッシュをつけて突合してるか?
・あるいは暗号化でも良いと思います
###(4) 値の限界チェックしてるか?
・アプリ内でもAPIでも必ずやらなきゃだめです。また上限だけでなく下限チェックも絶対です。
例)課金アイテムのマイナス値リクエストによりアプリ内通貨の保有量を増やすチート
###(5) API再送チェックしてるか?
・アプリとの通信を傍受して、ガチャが当たったときのAPIをコピーして再送するチート手法がある。多重リクエスト対策をいれる過程で防げる。
なお別にチートが目的ではなく、便利な機能をつかうためやにroot化やJailBreakしてる方には申し訳ないのですが、巻き添えとなっております。
なお中国はまだGoogleがないので、周辺国では中国メーカーの端末をショップで売るとき、わざわざroot化してGoogle Playをインストールしてから売ってることがあるようです。こういう端末を買った方も、残念ながら私たちが開発したアプリは遊べません。
c.そのほか
(1) Google Play developer Consoleでスペックの足りない機種を非対応化してるか?
Google Playのカスタマーレビューで、「ダウンロードしたけれども動かないんじゃゴルァ★☆☆☆☆」という低評価を避けるための施策。発狂するほど大変
ですが、もしストアのおすすめ枠に掲載された場合、この処置をしておくことにより、レビューの評価を一定のレベルに守るという絶大な効果があります。
apkをGoogle Play Developer Consoleにアップロードすると、ビルド時に指定したAPIレベルに応じて、対応機種が自動的に絞り込まれる。
12/9現在、Google Playの全対応機種は13656機種だが、APIレベル15+のアプリをアップロードすると、自動的に12518機種に絞り込まれる。
↓
絞り込まれた機種のうち、主要な10メーカー程度の機種のスペックをGSM Arenaなどで調べる。(スクレイピングしたり人海戦術で)
Samsung
LG
Huawei
Lenovo
Motorola
Sony
HTC
Xiaomi
Asus
Oppo
↓
世界的にはシェアは低いが配信国ではよく使われる機種も、できれば調査する。フランスのAlcatel、インドのMicromaxなど。
↓
1機種づつ非対応化する。
やり方;Google Play Developer Console>アプリを選択>APK>サポート対象の端末数「リストを表示」>機種名で検索してスライダーをオフにして保存
(2) タブレット対応してるか?
タブレットの普及している国のユーザーにうけます。
Apple /Googleももちろん推奨しており、ストアのおすすめ枠掲載には絶必と言われています。
(3) SNSログインできるか?
機種変更時のデータ引継ぎを「ユーザーID+パスワード」でする仕組みは古くて、
Facebookや iOSのGameCenterなどを使う場合がスタンダードになっています。
パスワード忘れ時へのカスタマーサポートの対応も減らせます。
(4) 30度以下に放熱を抑えてあるか?
「異常な状態は避ける」防衛本能のある国だと、放熱が激しいと遊んでもらえないです。
暑い国でも同様。
当たり前なのですが、ついリッチな画面を演出しようとすると、40度近くになっていることが。。
(5) タイムゾーンごとにバッチが回る場合、1時間以内で終わるようになってるか?
タイムゾーンは30分刻みのもあるので、その場合は30分以内に終わらせる必要があります。
だいぶ長くなってしまいましたが、説明は以上です。
最後に
CYBIRD エンジニア Advent Calendar(http://qiita.com/advent-calendar/2016/cybird) 明日は、@cy-kuniyoshi-setoさんの「デザイナーがADVアプリを無理やり作った話」です! ハリネズミを飼っているそうです。 楽しみですね!