プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4 2011/11/8 マルチスレッドと 真・ストリーミング再生.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

著作物の利用と使用 開 始開 始 再生時間:3分50秒. 著 作 権 法著 作 権 法著 作 権 法著 作 権 法 利用するには 皆さん、著作物の利用 と使用には区別がある ことを知っています か? 使用するには 作った人の許諾が必要 『著作物の利用と使用』 使うときのルールを 守る必要がある.
C++ 基礎. 目次 C++ とは? C++ におけるオブジェクト指向 課題 C++ とは? Cには足りなかったものが付与されて出来た物 具体的には、 情報の隠蔽(カプセル化) 共通の名前付け(関数のオーバーロード) 再利用の仕組み クラスの導入 など オブジェクト指向 C++ では大規模なプログラミングの.
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作 第4回 マルチスレッドとネットワーク. 今日の内容 マルチスレッド – ローディングの進捗表示とか – 処理高速化も見込めます ネットワーク通信 – 必然的にマルチスレッドを扱います.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
Generic programming と STL
Applet 岡部 祐典 鈴木 敬幸.
プログラミング基礎I(再) 山元進.
C#によるWindowsFormApplication入門
情報理工学部 情報システム工学科 ラシキアゼミ3年 H 岡田 貴大
アプレット (Applet)について.
アルゴリズムとデータ構造1 2007年6月12日
卒研:データベースチーム 第4回 JSP、サーブレット
基礎プログラミングおよび演習 第9回
技術トピックス 2014/08.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
C言語講座 第4回 ポインタ.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
構造体.
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
プロジェクト演習Ⅱ インタラクティブゲーム制作
JAVA GUIプログラミング 第5回 ボタンとそのイベント処理.
社会人学習講座 「Javaプログラミング概論」
インタラクティブ・ゲーム制作 <プログラミングコース>
C#とC++とオブジェクト指向 上甲 健史.
情報学部 プログラミング体験教室 (中級編)
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
Flyingware : バイトコード変換による 安全なエージェントの実行
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
補足説明.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
マルチスレッド処理 マルチプロセス処理について
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
インタラクティブ・ゲーム制作 <プログラミングコース>
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
ゲーム開発モデルの基礎.
Webプロキシ HTTP1.0 ヒント CS-B3 ネットワークプログラミング  &情報科学科実験I.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
インタラクティブ・ゲーム制作 プログラミングコース 補足資料
プロジェクト演習Ⅱ インタラクティブゲーム制作
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
オブジェクト プログラミング 第2回 プログラムの基本.
オブジェクト指向プログラミング クラス 継承
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
JAVA GUIプログラミング 第3回 イベント処理① マウスイベント.
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
C#プログラミング実習 第3回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
バネモデルの シミュレータ作成 精密工学科プログラミング基礎 資料.
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
モグラたたき.
JAVA入門⑥ クラスとインスタンス.
高度プログラミング演習 (11).
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
ソフトウェア工学 知能情報学部 新田直也.
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
3.1 シューティングゲームの当たり判定 当たったら死亡.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
C言語講座第5回 2017 構造体.
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4 2011/11/8 マルチスレッドと 真・ストリーミング再生

今日の内容 マルチスレッドプログラム – 1つのプログラム内で2カ所以上 「同時に実行」できる程度の能力 – 重い処理で画面や入力受付を止めたくない 時や、設計次第では高速化にも寄与 音楽再生の改善 – ロード中に音が止まらなくなるよ! – やったね!

マルチスレッドとは 1つのプログラムの中で複数の関数が 同時に(並列して)動かせる技術のこと – 今まで皆さんが書いていたプログラムは 「実行している箇所」は1カ所だけだった シングルスレッド マルチスレッドの導入により、メイン ループを回しつつ、他のスレッドで重い 処理をさせることができるようになる

例えば // いつものメインループ while(true) { // 画面描画や入力受付 update(); // BGM再生 play(); // この中で重たいロードが発生 loadHeavy(); // ここで数秒間処理が止まると当然update()側に処理が渡らない! // 当然play()も呼ばれないので曲再生が止まる }

何故音楽が止まるのか? OpenALでは「キュー バッファ」と呼ばれ る方式によってスト リーミング再生して いる play()の中で更新を しているので、長時 間play()が呼ばれな いとバッファを使い 切って止まる 数秒分の 波形データ 数秒分の 波形データ 再生時間再生時間

こんなことが出来るようになる! // こっちはメインループ while(true) { // 画面描画や入力受付 update(); // BGM再生 if(再生開始?) playStart(); // 後は投げっぱなしでおk // この中で重たいロードが発生 if(読み込む?) loadStart(); if(読み込み中?) { 今何%くらいかを取得; 画面に表示して待たせる; } // 別スレッドを作成 void playMain() { while(true) { play(); if( ほげほげ )break; } // それとは別に作ってもいい void loadMain() { loadHeavy(); }

メリット・デメリット 重い処理をメイン ループから外して処 理の高速化、効率化 が見込める – バックグラウンド読み 込み、ローディングの 進捗表示、ネットワー ク処理、BGMのスト リーミング再生など夢 は広がるばかり データのアクセスに 制約が付く バグった時の対応難 度が跳ね上がる 苦労して別スレッド にしてもその割には リターンが少ない、 あるいは悪化するこ ともある

今回のサンプルは Windows限定コード boostというライブラリを使うと、 機種依存せずにスレッド処理が可能 ただし、ライブラリのサイズが膨大かつ、 コンパイル速度が低下するなどの影響も boostはおすすめしたいのですが、 今回は学習の利便性をとって Windowsネイティブの実装にしました

使い方 Javaライクにしてあります – ThreadBaseクラスを継承して MyThreadクラスを作る – main()をオーバーライドして、 別スレッドで行う処理を実装する – MyThreadオブジェクトを作り、 start()をコール main()を直接コールしてはだめ – 止める時はend()をコール

別スレッドで操作している データの参照 必ず受け渡し用のメンバ関数を作る そのメンバ関数内でlock()~unlock()を忘 れずにコールする – lock()して – 返値用の変数にデータをコピーしたりして – unlock()する これを怠ると、データの読み書きが かちあってSUGOIことになる

コンストラクタとデストラクタを 使ったテクニック lock()~unlock()で わざわざ関数全体を 囲うのが面倒 あるスコープに入っ た時と出た時に行う 処理を楽に書きたい じゃあ→こんなん どうでしょう? class fkut_CriticalSection { public: fkut_CriticalSection(void) { fkut_ThreadBase::lock(); }; ~fkut_CriticalSection() { fkut_ThreadBase::unlock(); }; // このクラスの変数をスコープ内に 宣言するだけでおkになる // 型名が長いのが嫌なら typedef を typedef fkut_CriticalSection fkut_CS

Segaの偉い人曰く… プログラムは基本シングルスレッドで書 くモノである マルチスレッドプログラムで起きる挙動 は人間の理解を超えている 本当にどうしても必要な場合に、最低限 の利用に留めることをおすすめする だ、そうです

アドバイス よく分からなかった ら使わなくてもいい 無理して使ってもド ツボにはまるだけな ので これが出来ないと作 れない「遊び」とい うのは存在しない – スマートにはなるけど 使いどころは – BGM 再生用に 1 本 – データロード用に 1 本 データロードしつつ ゲーム本体を動かすの は厳禁 進捗表示や待機アニメ 程度にする ぐらいにしておこう