SlideShare a Scribd company logo
1 of 33
P●PをC#で
書き直したら
100倍速くなった
++C++;
岩永 信之
開幕ネタバレ
うそ、おおげさ、まぎらわしい



 PHPをC#で
 書き直したら
 100倍速くなった
言語変えただけで100倍になったら苦労しない
参考までに: 性能
 静的な言語※と動的な言語(一般論として)
  平均的には5倍程度の差(静的な言語が速い)
  文字列処理なんかだと差が出ない
  数値計算だと30倍くらい開くことも
 C#でも(時々実測する限り)
  dynamic型を使うとスピードが5分の1くらいに



言語を変えて1桁は変わるけど、2ケタはそうない
  正直、「100倍速い…」って言われて自分もビビった

              ※   コンパイル(あるいはJIT)型の言語で、
                  コンパイル時に型情報を使った最適化をかけるもの
正しくは

自分が
PHPをC#で
書き直したら
100倍速くなった
 要は、きっちり設計しなおしたから
  大まかに2ケタくらい速くなったのは本当
元P●P
とあるモジュールにて
 1つの巨大なファイル
                    参照局所性
  1クラスで約4,000行      落とす    巨大switchもJump
                            Table化されない?
  publicフィールド数50
  1つのswitch文で長さ688行、caseラベル約200個
 ログ取りや結果の出力までべた書き
  文字列連結で、固定フォーマットで
             HTMLソースコードを生成してる
             (その用途しか想定してない)
実装しなおし後C#
 クラス化
  1クラス数フィールド
  switch分岐解消(多態化)
 債務分割
  ゲーム ロジックだけ切り出し
  出力用のフォーマットは別途行う



                     (今や元より高機能だけども)
                        同様の機能の実装
                      (四角1つ1つが1クラス)
ちなみに: 書き換えの理由
 理由もなく書き替えない
  100倍程度の速度差だと動機として弱い※
 クライアント上でも同じロジック使うから
  ネットワーク切れ             チートされると
  てもプレイしたい               まずい
 クライアント上実装必須          サーバー上実装必須

  サバクラ両方で使うからC#
  ちなみに、クライアントはiOS
  サーバーもMonoにする†

           ※   サーバー代金が問題になるような負荷でもなかった
               たぶん、データベース アクセスとかの方がよっぽどネック
           †   「サーバーOSはそのままLinuxにするかも」という意味
               このモジュール以外はP●Pのまま&同一サーバー内実行
その他の効能
 整理されたことで
  開発ペースはかなり速い
   (前はバグが1か月取れない※とかあった)
 債務分割(ビューの切り離し)で
  コマンドライン デバッグ可能に
  (サーバー、クライアントはもちろん)
   企画者向けのバランス検証ツールともコード共有化
  他のゲームでも使う予定




     ※   かかる工数的に、直しても見合わないという判断あり
         バグを直すんじゃなくて、バグってるアイテムの出現確率を落として回避
今日のテーマなんだっけ?
その他の効能(再)
 整理されたことで
  開発ペースはかなり速い
   (前はバグが1か月取れない※とかあった)
 債務分割(ビューの切り離し)で
  コンソール デバッグ可能に
  (サーバー、クライアントはもちろん)
   企画者向けのバランス検証ツールともコード共有化
  他のゲームでも使う予定
                   これ
つまり
 こういう状態
              主要機能

                                共有


          Window                デバッグ用
  iOS                  Linux
         デスクトップ                 コマンド
クライアント                サーバー
         クライアント                  ライン


              Window
             ストア アプリ
                         今更1個増えたくらい
                         どうってことない※

              ※   ロジック担当の発言です。UI担当の方ごめんなさい。
※   ロジック担当の発言です。UI担当の方ごめんなさい。
実際にやったことの片鱗を
 三択クイズ アプリ
  実際に作ったものそのものではないものの、似た仕組み
   で実装
 Windowsストア アプリでデモを
三択クイズ
  制御フロー的にはこんなの
       View           Model
                               ループ


               出題
      問題を表示           問題選択           問題集
回答             回答

               答え
      答えを表示           正誤判定
OK            次の問題へ

                      全問終了      No
                         Yes
               結果
      結果を表示           合格判定
ポイント1: Modelはいろいろ使う
    用途
•   ゲーム本体                 Model
•   サーバー上でチート検証                    ループ

•   プランナー向け調整ツール
               出題
•   デバッグはコマンドラインで         問題選択           問題集
                  回答

• iOS、Windows、Linux… 答え   正誤判定
• GUI、CUI
• 手動、自動           次の問題へ

                          全問終了      No
                             Yes
                  結果
                          合格判定
ポイント2: 完全状況再現
                乱数シード
     値を記録
                        Model
                                 ループ

• ユーザー回答を記録
               出題
• 与えた値が同じな              問題選択           問題集
  ら、
               回答
  完全に同じ実行結果
               答え
                        正誤判定
              次の問題へ
用途
                        全問終了      No
• チート検証
                           Yes
• オンライン対戦
             結果
• ゲーム途中での中断/再開          合格判定
ポイント3: View⇔Model往復
                         制御フローはModel側
                         が管理してる/すべき
        View            Model
                双方向              ループ

     制御フローの      出題
       問題を表示            問題選択           問題集
     中断と再開が必要
回答               回答

                 答え
      答えを表示             正誤判定
OK              次の問題へ

                        全問終了      No
                           Yes
                 結果
      結果を表示             合格判定
ポイント4: 非同期
               I/O処理
               タイマー処理 =非同期
        View           Model
• ユーザー操作を待ったり                   ループ
• アニメーション終了を待ったり
                出題
       問題を表示           問題選択           問題集
回答              回答

                答え
       答えを表示           正誤判定
 OK            次の問題へ

                       全問終了      No
                          Yes
                結果
       結果を表示           合格判定
ポイント まとめ
 ポイント
  ViewとModelの分離必須
  制御フローはModel側で
  完全状況再現
  ViewとModelの双方向のやりとり
  (Model側から見て)Viewは非同期


 三択クイズごときですら、たやすくない
 うまく扱えれば、いろいろなゲームに応用可能
どういうものを作ったか
Model   制御フローの中断と再開 = イテレーター

     制御フローはModel側で
                             Interaction Channel
     完全状況再現
                             間を取り持つクラス
     ViewとModelの双方向のやりとり
     (Model側から見て)Viewは非同期

 View   非同期 = Taskクラス
Model
 イテレーター化
                    Model
                             ループ


             出題
                    問題選択           問題集
             回答

             答え
                    正誤判定
            次の問題へ

                    全問終了      No
                       Yes
             結果
                    合格判定
Model
 イテレーター化
        int correctCount = 0;

        foreach (var q in _questions)
        {
            var qm = new Q(q);            問題選択
   出題       yield return qm;

            var isCorrect =
                qm.Response == q.AnswerIndex;
            if (isCorrect) correctCount++;      正誤判定
   答え       yield return new A(isCorrect);
        }

        var correctRate = correctCount / num;
 結果     yield return new Result(                合格判定
            correctRate, _acceptableRate);
Interaction Channel
  ViewとModelをつなぐ部分
         View              Model
                                    ループ


                  出題
       問題を表示               問題選択           問題集
回答                回答

                  答え
       答えを表示               正誤判定
OK               次の問題へ

                           全問終了      No
                              Yes
                  結果
       結果を表示               合格判定
Interaction Channel
   ViewとModelをつなぐ部分
                         Modelの制御フロー                        Model
                         (イテレーター)を登録
  public class Channel<TMessage>
  {
      public Channel(IEnumerator<TMessage> coroutine)

        public Task RunAsync()   実行

        public void AddAsyncHandler(Func<T, Task<TR>> handler)
                where T : Tmessage
  }


                ViewはTask非同期で応答
View
                 同期版(Func<T, TR>)もある
View
  Interaction Channelから来たメッセージを処理
      Task非同期
            View
                    出題
       問題を表示
回答                  回答

                    答え
       答えを表示
OK                 次の問題へ




                    結果
       結果を表示
View
 Interaction Channelから来たメッセージを処理
   Task非同期

 例: 問題の表示と回答(コマンドライン版)
  channel.AddHandler<Q, int>(m =>       問題文
  {
      Console.WriteLine(m.Question.Statement);

        int i = 1;                             選択肢
        foreach (var op in m.Question.Options)
            Console.WriteLine("{0}. {1}", i++, op);

        Console.Write("何番?: ");
        int answer = int.Parse(Console.ReadLine();
        return answer - 1;
  });
                            回答番号
結果
 意外と汎用性高い
  今日のデモ用の三択クイズ
  実務で、2系統のロジックをこれで実装
  結構な種類のゲームがこの仕組みに乗る
 残念なところ
  C#に型マッチング機能欲しい
    型で分岐してる
  アクター的機構も欲しい
    他の言語のアクター機能も、使いやすいとは言い難いけど
デモ
 コンソール版までは作ってあるんで
 じゃあ、ストア アプリ作ろうか
  今から

More Related Content

What's hot

C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版信之 岩永
 
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26Yoshihisa Ozaki
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京hecomi
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackTakahiro Yoshimura
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm伸男 伊藤
 
知って得するC#
知って得するC#知って得するC#
知って得するC#Shota Baba
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2Atsushi Tadokoro
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テストKen Morishita
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)信之 岩永
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1信之 岩永
 
C#言語機能の作り方
C#言語機能の作り方C#言語機能の作り方
C#言語機能の作り方信之 岩永
 
Try_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackTry_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackkimukou_26 Kimukou
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?Shinichi Hirauchi
 

What's hot (20)

C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版C#/.NETがやっていること 第二版
C#/.NETがやっていること 第二版
 
Objc lambda
Objc lambdaObjc lambda
Objc lambda
 
C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26C# コーディングガイドライン 2013/02/26
C# コーディングガイドライン 2013/02/26
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
 
知って得するC#
知って得するC#知って得するC#
知って得するC#
 
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
Mvpvm pattern
Mvpvm patternMvpvm pattern
Mvpvm pattern
 
C#言語機能の作り方
C#言語機能の作り方C#言語機能の作り方
C#言語機能の作り方
 
Try_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackTry_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hack
 
T93 com入門
T93 com入門T93 com入門
T93 com入門
 
Unityで覚えるC#
Unityで覚えるC#Unityで覚えるC#
Unityで覚えるC#
 
C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?C# から java へのプログラム移植で体験したtddの効果は?
C# から java へのプログラム移植で体験したtddの効果は?
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 

Viewers also liked

C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと信之 岩永
 
Keep yourself up to date
Keep yourself up to dateKeep yourself up to date
Keep yourself up to date信之 岩永
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you信之 岩永
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
Anders Hejlsberg Q & A
Anders Hejlsberg Q & AAnders Hejlsberg Q & A
Anders Hejlsberg Q & A信之 岩永
 
GitHub halp app - Minimizing platform-specific code with MVVM - Justin Spahr-...
GitHub halp app - Minimizing platform-specific code with MVVM - Justin Spahr-...GitHub halp app - Minimizing platform-specific code with MVVM - Justin Spahr-...
GitHub halp app - Minimizing platform-specific code with MVVM - Justin Spahr-...Xamarin
 
それっぽく、適当に
それっぽく、適当にそれっぽく、適当に
それっぽく、適当に信之 岩永
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014信之 岩永
 
MessagePack-CSharpってシャープなの?@激突! Aiming x CloverLab [クライアント対決]部門
MessagePack-CSharpってシャープなの?@激突! Aiming x CloverLab [クライアント対決]部門MessagePack-CSharpってシャープなの?@激突! Aiming x CloverLab [クライアント対決]部門
MessagePack-CSharpってシャープなの?@激突! Aiming x CloverLab [クライアント対決]部門yuki maeta
 
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89hiyohiyo
 

Viewers also liked (13)

広がる .Net
広がる .Net広がる .Net
広がる .Net
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
Keep yourself up to date
Keep yourself up to dateKeep yourself up to date
Keep yourself up to date
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you
 
.NET vNext
.NET vNext.NET vNext
.NET vNext
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
Anders Hejlsberg Q & A
Anders Hejlsberg Q & AAnders Hejlsberg Q & A
Anders Hejlsberg Q & A
 
GitHub halp app - Minimizing platform-specific code with MVVM - Justin Spahr-...
GitHub halp app - Minimizing platform-specific code with MVVM - Justin Spahr-...GitHub halp app - Minimizing platform-specific code with MVVM - Justin Spahr-...
GitHub halp app - Minimizing platform-specific code with MVVM - Justin Spahr-...
 
それっぽく、適当に
それっぽく、適当にそれっぽく、適当に
それっぽく、適当に
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
MessagePack-CSharpってシャープなの?@激突! Aiming x CloverLab [クライアント対決]部門
MessagePack-CSharpってシャープなの?@激突! Aiming x CloverLab [クライアント対決]部門MessagePack-CSharpってシャープなの?@激突! Aiming x CloverLab [クライアント対決]部門
MessagePack-CSharpってシャープなの?@激突! Aiming x CloverLab [クライアント対決]部門
 
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
第二世代MDD(萌え駆動開発)によるプログラミングWin32 #CLRH89
 

Similar to Interaction channel

第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめhakoika-itwg
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストSeiji KOMATSU
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitYasuhiko Yamamoto
 
Code complete ch22_developper_test
Code complete ch22_developper_testCode complete ch22_developper_test
Code complete ch22_developper_testSho Shimauchi
 
Introduction to programming competition [revised][PDF]
Introduction to programming competition [revised][PDF]Introduction to programming competition [revised][PDF]
Introduction to programming competition [revised][PDF]yak1ex
 
ユニットテスト 1日目
ユニットテスト 1日目ユニットテスト 1日目
ユニットテスト 1日目Yoshiki Shibukawa
 
Rails A/B testing by split gem
Rails A/B testing by split gemRails A/B testing by split gem
Rails A/B testing by split gemRyuma Tsukano
 
ソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テストソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テストToru Tamaki
 
pi-3. 式の抽象化とメソッド
pi-3. 式の抽象化とメソッドpi-3. 式の抽象化とメソッド
pi-3. 式の抽象化とメソッドkunihikokaneko1
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦urasandesu
 
TotalViewを使った代表的なバグに対するアプローチ
TotalViewを使った代表的なバグに対するアプローチTotalViewを使った代表的なバグに対するアプローチ
TotalViewを使った代表的なバグに対するアプローチRWSJapan
 
テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門Satoshi Watanabe
 
マルチスレッド問題の特定と再現に頑張った話
マルチスレッド問題の特定と再現に頑張った話マルチスレッド問題の特定と再現に頑張った話
マルチスレッド問題の特定と再現に頑張った話LINE Corporation
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacksHiro Yoshioka
 
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)Ryota Nakamura
 
継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージYasutomo Arai
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューMoriharu Ohzu
 

Similar to Interaction channel (20)

第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ第4回勉強会 単体テストのすすめ
第4回勉強会 単体テストのすすめ
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
 
タダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnitタダで始めるテストファースト入門 ~ C# Express + NUnit
タダで始めるテストファースト入門 ~ C# Express + NUnit
 
Code complete ch22_developper_test
Code complete ch22_developper_testCode complete ch22_developper_test
Code complete ch22_developper_test
 
Introduction to programming competition [revised][PDF]
Introduction to programming competition [revised][PDF]Introduction to programming competition [revised][PDF]
Introduction to programming competition [revised][PDF]
 
Ruby test double
Ruby test doubleRuby test double
Ruby test double
 
ユニットテスト 1日目
ユニットテスト 1日目ユニットテスト 1日目
ユニットテスト 1日目
 
Rails A/B testing by split gem
Rails A/B testing by split gemRails A/B testing by split gem
Rails A/B testing by split gem
 
ソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テストソフトウェア工学2023 11 テスト
ソフトウェア工学2023 11 テスト
 
pi-3. 式の抽象化とメソッド
pi-3. 式の抽象化とメソッドpi-3. 式の抽象化とメソッド
pi-3. 式の抽象化とメソッド
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
 
TotalViewを使った代表的なバグに対するアプローチ
TotalViewを使った代表的なバグに対するアプローチTotalViewを使った代表的なバグに対するアプローチ
TotalViewを使った代表的なバグに対するアプローチ
 
テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門テスト初心者Androiderのためのソフトウェアテスト入門
テスト初心者Androiderのためのソフトウェアテスト入門
 
Tdd
TddTdd
Tdd
 
マルチスレッド問題の特定と再現に頑張った話
マルチスレッド問題の特定と再現に頑張った話マルチスレッド問題の特定と再現に頑張った話
マルチスレッド問題の特定と再現に頑張った話
 
Casper導入資料
Casper導入資料Casper導入資料
Casper導入資料
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacks
 
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
 
継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ
 
ソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビューソースコードの品質向上のための効果的で効率的なコードレビュー
ソースコードの品質向上のための効果的で効率的なコードレビュー
 

More from 信之 岩永

YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話信之 岩永
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話信之 岩永
 
Unicode文字列処理
Unicode文字列処理Unicode文字列処理
Unicode文字列処理信之 岩永
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム信之 岩永
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型信之 岩永
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6信之 岩永
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform信之 岩永
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略信之 岩永
 
プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版信之 岩永
 
C#マスコット(公開用)
C#マスコット(公開用)C#マスコット(公開用)
C#マスコット(公開用)信之 岩永
 

More from 信之 岩永 (13)

YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話YouTube ライブ配信するようになった話
YouTube ライブ配信するようになった話
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
 
Unicode文字列処理
Unicode文字列処理Unicode文字列処理
Unicode文字列処理
 
C# 8.0 非同期ストリーム
C# 8.0 非同期ストリームC# 8.0 非同期ストリーム
C# 8.0 非同期ストリーム
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6Unityで使える C# 6.0~と .NET 4.6
Unityで使える C# 6.0~と .NET 4.6
 
Modern .NET
Modern .NETModern .NET
Modern .NET
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略今から始める、Windows 10&新.NETへの移行戦略
今から始める、Windows 10&新.NETへの移行戦略
 
Coding Interview
Coding InterviewCoding Interview
Coding Interview
 
プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版プログラミング .NET Framework 第4版
プログラミング .NET Framework 第4版
 
C#マスコット(公開用)
C#マスコット(公開用)C#マスコット(公開用)
C#マスコット(公開用)
 

Interaction channel

  • 2. 開幕ネタバレ うそ、おおげさ、まぎらわしい PHPをC#で 書き直したら 100倍速くなった 言語変えただけで100倍になったら苦労しない
  • 3. 参考までに: 性能  静的な言語※と動的な言語(一般論として)  平均的には5倍程度の差(静的な言語が速い)  文字列処理なんかだと差が出ない  数値計算だと30倍くらい開くことも  C#でも(時々実測する限り)  dynamic型を使うとスピードが5分の1くらいに 言語を変えて1桁は変わるけど、2ケタはそうない 正直、「100倍速い…」って言われて自分もビビった ※ コンパイル(あるいはJIT)型の言語で、 コンパイル時に型情報を使った最適化をかけるもの
  • 5. 元P●P とあるモジュールにて  1つの巨大なファイル 参照局所性  1クラスで約4,000行 落とす 巨大switchもJump Table化されない?  publicフィールド数50  1つのswitch文で長さ688行、caseラベル約200個  ログ取りや結果の出力までべた書き  文字列連結で、固定フォーマットで HTMLソースコードを生成してる (その用途しか想定してない)
  • 6. 実装しなおし後C#  クラス化  1クラス数フィールド  switch分岐解消(多態化)  債務分割  ゲーム ロジックだけ切り出し  出力用のフォーマットは別途行う (今や元より高機能だけども) 同様の機能の実装 (四角1つ1つが1クラス)
  • 7. ちなみに: 書き換えの理由  理由もなく書き替えない  100倍程度の速度差だと動機として弱い※  クライアント上でも同じロジック使うから ネットワーク切れ チートされると てもプレイしたい まずい クライアント上実装必須 サーバー上実装必須  サバクラ両方で使うからC#  ちなみに、クライアントはiOS  サーバーもMonoにする† ※ サーバー代金が問題になるような負荷でもなかった たぶん、データベース アクセスとかの方がよっぽどネック † 「サーバーOSはそのままLinuxにするかも」という意味 このモジュール以外はP●Pのまま&同一サーバー内実行
  • 8. その他の効能  整理されたことで  開発ペースはかなり速い (前はバグが1か月取れない※とかあった)  債務分割(ビューの切り離し)で  コマンドライン デバッグ可能に  (サーバー、クライアントはもちろん) 企画者向けのバランス検証ツールともコード共有化  他のゲームでも使う予定 ※ かかる工数的に、直しても見合わないという判断あり バグを直すんじゃなくて、バグってるアイテムの出現確率を落として回避
  • 10.
  • 11.
  • 12. その他の効能(再)  整理されたことで  開発ペースはかなり速い (前はバグが1か月取れない※とかあった)  債務分割(ビューの切り離し)で  コンソール デバッグ可能に  (サーバー、クライアントはもちろん) 企画者向けのバランス検証ツールともコード共有化  他のゲームでも使う予定 これ
  • 13. つまり  こういう状態 主要機能 共有 Window デバッグ用 iOS Linux デスクトップ コマンド クライアント サーバー クライアント ライン Window ストア アプリ 今更1個増えたくらい どうってことない※ ※ ロジック担当の発言です。UI担当の方ごめんなさい。
  • 14. ロジック担当の発言です。UI担当の方ごめんなさい。
  • 15.
  • 16. 実際にやったことの片鱗を  三択クイズ アプリ  実際に作ったものそのものではないものの、似た仕組み で実装  Windowsストア アプリでデモを
  • 17. 三択クイズ  制御フロー的にはこんなの View Model ループ 出題 問題を表示 問題選択 問題集 回答 回答 答え 答えを表示 正誤判定 OK 次の問題へ 全問終了 No Yes 結果 結果を表示 合格判定
  • 18. ポイント1: Modelはいろいろ使う 用途 • ゲーム本体 Model • サーバー上でチート検証 ループ • プランナー向け調整ツール 出題 • デバッグはコマンドラインで 問題選択 問題集 回答 • iOS、Windows、Linux… 答え 正誤判定 • GUI、CUI • 手動、自動 次の問題へ 全問終了 No Yes 結果 合格判定
  • 19. ポイント2: 完全状況再現 乱数シード 値を記録 Model ループ • ユーザー回答を記録 出題 • 与えた値が同じな 問題選択 問題集 ら、 回答 完全に同じ実行結果 答え 正誤判定 次の問題へ 用途 全問終了 No • チート検証 Yes • オンライン対戦 結果 • ゲーム途中での中断/再開 合格判定
  • 20. ポイント3: View⇔Model往復 制御フローはModel側 が管理してる/すべき View Model 双方向 ループ 制御フローの 出題 問題を表示 問題選択 問題集 中断と再開が必要 回答 回答 答え 答えを表示 正誤判定 OK 次の問題へ 全問終了 No Yes 結果 結果を表示 合格判定
  • 21. ポイント4: 非同期 I/O処理 タイマー処理 =非同期 View Model • ユーザー操作を待ったり ループ • アニメーション終了を待ったり 出題 問題を表示 問題選択 問題集 回答 回答 答え 答えを表示 正誤判定 OK 次の問題へ 全問終了 No Yes 結果 結果を表示 合格判定
  • 22. ポイント まとめ  ポイント  ViewとModelの分離必須  制御フローはModel側で  完全状況再現  ViewとModelの双方向のやりとり  (Model側から見て)Viewは非同期  三択クイズごときですら、たやすくない  うまく扱えれば、いろいろなゲームに応用可能
  • 23. どういうものを作ったか Model 制御フローの中断と再開 = イテレーター  制御フローはModel側で Interaction Channel  完全状況再現 間を取り持つクラス  ViewとModelの双方向のやりとり  (Model側から見て)Viewは非同期 View 非同期 = Taskクラス
  • 24. Model  イテレーター化 Model ループ 出題 問題選択 問題集 回答 答え 正誤判定 次の問題へ 全問終了 No Yes 結果 合格判定
  • 25. Model  イテレーター化 int correctCount = 0; foreach (var q in _questions) { var qm = new Q(q); 問題選択 出題 yield return qm; var isCorrect = qm.Response == q.AnswerIndex; if (isCorrect) correctCount++; 正誤判定 答え yield return new A(isCorrect); } var correctRate = correctCount / num; 結果 yield return new Result( 合格判定 correctRate, _acceptableRate);
  • 26. Interaction Channel  ViewとModelをつなぐ部分 View Model ループ 出題 問題を表示 問題選択 問題集 回答 回答 答え 答えを表示 正誤判定 OK 次の問題へ 全問終了 No Yes 結果 結果を表示 合格判定
  • 27. Interaction Channel  ViewとModelをつなぐ部分 Modelの制御フロー Model (イテレーター)を登録 public class Channel<TMessage> { public Channel(IEnumerator<TMessage> coroutine) public Task RunAsync() 実行 public void AddAsyncHandler(Func<T, Task<TR>> handler) where T : Tmessage } ViewはTask非同期で応答 View 同期版(Func<T, TR>)もある
  • 28. View  Interaction Channelから来たメッセージを処理  Task非同期 View 出題 問題を表示 回答 回答 答え 答えを表示 OK 次の問題へ 結果 結果を表示
  • 29. View  Interaction Channelから来たメッセージを処理  Task非同期 例: 問題の表示と回答(コマンドライン版) channel.AddHandler<Q, int>(m => 問題文 { Console.WriteLine(m.Question.Statement); int i = 1; 選択肢 foreach (var op in m.Question.Options) Console.WriteLine("{0}. {1}", i++, op); Console.Write("何番?: "); int answer = int.Parse(Console.ReadLine(); return answer - 1; }); 回答番号
  • 30. 結果  意外と汎用性高い  今日のデモ用の三択クイズ  実務で、2系統のロジックをこれで実装  結構な種類のゲームがこの仕組みに乗る  残念なところ  C#に型マッチング機能欲しい  型で分岐してる  アクター的機構も欲しい  他の言語のアクター機能も、使いやすいとは言い難いけど
  • 31.
  • 32.