テスターですが何か?

ホビープログラマ略してHPです

第77回codeseek勉強会&第17回日本C#ユーザー会 勉強会 に参加しました

leave a comment »

第77回codeseek勉強会&第17回日本C#ユーザー会 勉強会」に参加しました、普段はWindows Azure/ASP.NETを追いかけているので、ゲームというテーマには馴染みがありません。Mono/Unity/Windows Phoneという文字が並んでいたので、クライアントのUI開発に関する内容が多いのかなと思いながらも参加申し込みを行いました。単純に新しい刺激が欲しいのが目的でした、スマホ/クライアントアプリを作ることはないでしょうから、自分の知らない世界の話を聞いてみたかったんです。

会場には、Windows8使ってる人がちらほらいました。新しいことにキャッチアップしている人が多い印象でした。雑ですが、手元のノートにメモした内容をブログにあげておきます。

C# とゲーム(岩永さん)

資料
https://skydrive.live.com/view.aspx?cid=5C622397E11C979D&resid=5C622397E11C979D%214309

ゲームはC++,LAMP環境で作ることが多かったが、C#の時代が来た
プログラミング言語検索キーワードランキングでもJava,Cに次いで3位に(ただし英語圏)
ランキングも上昇傾向、ただ、Objective-CやJavaScriptの伸びもすごいが
ただ、日本はまだまだVBが人気
でもC#の書籍の売上ががVBを抜いたとか

1.Kinnect
NUI:Natural User Interface
音声認識・音声合成
Kinnectもマイクアレイを搭載
MS ResearchのブログでもKinnectは人気
Kinnect FusionでAR拡張
C#+Kinnectでゲームを作ることが可能、SDKも充実
リアルタイム翻訳を行うプロジェクトも登場

2.ゲーム開発フレームワーク
Unity,PS Suite
どちらもMonoベースで作成されている
最新のC#にも対応、非同期(await/async)、Linqにも対応
ただし、プラットフォームに依存する部分(Win32API)は対応が厳しい
MonoDevelopを使用するとMacやLinuxでも開発可能
注意
GPUに頼れない
性能が欲しい場合はどうしてもネイティブに頼らざるを得ない
全部ネイティブで実装せず、必要に応じてネイティブを選択する
Windows8ではネイティブ(C++)の復権も

3.UIフレームワーク
XAMLとDirectX
XAML … メニュー型
DirectX … 低レイヤー
どちらか片方ではなく、両方使いたいことが多い(3Dモデル描画の手前にメニューを出すとか)

4.オンライン
サーバーサイドでもC#を利用可能
ゲームは今、ネットワークと人と人とのつながり(ソーシャル)が前提
クライアントとサーバーでは言語が異なることが多いが、同じ処理を実装したいことが多い
毎秒更新処理は、都度サーバーと通信処理を行うわけにはいかないので、クライアントで実装する
C#なら、クライアントとサーバーで同じ言語を採用することができる
ただ、チート対策でわざと2重開発することwも

アクセス数が読めないので、クラウドを利用
土日は平日の3倍のアクセス
キャンペーン中は10倍のアクセス

Kinectプログラミング StepByStep C#&VB (初音さん)

C#でできることはVBにも当てはまる
// プレゼンテーションに「FUJITSU」の文字が
CodeZineでグレープシティのコンポーネントの紹介を執筆中(Silverlight,WPF,WindowsPhont)
著者Noは998
Windows版とXBOX版Kinectの違い
Windows版の方がファームが新しく、近距離の人体の認識が可能

ハードウェア
センサー
色、深度、マイク、チルトモーター
視野角
水平57度、垂直43度
ストリーミング
320×240 16bitカラー 30fps
640×480 32bitカラー 30fps
どちらのサイズにするかはPCのスペック次第、古いPCだと大きいサイズは厳しいが最新(CoreiCPU)なら問題ない
人体認識
最大6名認識、2名は関節認識が可能
1名あたり20関節をトラッキング可能
関節情報は配列として渡ってくる(XX人目のXX番目の関節)

できること
画像認識、距離認識
スケルトン(関節認識)
音声・音源方向認識

Kinnect SDK
現在のバージョンは1.0、5月にはバージョン1.5が公開される予定
.NET Frameworkの拡張ライブラリとして提供、Microsoft.Kinnect名前空間
WindowsForm,WPF,XNAで利用可能、Silverlightも可能か?
1.5で日本語音声認識が可能に

プログラミングの基本
KinnectSensor型にColorFrameReady,DepthFrameReady,SkeltonFrameReadyイベントを登録
ストリーミングをEnableに
Kinnect.Start

デモ
1.画像認識、Webカメラの用
2.距離認識、深度に応じて色情報を変更しているが、処理が重い...
3.スケルトン認識、20関節認識できている
スケルトン認識させたデータを使用してアバターを表示させることも可能
2歳くらいのつかまり立ちできる子供であれば認識可能、2足歩行できれば認識できるはず
動物、はいはいの赤ちゃんは認識できない
イスに座っていると認識できないことも、1.5からイスに座っている人物も認識できる
関節情報はSkelton.Jointで取得できる
右腕を上げているか(右腕が右肩よりも高い位置にあるか)などを判定可能
Kinnectから取得したスケルトンデータをMMD(MikuMikuDance)に読み込ませてキャラクターを踊らせることも
あのキャラクター(Windows7)やあのキャラクター(WindowsAzure)が踊ったりとか

Windows Phone!そういうのもあるのか(もとひろんさん)

WindowsPhoneとは
3D描画が簡単
UIが視覚的に開発可能
今日のテーマはWinsowsPhoneでのゲーム開発

開発環境
Windows Phone SDK 7.1をインストールするだけ
Visual Studio 2010 Express、WindowsPhone Emulatorがインストールされる
エミュレーターはセンサー(傾き検知・GPS など)が内蔵されており、優秀
アプリの公開・実機での動作は有料、AppHubの登録に9800円/年必要
アプリの公開のためには審査を通過する必要がある

2つのプラットフォーム
XNA→ゲーム向け
Silverlight→UI向け
1つの画面で使い分けることができる(ゲーム画面をXNA/メニューをSilverlight)

XNA
ゲームループ型、30回/秒ループ

PSSuiteを使ってみよう(出水さん)

PS SsuiteとはSonyが作った共通プラットフォーム
動作環境:Android2.3以降,PS Vita,Windows
4月からオープンβになる予定
今はVitaでも動かない

今後
4月にオープンβになりVitaでも動く予定
99ドル/年でアプリを公開

Androidの対応状況
すべての端末で遅延する...ゲームにならないレベル

クローズドβなので堂々と話せることがない...
仕方ないのでライブコーディング

C#でiPhoneゲーム開発(牧野さん)

開発環境
Mono Touch
Unity 3D
その他(発展途上)
  Delta Engine
  ExEn (XNAを移植)
 
Mono Touch
OpenGL対応
xcodeのUIと連携
ネイティブコードをバインディング
IDEはMono Delelopを使用

Uity 3D
ゲーム用(3D、物理エンジン)
Unity Editor
Mono Develop for Unity
UnityEditorでコンパイル後xcodeで実機に転送

Monoベースの制約
言語構文的にはMonoはC#4、UnityはC#3.5
ただし、.NET Frameworkには完全対応していない。実質Monoは3.5、Unityは2.9
iOSではJITが禁止されている
事前にコンパイルされ、ネイティブコードに変換される
リフレクション、ジェネリックに制限があり、うまく動かないことも

ビルド・転送にMacが必要、Apple様には逆らえません
ゲームはUnity、ツール(便利系アプリ)にはMonoTouchが向いている
ただし、Unityで2Dゲームは鬼門

C#に対する感想
現場はほぼすべてUnity+C#で開発している
C++でのゲーム開発経験者が多い

usingいい!
ラムダ式いい!
Linqいい!とくにデータ抽出系の処理が楽になる
型が静的なのがい!(JavaScriptはつらい)

プリプロセッサマクロほしい
typedefほしい
friendほしい

UnityでC#の使える範囲がいまいち把握できない
ツールと連携しやすい

パフォーマンスは許容範囲(超重い演算をしなければOK、MonoはLinuxよりもWindowsの方が高速)
GCでのメモリ管理が楽
GCがCPUを食う
.NETの内部処理に不安があると言うが、そんな事を言う人が書いた処理の方が不安...
IDE便利
非同期処理をもっとうまく書ければいいなぁ
iPhoneとAndroidで同じように動いてくれない

まとめ
速度は気にならない
メモリ管理はやっぱり意識すべき、GCに頼りすぎるのはよくない
ツールを使いこなすべき(コードスニペット、リファクタリング、単体テスト)
内部動作を理解してもらう

MacのMonoDevelopで日本語が入力できない、つまり、日本語でコメントが書けない

ASP.NET+C#で開発するソーシャルゲーム(池田さん)

ソーシャルゲームとは
SNSがプラットフォームを提供
サードパーティがプラットフォーム上にアプリケーションを提供する

今までのゲームとの違い
終わりがない
運営中は継続的にゲーム内容がアップデートされる

マジゲートとうゲームのデモ

システム的には
普通のスマホ向けWebアプリケーション
プラットフォームのAPIを利用する
トラフィック量が半端ない

OpenSocial
複数のサイトで利用できるソーシャルアプリ用共通API
2007年にGoogleが初めて提供
今はzixi,GREEなども提供

Open Social WAP Extension
ガジェットサーバー(proxy)を介してリクエスト/レスポンスを送信
リクエストヘッダにトークンが付与され、ユーザー認証を行う

SNSプラットフォーム会員数
モバゲー 3200万人
GREE 2700万人
mixi 2500万人

サービス構成
会員1500万人、月間146億PV
月あたり1.5倍でPVが増えていた

トラフィック量
リリース5時間で10万人が登録
1ヶ月で100万人が登録
ピーク時3.5億PV/日、昼休み・夜のトラフィック量がすごい、ピーク時とそうでない時の差がすごい

クラスタの負荷
TCPの同時セッション数40万
15万リクエスト/秒
3Gbps(画像を除く)
DBに対して20万クエリ/秒

間違いなく国内最大規模

構成
ASP.NET+C# .NET3.5/4がサービスによって混在
SQL Server 2008 R2
IIS 7.5
nginx(ロードバランサー)
memcached/Redis (KVS)
CDN/Vanish/nginx(配信サーバー)

なぜWindows?
もともとC#が好き
最初は3人で始めたので、物理的に他のプラットフォームに移行できなかった
高トラフィックをさばいている事例がない...結果WindowsとLinuxの混在環境に

IIS+ASP.NET環境は速い!(Linuxエンジニアが言う)

インフラ
ロードバランサーにnginx
APサーバーにIIS
DBサーバーにSQL Server
KVSにmemcached/Redis
シンプルな構成
サーバー台数は1000台超え
サービス開始時はクラウドで運用を始めたが、ローカル管理に移行した
パフォーマンスを最重要視しているので仮想化もしていない

1ゲームタイトル例
ロードバランサー 40台
APサーバー 100台
ガラケー用 40台
スマホ用 40台
Flash合成用 20台
memcached 4台
Redis 4台
DB 3~5台

画像配信
CDN(Akamai)+Vanish+nginx
とにかくキャッシュ
画像がスマホ向けに高解像度化されている

APサーバー
ステートレスな戸でスケールアウトしやすい
手を抜いて処理を書くとすぐボトルネックになる
キャッシュは極力利用、ボトルネックになりやすいDBに処理をさせない
サーバー台数が増え、デプロイが手間・時間がかかり、サーバー間で反映にタイムラグが発生することも

実装
無駄になる処理を実装しない
冗長処理をしない
データアクセスを最適化する
非同期処理を行う
ページサイズを小さくする(ガラケーの100KB制限を意識)
C#でできることはC#で行う、DBに処理をさせない
APサーバーで処理を行うことでスケールしやすくなる

開発時のモニタリング
1リクエストあたりのDBアクセス数
KVSアクセス数
外部APIアクセス数
DataBind回数(WebFormなので...)

非同期
外部API(PageAsyncTask/IHttpAsyncHandler)
C#5.0の機能に期待(async/await)

ASP.NET4
ViewStateの改善
アプリケーションのAuto-Start
ウォームアップ(IProcessHostPreloadClient)
キャッシュ処理、ウォームアップ後にリクエストを受ける
カスタムOutputCacheProviderを利用してKVSにキャッシュする

キャッシュの活用
変更のないマスタはすべてメモリ上のDataTableに
ASP.NETのキャッシュ機能は最大限利用する

DB
更新量が多い
ビッグデータ
1テーブルで6億件も
ボトルネックになるのはDB、いかにDBに処理をさせないことが重要

DBの基本が重要
DiskReadをさせない
シーケンシャルアクセス/ランダムアクセスを意識
インデックスを有効利用
ソート(SQLの書き方によって実は裏でソートが行われることを意識)
チェックポイント

DBの負荷分散
KVSの利用
水平分割/垂直分割
フラッシュストレージの利用

memcached
オンメモリ上にハッシュを格納
データの永続化はできない
すごく高速
実績多い、他のソーシャルアプリでも使われている

Redis
様々な構造のデータを格納可能(List,Hash etc)
ディスク書き込みもでき、データの永続化ができる
レプリケーション
海外で実績がおおい(github,stackoverflow etc)

KVSの使い所
一時的なデータストア
ページ遷移ごとに更新されるような、更新頻度の高いもの(経験値、スタミナ etc)
あるタイミングでDBに書きこみを行うことも

信頼性よりも、トラフィックをさばくことが重要
サービスが生きていなければ何の意味もない

DB分割
垂直分割 テーブル分割、ただしJOINができなくなる
水平分割 同一テーブルをキーで分割

I/Oがボトルネックになる
この20年でCPUは数百万倍性能が向上したが、ストレージは20倍しか向上していない

高速ストレージの採用
Fusion IO
SASストレージの40倍以上の性能

最近はストレージの進化がすごい
10TBの容量をもち、読み込み6.7GB/sec、書き込み3.9GB/secも
KVSではなく、DBを積極利用することも考えている


Windows Azureの検証
SQL Azure Federationの検証→実用できそう
海外展開するためにはクラウドが有利

ソーシャルゲームの運用
2年で17退路ル
約2ヶ月で開発
リリースしてから何度もアップデートされる

継続的改善
PCDAを可能な限り早く回す
データ分析は毎時行う、日時では遅すぎる

開発
動くものを最新仕様に
ドキュメントは書かない、基本事項だけをwikiに残す

トラブル・障害
新しい問題は常に起こる、誰も経験したことのない新しいことをやっているので起こったトラブルは仕方ない
同じミスを繰り返さないことが重要
某MVPでさえ、何台もサーバーを落とした

印象的なことば
ここ数年は会社が成長期で、トラフィック量・サーバー負荷も半端無かった。運用の自動化など効率化のためにやるべきことはあったと思うが、サービスを継続させることを最優先にやってきた。成長企業にとって効率化は二の次だった、サービスを止めないことが最も重要だった

Written by david9142

2012年4月8日 @ 12:05 AM

カテゴリー: その他

Tagged with

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。