SlideShare uma empresa Scribd logo
1 de 17
Baixar para ler 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のファイバー
• 東方弾幕風スクリプトのマイクロスレッド
• (まだあるかも)
ありがとうございました

Mais conteúdo relacionado

Mais procurados

20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
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 GPU
Takuro Iizuka
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
 

Mais procurados (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向けの自動ベクトル化とか)
 

Destaque

XNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところXNAとはなにか?XNAうれしいところ、うれしくないところ
XNAとはなにか?XNAうれしいところ、うれしくないところ
IGDA Japan
 

Destaque (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#の書き方
 

Semelhante a コルーチンを使おう

オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code Reading
Kenichirou Oyama
 
2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d2012 03-03-titanium plusquicktigame2d
2012 03-03-titanium plusquicktigame2d
Hiroshi Oyamada
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
freedom404
 
Python で munin plugin を書いてみる
Python で munin plugin を書いてみるPython で munin plugin を書いてみる
Python で munin plugin を書いてみる
ftnk
 
D言語会議#1
D言語会議#1D言語会議#1
D言語会議#1
9rnsr
 

Semelhante a コルーチンを使おう (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 ミニインタープリター&コンパイラー
 

Mais de amusementcreators

HTML5でゲームが作れます
HTML5でゲームが作れますHTML5でゲームが作れます
HTML5でゲームが作れます
amusementcreators
 

Mais de 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とメモ帳でかんたんゲーム開発
 

Último

Último (12)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

コルーチンを使おう

  • 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のファイバー • 東方弾幕風スクリプトのマイクロスレッド • (まだあるかも)