SlideShare a Scribd company logo
1 of 17
Download to read offline
コルーチンを使おう
WHO AM I?
• ナムアニクラウドと申します
• 主にC#でゲームなどのプログラミングをしてます
• Twitter: @NumAniCloud




                          Twitterアイコン→
コルーチンとは
// イメージ(C#)
IEnumerator ShotRoutine(){
  Shot();
  yield return 0;       // ここで抜ける!
  Shot();               // 続きはあとで実行する
}

• 関数とかメソッドの仲間です
• 途中で抜けて、あとで再開することができるのが特徴です
実行のイメージ
// 定義                  // 呼び出し
IEnumerator Fiber(){   void Main(){
   Shot();                var x = Fiber();
   yield return 0;        x.MoveNext();
   Shot();                Hoge();
   Shot();                x.MoveNext();
   yield return 0;        x.MoveNext();
   yield return 0;        x.MoveNext();
}                      }
実行のイメージ
// 定義                  // 呼び出し
IEnumerator Fiber(){   void Main(){
   Shot();                var x = Fiber();
   yield return 0;        x.MoveNext();
   Shot();                Hoge();
   Shot();                x.MoveNext();
   yield return 0;        x.MoveNext();
   yield return 0;        x.MoveNext();
}                      }
実行のイメージ
// 定義                  // 呼び出し
IEnumerator Fiber(){   void Main(){
   Shot();                var x = Fiber();
   yield return 0;        x.MoveNext();
   Shot();                Hoge();
   Shot();                x.MoveNext();
   yield return 0;        x.MoveNext();
   yield return 0;        x.MoveNext();
}                      }
実行のイメージ
// 定義                  // 呼び出し
IEnumerator Fiber(){   void Main(){
   Shot();                var x = Fiber();
   yield return 0;        x.MoveNext();
   Shot();                Hoge();
   Shot();                x.MoveNext();
   yield return 0;        x.MoveNext();
   yield return 0;        x.MoveNext();
}                      }
実行のイメージ
// 定義                  // 呼び出し
IEnumerator Fiber(){   void Main(){
   Shot();                var x = Fiber();
   yield return 0;        x.MoveNext();
   Shot();                Hoge();
   Shot();                x.MoveNext();
   yield return 0;        x.MoveNext();
   yield return 0;        x.MoveNext();
}                      }
例(C#)
ゲームで敵キャラクターの制御をしたい

        • 下へ移動
                   void Update(){
        • 2秒待つ        下へ移動;
        • 5回繰り返す      2秒待つ;
          • 弾を撃つ      5回繰り返す
                      {
          • 1秒待つ         弾を撃つ;
                         1秒待つ;
                      }
                   }                理想
例(C#)
ゲームで敵キャラクターの制御をしたい

        • 下へ移動
                        void Update(){
        • 2秒待つ             下へ移動;
        • 5回繰り返す           2秒待つ;
          • 弾を撃つ           5回繰り返す
                           {
          • 1秒待つ              弾を撃つ;
ここで処理を止めたいけど、                 1秒待つ;
この関数を抜けないと他の関数の処理ができず      }
ゲーム全体が止まってしまう!          }                理想
                   現実
例(C#)
そこでコルーチン                                        ここでは1秒 = 60フレーム

IEnumerator Update(){
   下へ移動;
   for( int i = 0; i < 120; ++i )       void 2秒待つ
                                          // Update(){
      yield return 0;                      下へ移動;
   for( int i = 0; i < 5; ++i ){           2秒待つ;
      弾を撃つ;                                5回繰り返す
      for( int j = 0; j < 60; ++j ) // 1秒待つ{
         yield return 0;                      弾を撃つ;
   }                                          1秒待つ;
}                                          }
                                        }
コルーチンなしだと
毎フレーム呼び出してもらうしかない                                 ここでは1秒 = 60フレーム

int t = 0;                カウンターが必要
void Update(){
   if( t == 0 ){
      下へ移動;              for文も使えないので、変な条件式を書く
   }
   if( t >= 120 && ( t – 120 ) % 60 == 0 && t < 120 + 60 * 5 ){
      弾を撃つ;
   }
   ++t;                                時間を絶対的に指定
}
使い道
• RPGの戦闘シーンなど
 • プレイヤーの作戦が決まるまで戦闘の進行を止める
 • エフェクトの表示が終わるまで戦闘の進行を止める

• 状態のシーケンスの管理
 • 敵が歩いて登場する状態 → 攻撃する状態 → 攻撃が終わって退場する状態

• 遅延評価
 • 呼び出しが達するまで計算しないことで無駄を省く
 • 無限の量の計算を途中で打ち切る

• ジェネレータ(値を列挙する)
使い道:遅延評価
IEnumerator Fiber(){           void Main(){
    Func();                        var x = Fiber();
    yield return 0;                x.MoveNext();
    Func();                        x.MoveNext();
    yield return 0;            }
    HeavyFunc();   // 実行されない
    yield return 0;
}
使い道:ジェネレータ
IEnumerator Fiber(){   void Main(){
    yield return 3;       var x = Fiber();
    yield return 1;       x.MoveNext();
    yield return 4;       x.Current;     // 3
                          x.MoveNext();
    yield return 1;
                          x.Current;     // 1
    yield return 5;
                          x.MoveNext();
}
                          x.Current;     // 4
                       }
コルーチンを使える言語機能
• C#のイテレータ
• Luaのコルーチン
• Pythonのジェネレータ
• Rubyのファイバー
• 東方弾幕風スクリプトのマイクロスレッド
• (まだあるかも)
ありがとうございました

More Related Content

What's hot

新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみたfirewood
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3DKouji Hosoda
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)MITSUNARI Shigeo
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
Destructive Call
Destructive CallDestructive Call
Destructive CallCryolite
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyimasahiro
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 

What's hot (20)

新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
C++でHello worldを書いてみた
C++でHello worldを書いてみたC++でHello worldを書いてみた
C++でHello worldを書いてみた
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
Map
MapMap
Map
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
Boost Tour 1.50.0 All
Boost Tour 1.50.0 AllBoost Tour 1.50.0 All
Boost Tour 1.50.0 All
 
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
Xeon PhiとN体計算コーディング x86/x64最適化勉強会6(@k_nitadoriさんの代理アップ)
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
llvm入門
llvm入門llvm入門
llvm入門
 
Destructive Call
Destructive CallDestructive Call
Destructive Call
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRuby
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 

Viewers also liked

UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張Ryota Murohoshi
 
ゲーム開発とデザインパターン
ゲーム開発とデザインパターンゲーム開発とデザインパターン
ゲーム開発とデザインパターンTakashi Komada
 
【 #Unity会 】このUnityがすごい2015年版
【 #Unity会 】このUnityがすごい2015年版【 #Unity会 】このUnityがすごい2015年版
【 #Unity会 】このUnityがすごい2015年版ui nyan
 
XNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところXNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところIGDA Japan
 
Unity入門講座その1
Unity入門講座その1Unity入門講座その1
Unity入門講座その1spi8823
 
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜narumi_
 
ゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのことゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのことMASA_T_O
 
C++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ているC++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ているfjnl
 
左と右の話
左と右の話左と右の話
左と右の話Cryolite
 
コルーチンの実装について
コルーチンの実装についてコルーチンの実装について
コルーチンの実装についてTaku Miyakawa
 
Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術Isamu Suzuki
 
テキストアドベンチャーゲームのアーキテクチャと工程
テキストアドベンチャーゲームのアーキテクチャと工程テキストアドベンチャーゲームのアーキテクチャと工程
テキストアドベンチャーゲームのアーキテクチャと工程tuna cook
 
Tokyo nodefestival workshop_20161112
Tokyo nodefestival workshop_20161112Tokyo nodefestival workshop_20161112
Tokyo nodefestival workshop_20161112Junichi Okamura
 
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発するHiroyuki Kusu
 
Node.js with WebRTC DataChannel
Node.js with WebRTC DataChannelNode.js with WebRTC DataChannel
Node.js with WebRTC DataChannelmganeko
 
普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlinRyota Murohoshi
 
ゲームオブジェクトの管理
ゲームオブジェクトの管理ゲームオブジェクトの管理
ゲームオブジェクトの管理Shota Homma
 
ゲーム開発とMVC
ゲーム開発とMVCゲーム開発とMVC
ゲーム開発とMVCTakashi Komada
 

Viewers also liked (20)

UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張
 
Unityで覚えるC#
Unityで覚えるC#Unityで覚えるC#
Unityで覚えるC#
 
ゲーム開発とデザインパターン
ゲーム開発とデザインパターンゲーム開発とデザインパターン
ゲーム開発とデザインパターン
 
【 #Unity会 】このUnityがすごい2015年版
【 #Unity会 】このUnityがすごい2015年版【 #Unity会 】このUnityがすごい2015年版
【 #Unity会 】このUnityがすごい2015年版
 
XNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところXNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところ
 
Unity入門講座その1
Unity入門講座その1Unity入門講座その1
Unity入門講座その1
 
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
個人開発でゲーム一本完成させるまでの苦難の道のり 〜企画編〜
 
ゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのことゲーム制作初心者が知るべき8つのこと
ゲーム制作初心者が知るべき8つのこと
 
C++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ているC++が仲間になりたそうにこちらを見ている
C++が仲間になりたそうにこちらを見ている
 
左と右の話
左と右の話左と右の話
左と右の話
 
コルーチンの実装について
コルーチンの実装についてコルーチンの実装について
コルーチンの実装について
 
Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術Node.jsに縁のない職場でnode.jsを使い始める戦術
Node.jsに縁のない職場でnode.jsを使い始める戦術
 
テキストアドベンチャーゲームのアーキテクチャと工程
テキストアドベンチャーゲームのアーキテクチャと工程テキストアドベンチャーゲームのアーキテクチャと工程
テキストアドベンチャーゲームのアーキテクチャと工程
 
Tokyo nodefestival workshop_20161112
Tokyo nodefestival workshop_20161112Tokyo nodefestival workshop_20161112
Tokyo nodefestival workshop_20161112
 
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
【東京Node学園祭2016】Node.js × Babel で AWS Lambda アプリケーションを開発する
 
Node.js with WebRTC DataChannel
Node.js with WebRTC DataChannelNode.js with WebRTC DataChannel
Node.js with WebRTC DataChannel
 
普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin
 
ゲームオブジェクトの管理
ゲームオブジェクトの管理ゲームオブジェクトの管理
ゲームオブジェクトの管理
 
ゲーム開発とMVC
ゲーム開発とMVCゲーム開発とMVC
ゲーム開発とMVC
 
C#の書き方
C#の書き方C#の書き方
C#の書き方
 

Similar to コルーチンを使おう

オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)Kota Mizushima
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code ReadingKenichirou Oyama
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Masataka Motokurumada
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2dHiroshi Oyamada
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみるftnk
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編Unity Technologies Japan K.K.
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化翔新 史
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター Unity Technologies Japan K.K.
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
 
Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!KAIKenzo
 
D言語会議#1
D言語会議#1D言語会議#1
D言語会議#19rnsr
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語るAkira Takahashi
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーmganeko
 

Similar to コルーチンを使おう (20)

オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)Scalaの限定継続の応用と基本(改訂版)
Scalaの限定継続の応用と基本(改訂版)
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code Reading
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
 
Boost tour 1_40_0
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
 
CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化CUDAを利用したPIV解析の高速化
CUDAを利用したPIV解析の高速化
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター
 
x86とコンテキストスイッチ
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
 
Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!Enjoy handwritten digits recognition AI !!
Enjoy handwritten digits recognition AI !!
 
D言語会議#1
D言語会議#1D言語会議#1
D言語会議#1
 
C++0x 言語の未来を語る
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語る
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 

More from amusementcreators

More from amusementcreators (20)

ライセンスの話
ライセンスの話ライセンスの話
ライセンスの話
 
空間分割
空間分割空間分割
空間分割
 
わたしのゲーミング
わたしのゲーミングわたしのゲーミング
わたしのゲーミング
 
曲線について
曲線について曲線について
曲線について
 
HTML5でゲームが作れます
HTML5でゲームが作れますHTML5でゲームが作れます
HTML5でゲームが作れます
 
C++11のつかいかた
C++11のつかいかたC++11のつかいかた
C++11のつかいかた
 
DUAL SHOCK2で遊ぼう
DUAL SHOCK2で遊ぼうDUAL SHOCK2で遊ぼう
DUAL SHOCK2で遊ぼう
 
Pythonでゲーム作る
Pythonでゲーム作るPythonでゲーム作る
Pythonでゲーム作る
 
ライフゲーム
ライフゲームライフゲーム
ライフゲーム
 
Lt nande linux_nano
Lt nande linux_nanoLt nande linux_nano
Lt nande linux_nano
 
Lt130123
Lt130123Lt130123
Lt130123
 
20121212
2012121220121212
20121212
 
Kim120 lt 12_6
Kim120 lt 12_6Kim120 lt 12_6
Kim120 lt 12_6
 
かんたん作曲講座(2)
かんたん作曲講座(2)かんたん作曲講座(2)
かんたん作曲講座(2)
 
かんたん作曲講座(1)
かんたん作曲講座(1)かんたん作曲講座(1)
かんたん作曲講座(1)
 
猫には分からないオセロAIの仕組み
猫には分からないオセロAIの仕組み猫には分からないオセロAIの仕組み
猫には分からないオセロAIの仕組み
 
フォントのしくみ
フォントのしくみフォントのしくみ
フォントのしくみ
 
AVRマイコン入門
AVRマイコン入門 AVRマイコン入門
AVRマイコン入門
 
読みやすいプログラム、書き換えやすいプログラム
読みやすいプログラム、書き換えやすいプログラム読みやすいプログラム、書き換えやすいプログラム
読みやすいプログラム、書き換えやすいプログラム
 
IEとメモ帳でかんたんゲーム開発
IEとメモ帳でかんたんゲーム開発IEとメモ帳でかんたんゲーム開発
IEとメモ帳でかんたんゲーム開発
 

Recently uploaded

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 

Recently uploaded (7)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

コルーチンを使おう

  • 2. WHO AM I? • ナムアニクラウドと申します • 主にC#でゲームなどのプログラミングをしてます • Twitter: @NumAniCloud Twitterアイコン→
  • 3. コルーチンとは // イメージ(C#) IEnumerator ShotRoutine(){ Shot(); yield return 0; // ここで抜ける! Shot(); // 続きはあとで実行する } • 関数とかメソッドの仲間です • 途中で抜けて、あとで再開することができるのが特徴です
  • 4. 実行のイメージ // 定義 // 呼び出し IEnumerator Fiber(){ void Main(){ Shot(); var x = Fiber(); yield return 0; x.MoveNext(); Shot(); Hoge(); Shot(); x.MoveNext(); yield return 0; x.MoveNext(); yield return 0; x.MoveNext(); } }
  • 5. 実行のイメージ // 定義 // 呼び出し IEnumerator Fiber(){ void Main(){ Shot(); var x = Fiber(); yield return 0; x.MoveNext(); Shot(); Hoge(); Shot(); x.MoveNext(); yield return 0; x.MoveNext(); yield return 0; x.MoveNext(); } }
  • 6. 実行のイメージ // 定義 // 呼び出し IEnumerator Fiber(){ void Main(){ Shot(); var x = Fiber(); yield return 0; x.MoveNext(); Shot(); Hoge(); Shot(); x.MoveNext(); yield return 0; x.MoveNext(); yield return 0; x.MoveNext(); } }
  • 7. 実行のイメージ // 定義 // 呼び出し IEnumerator Fiber(){ void Main(){ Shot(); var x = Fiber(); yield return 0; x.MoveNext(); Shot(); Hoge(); Shot(); x.MoveNext(); yield return 0; x.MoveNext(); yield return 0; x.MoveNext(); } }
  • 8. 実行のイメージ // 定義 // 呼び出し IEnumerator Fiber(){ void Main(){ Shot(); var x = Fiber(); yield return 0; x.MoveNext(); Shot(); Hoge(); Shot(); x.MoveNext(); yield return 0; x.MoveNext(); yield return 0; x.MoveNext(); } }
  • 9. 例(C#) ゲームで敵キャラクターの制御をしたい • 下へ移動 void Update(){ • 2秒待つ 下へ移動; • 5回繰り返す 2秒待つ; • 弾を撃つ 5回繰り返す { • 1秒待つ 弾を撃つ; 1秒待つ; } } 理想
  • 10. 例(C#) ゲームで敵キャラクターの制御をしたい • 下へ移動 void Update(){ • 2秒待つ 下へ移動; • 5回繰り返す 2秒待つ; • 弾を撃つ 5回繰り返す { • 1秒待つ 弾を撃つ; ここで処理を止めたいけど、 1秒待つ; この関数を抜けないと他の関数の処理ができず } ゲーム全体が止まってしまう! } 理想 現実
  • 11. 例(C#) そこでコルーチン ここでは1秒 = 60フレーム IEnumerator Update(){ 下へ移動; for( int i = 0; i < 120; ++i ) void 2秒待つ // Update(){ yield return 0; 下へ移動; for( int i = 0; i < 5; ++i ){ 2秒待つ; 弾を撃つ; 5回繰り返す for( int j = 0; j < 60; ++j ) // 1秒待つ{ yield return 0; 弾を撃つ; } 1秒待つ; } } }
  • 12. コルーチンなしだと 毎フレーム呼び出してもらうしかない ここでは1秒 = 60フレーム int t = 0; カウンターが必要 void Update(){ if( t == 0 ){ 下へ移動; for文も使えないので、変な条件式を書く } if( t >= 120 && ( t – 120 ) % 60 == 0 && t < 120 + 60 * 5 ){ 弾を撃つ; } ++t; 時間を絶対的に指定 }
  • 13. 使い道 • RPGの戦闘シーンなど • プレイヤーの作戦が決まるまで戦闘の進行を止める • エフェクトの表示が終わるまで戦闘の進行を止める • 状態のシーケンスの管理 • 敵が歩いて登場する状態 → 攻撃する状態 → 攻撃が終わって退場する状態 • 遅延評価 • 呼び出しが達するまで計算しないことで無駄を省く • 無限の量の計算を途中で打ち切る • ジェネレータ(値を列挙する)
  • 14. 使い道:遅延評価 IEnumerator Fiber(){ void Main(){ Func(); var x = Fiber(); yield return 0; x.MoveNext(); Func(); x.MoveNext(); yield return 0; } HeavyFunc(); // 実行されない yield return 0; }
  • 15. 使い道:ジェネレータ IEnumerator Fiber(){ void Main(){ yield return 3; var x = Fiber(); yield return 1; x.MoveNext(); yield return 4; x.Current; // 3 x.MoveNext(); yield return 1; x.Current; // 1 yield return 5; x.MoveNext(); } x.Current; // 4 }
  • 16. コルーチンを使える言語機能 • C#のイテレータ • Luaのコルーチン • Pythonのジェネレータ • Rubyのファイバー • 東方弾幕風スクリプトのマイクロスレッド • (まだあるかも)