boost study#4

153
mĝìO Boost.勉強会 #4 2011.02.26 2011226日土曜日

Upload: yuki-tamura

Post on 15-Jan-2015

12.882 views

Category:

Technology


1 download

DESCRIPTION

Boost.勉強会 #4 での「ゲーム開発のC++」

TRANSCRIPT

Page 1: Boost study#4

m��ĝìO���

Boost.勉強会 #4 2011.02.26

2011年2月26日土曜日

Page 2: Boost study#4

m��ĝìO���Boost.って? 本当、素人ですみません

Boost.勉強会 #4 2011.02.26

2011年2月26日土曜日

Page 3: Boost study#4

自己紹介

id: Isoparametric(イソッパ)

blog: 神様なんて信じない僕らのために

work: 最近は、Django x Python

misc: C++は最近はさっぱりです

2011年2月26日土曜日

Page 4: Boost study#4

今日の話

特に面白い話はありません

為になる話もありません

話をきいてもゲームはつくれません

本スライドはBoost.とは一切関係がありません

2011年2月26日土曜日

Page 5: Boost study#4

m��ĝìĭ

2011年2月26日土曜日

Page 6: Boost study#4

��������� ��������

2011年2月26日土曜日

Page 7: Boost study#4

­H=

2011年2月26日土曜日

Page 8: Boost study#4

2011年2月26日土曜日

Page 9: Boost study#4

ÏĞò5H=

2011年2月26日土曜日

Page 10: Boost study#4

趣旨

C++でのゲーム開発経験とか雰囲気が伝われば良いかなあと思ってます

あくまで一例なのでというのを踏まえて下さい

2011年2月26日土曜日

Page 11: Boost study#4

リモコン振り回したりとか

二画面でタッチパネルついてたりとか

そんなのの開発経験の話です(古い)

ハード特有の話はしません

ARM946E-S(67.028MHz)、RAM4Mbyteくらいを想定

ハード的には

2011年2月26日土曜日

Page 12: Boost study#4

2011年2月26日土曜日

Page 13: Boost study#4

KaG8IU-[R?a

2011年2月26日土曜日

Page 14: Boost study#4

BC2011年2月26日土曜日

Page 15: Boost study#4

���I2���I2

2011年2月26日土曜日

Page 16: Boost study#4

2011年2月26日土曜日

Page 17: Boost study#4

Y^;61ģ.;R=

2011年2月26日土曜日

Page 18: Boost study#4

m��ĝìIP

2011年2月26日土曜日

Page 19: Boost study#4

èÃ

2011年2月26日土曜日

Page 20: Boost study#4

2011年2月26日土曜日

Page 21: Boost study#4

2011年2月26日土曜日

Page 22: Boost study#4

2011年2月26日土曜日

Page 23: Boost study#4

2011年2月26日土曜日

Page 24: Boost study#4

ç·

2011年2月26日土曜日

Page 25: Boost study#4

2011年2月26日土曜日

Page 26: Boost study#4

そして、唸るワゴン画像と実在のプロジェクトは関係ありません、マジで

2011年2月26日土曜日

Page 27: Boost study#4

2011年2月26日土曜日

Page 28: Boost study#4

I)²`°=ČHPK6

+�Ú±Ñ,L¾.ċĊ³�I./1Č

2011年2月26日土曜日

Page 29: Boost study#4

à`«[î;G

2011年2月26日土曜日

Page 30: Boost study#4

AUAU

2011年2月26日土曜日

Page 31: Boost study#4

+���ĭ(ę.C^,

EG)ĉ_]B[;R?a2ĭ

2011年2月26日土曜日

Page 32: Boost study#4

A]HU

2011年2月26日土曜日

Page 33: Boost study#4

�����EDV/aH=2ĭ

2011年2月26日土曜日

Page 34: Boost study#4

���ę6K.H=2ĭ

2011年2月26日土曜日

Page 35: Boost study#4

��_K.aH=2ĭ

2011年2月26日土曜日

Page 36: Boost study#4

��EDV/ĭ

2011年2月26日土曜日

Page 37: Boost study#4

2011年2月26日土曜日

Page 38: Boost study#4

KaHĭ

2011年2月26日土曜日

Page 39: Boost study#4

Cは流石にないよね

今時Cのプロジェクトは時代錯誤

しかし、現実にはC99すら導入されてなくて涙目

変数宣言がブロック先頭のみとかね

BetterC的な意味合いでもC++

2011年2月26日土曜日

Page 40: Boost study#4

未だになぜ頑なにC?

C++は遅い、と真顔で言う人がいる

でも、単にC++憶えるのめんどいだけだよね

CもせめてC99いれればいいのにね

2011年2月26日土曜日

Page 41: Boost study#4

C++にあってCになくて欲しいもの

コンストラクタ/デストラクタ

クラス(仮想関数)

テンプレート(ジェネリックなコンテナ)

operatorオーバーロード

アロケータ機構(柔軟なメモリ管理)

名前空間、などなど

2011年2月26日土曜日

Page 42: Boost study#4

�I2Þî;aJ.

2011年2月26日土曜日

Page 43: Boost study#4

���Pę6K.

2011年2月26日土曜日

Page 44: Boost study#4

C++は遅くないし

関数のコストはCと同じ

メンバ関数も生成されるasmはCとほぼ同等

classの暗黙のthis渡しも構造化されたCでは、第一引数は何らかのインスタンスなので同じ

仮想関数の呼び出しは純粋な関数よりコストがかかるが抽象化に必須

2011年2月26日土曜日

Page 45: Boost study#4

ĉ.6\TG����EI8/@Ĥ

2011年2月26日土曜日

Page 46: Boost study#4

STLもBoost.も使えるよ

コンパイラはCodeWarriorやProDGだよ

RTTIも使えるよ(使わないけど)

スレッドも使えるよ(危ないけど)

例外も使えるよ(コードでかいけど)

ゲーム機で○○って使えるの?

2011年2月26日土曜日

Page 47: Boost study#4

諸注意

必ず計測はしよう

生成されるコードも見よう

ゲームでよく使われる局所のベクトル演算やマトリクス演算などには注意

operatorにする場合、インライン関数より遅いケースはある

ボトルネックがどこか、は見よう

2011年2月26日土曜日

Page 48: Boost study#4

ÉêI2

n�o��3³ÇÓUĜ.

�x�{ujס³�

2011年2月26日土曜日

Page 49: Boost study#4

ĝì3P<REBZ

2011年2月26日土曜日

Page 50: Boost study#4

ăEBm��ĝìL1.G

143DK8ILáÄ

2011年2月26日土曜日

Page 51: Boost study#4

ĈùħÿÅ

2011年2月26日土曜日

Page 52: Boost study#4

ĒĈù)s�*qurd*

2011年2月26日土曜日

Page 53: Boost study#4

�0Q)

2011年2月26日土曜日

Page 54: Boost study#4

 GO�¯P³ËµL=\

AOĨ

2011年2月26日土曜日

Page 55: Boost study#4

全ての値型は大文字で書かなければならない

VOID、INT、FLOAT、BOOL、など

エディタの自動カラーリングがきかなくなるんだけど……

てか、意味を想像する事すら難しい規約

大変うざいことにBOOLがboolでなくint

virtual BOOL IsDead( VOID ){ return FALSE };

2011年2月26日土曜日

Page 56: Boost study#4

IL26v����xP

ðÝ=\

AOĩ

2011年2月26日土曜日

Page 57: Boost study#4

STLは勿論禁止(標準なのに)

自作も禁止

理由は、よくわからないから(主に本人が)

使わなきゃ憶えられないよ?

残念な事に多重継承も禁止で汎用インターフェイスが一切作れなかったり

あとコンテナもなかったり

2011年2月26日土曜日

Page 58: Boost study#4

d�~K��~cjp

O¾Ć

AOĪ

2011年2月26日土曜日

Page 59: Boost study#4

人名

hidekiUtil_RenderParticle

df3CharHitAtkAttrCalc

ゲーム名

bosActorCreate

ライブラリ名

2011年2月26日土曜日

Page 60: Boost study#4

Ùʦ;K.

AOī

2011年2月26日土曜日

Page 61: Boost study#4

一つのソースに何でも書く

魔法の処理なら処理をhogeMagic.cとかに1ファイルで全部書く

ソースのサイズを見ると700Kbとかある

行数は20,000行……

2011年2月26日土曜日

Page 62: Boost study#4

�prd�i�px

AOĬ

2011年2月26日土曜日

Page 63: Boost study#4

安全にキャストする気が無い

static_castとか頑なに使わない

Cスタイルキャストの方が楽だろ?とか言う

キャストミスっててメモリ破壊で死んでたりする

2011年2月26日土曜日

Page 64: Boost study#4

こんなの絶対おかしいよ

2011年2月26日土曜日

Page 65: Boost study#4

2011年2月26日土曜日

Page 66: Boost study#4

´3Z?2ĭ

2011年2月26日土曜日

Page 67: Boost study#4

èé3ďÍH4K.d�~KĈùħÿÅP

F6ZK.8I

ĜĆ

2011年2月26日土曜日

Page 68: Boost study#4

Ùʦ;G�ÞIȽ`»LĀ0\8I

ĜĆ

2011年2月26日土曜日

Page 69: Boost study#4

ĉĎ3Ê�=\ĜĆKÛĂPDVaI�/�

ĜĆ

2011年2月26日土曜日

Page 70: Boost study#4

2011年2月26日土曜日

Page 71: Boost study#4

-]�!!$%�OČPĭ

2011年2月26日土曜日

Page 72: Boost study#4

何勉強会だっけ……2011年2月26日土曜日

Page 73: Boost study#4

DXEIÀEGN

2011年2月26日土曜日

Page 74: Boost study#4

WEBÙÆÞ;.2P¢L;G

2011年2月26日土曜日

Page 75: Boost study#4

C++ Coding Standards101のルール、ガイドライン、ベストプラクティス

R>ĐU/)ĐRA/Ĥ

2011年2月26日土曜日

Page 76: Boost study#4

RTTIはOFF

ダウンキャストの安全性を考えるならdynamic_castを使うべき

しかし、バグ以外で絶対に成功することが解っているのに使うのは勿体ない

ダウンキャストはよく使うので特に

polymorphic_downcastで、デバッグ時だけdynamic_castするという手も

2011年2月26日土曜日

Page 77: Boost study#4

例外はOFF

例外を投げてエラーを管理したい、というのはかなり重要度が高い

けど、例外はほぼ不要な場合もコードを生成してしまう

また、例外安全性を組み込み環境で実現することは難しいのでoff

2011年2月26日土曜日

Page 78: Boost study#4

newは自作する

フリースタンディング環境では、OSがないため、メモリ管理は自前でがっつりやらないとダメ

アロケータやメモリブロックの管理は自前できちんとやる(アライメントとかもね)

アロケータにはdlmallocを用いたりした

2011年2月26日土曜日

Page 79: Boost study#4

多重継承は使う

java的なInterfaceの意味で多重継承を用いる

変にごちゃごちゃ継承するのはダメ

場所を持つもの、方向を持つもの、持ち上げられるもの、などを抽象化し、インターフェイスを実装する形にする

2011年2月26日土曜日

Page 80: Boost study#4

constは必ず使う

不変なインターフェイスは必ずconst

引数も変更があり得ないなら、ゼッタイにconstにする

mutable/immutableを意識すると、コンパイラがチェックしてくれるのでいろいろ嬉しい

2011年2月26日土曜日

Page 81: Boost study#4

テンプレートは使う

勿論、テンプレートは使う

複雑怪奇なテンプレートでない限り、生成されるコードはたいしたことない

スマートリンカが動けばコードサイズはきにならない

デバッガの表示はちょっと面倒

2011年2月26日土曜日

Page 82: Boost study#4

����%� ��#�����"��%�����#�#'

2011年2月26日土曜日

Page 83: Boost study#4

��2011年2月26日土曜日

Page 84: Boost study#4

g�g�n�vz

2011年2月26日土曜日

Page 85: Boost study#4

¬ĢP©�ë

2011年2月26日土曜日

Page 86: Boost study#4

「STLよくわからんからコンテナつくったー」「STLが不便だからコンテナつくったー」

2011年2月26日土曜日

Page 87: Boost study#4

A8LPäâIĕ6d�~K

d�r�~fdp3

2011年2月26日土曜日

Page 88: Boost study#4

Array() virtual ‾Array() void alloc(unsigned int size); void release(); void setFuncValid(FuncValid i); FuncValid funcValid(); void setFuncEqual(FuncEqual i); FuncEqual funcEqual(); void setFuncSort(FuncSort i); FuncSort funcSort(); bool valid(); unsigned int size(); T &operator[](unsigned int index); T &operator[](int index); Array<T> &operator=(const Array<T> &i); T *ptr(); void push(T&v); void pop(T &v); T *find(T &v); T *findInvalid(); void sort(); bool validAssert(); unsigned int count(FuncValid func); void clear(); void fill(T i);

え?なにこれ

2011年2月26日土曜日

Page 89: Boost study#4

そういうのに限って「STLって使えねえ」

2011年2月26日土曜日

Page 90: Boost study#4

����0GK.OP1£H=

2011年2月26日土曜日

Page 91: Boost study#4

謎自作ダメ。ゼッタイ。

namespaceも使わずにArrayだと……

イテレータとかガン無視だと……

STLのインターフェイス……

何がしたかったのかわからん

2011年2月26日土曜日

Page 92: Boost study#4

2011年2月26日土曜日

Page 93: Boost study#4

必要ならまずvectorを検討しよう

多くの場合std::vectorが最も高速で、高効率で最も要件を満たす

ある程度のサイズがあり、先頭に追加/削除したいときはdequeも検討しよう

listはメモリ効率などの関係であまりお勧めできない(ゲーム機では特に)

2011年2月26日土曜日

Page 94: Boost study#4

vectorのはまりどころ

clearを呼んでもメモリは解放されない

reserveせずに使うとメモリの確保/解放タイミングをコントロールできない

vectorをiterateしているときに要素を外そうとして不正なイテレータになったり、コンテナを壊すのに注意(割とよくある)

shrinkやメモリ解放はswap技法で

2011年2月26日土曜日

Page 95: Boost study#4

例えばprotected継承を使う

class Vector : protected std::vector<T, Allocator> で実装やインターフェイスを継承し、Vector≠std::vectorにできる

using std::vector<T>::empty; のようにインターフェイスを公開/非公開にできる

宣言時にreserve数を指定させると初期化時に期待した大きさにできるなど制御可

2011年2月26日土曜日

Page 96: Boost study#4

std::map、std::setを使う前に

hash_mapとhash_setがないか探そう

コンパイラのドキュメントに独自の名前空間で用意されていたりする

CodeWarriorならMetrowerks名前空間、gccなら__gnu_cxxなど(tr1の unordered_xxxでも可)

codepad、ideoneなどでも試せるよ

2011年2月26日土曜日

Page 97: Boost study#4

どうしてhash_xxx?

(大抵)赤黒木で実装されているstd::map、std::setより、ハッシュで実装された方が省メモリかつ高速

木は挿入、削除、検索が対数O(log N)

ハッシュは概ね定数O(1)

ハッシュが衝突しまくるとO(N)だけど

計測はしましょう!

2011年2月26日土曜日

Page 98: Boost study#4

デバッグ版STLも使おう

コンパイラベンダにもよると思うが、STLにはデバッグ版が用意されるケースがある

その場合、不正なイテレータの検知などをしてくれるようになる

切り替えられるようにしておくと便利

また、Boost.のようにエラーハンドリングも、エラー関数で出来る事が多い

2011年2月26日土曜日

Page 99: Boost study#4

K@8aK8ILà`Ě/2

2011年2月26日土曜日

Page 100: Boost study#4

m��ÛHO���OÌå¦P

§DþW2KßC2Z

2011年2月26日土曜日

Page 101: Boost study#4

���3���'%�ó.G.\õKOL����3I]K.

8I3ÐėLĔ4\

2011年2月26日土曜日

Page 102: Boost study#4

����3K.OH

�Ô?Mrd��kHzt���LßM

2011年2月26日土曜日

Page 103: Boost study#4

�u�`�Fñ¥;BÁL¨®�Í|�k

HôâßI2´H;Xĭ

2011年2月26日土曜日

Page 104: Boost study#4

HUJ/;GU

Ą�;B6KEBZ

2011年2月26日土曜日

Page 105: Boost study#4

��� ���%#! ���#%$����

2011年2月26日土曜日

Page 106: Boost study#4

EASTLとは

Electronic Artsによって実装されたゲーム開発向けのSTL

メモリ周りに色々気遣い

仕様>EASTL -- Electronic Arts Standard Template Library

実装>EAWebKit 1.10に含まれてます

2011年2月26日土曜日

Page 107: Boost study#4

STLと何が違う?

STLはポータブルなコードではないのでポータブルに実装されている(主張)

intrusive_container(侵入型コンテナ)などを実装してある

アロケータを使いやすくしてある

オブジェクトのコピーをムーブにしてコスト削減できる、などなど

2011年2月26日土曜日

Page 108: Boost study#4

オレオレと何が違う?

STLとほぼ同じインターフェイス、イテレータ、アルゴリズムを持つ

拡張は、高効率、明瞭性、デバッグのためのものである

STLに足りず、ゲームに必要であろうと思われるコンテナを追加してある

2011年2月26日土曜日

Page 110: Boost study#4

�0Q8aKb�l�r

typedef eastl::list<int, fixed_allocator> IntList;typedef IntList::node_type IntListNode;

IntListNode buffer[200];IntList intList;intList.get_allocator().init( buffer, sizeof(buffer), sizeof(IntListNode), __alignof(IntListNode));

2011年2月26日土曜日

Page 111: Boost study#4

eastl::fixed_vectorと

eastl::vector軽く紹介

2011年2月26日土曜日

Page 112: Boost study#4

fixed_vector

固定長のvector

消費メモリが途中で増えるとか嫌です、という時に使う

引数で固定かのon/off制御できる

要素を増やせない場合は未定義の動作か例外

2011年2月26日土曜日

Page 113: Boost study#4

T = 言わずと知れた型 nodeCount = オブジェクトの最大数 bEnableOverflow = オブジェクトの最大数をオーバーフローできるか? Allocator = オーバーフロー時にのみ使われるアロケータ。 bEnableOverflowがtureの時だけ有効。 デフォルトだとグローバルヒープから取得する。

template <typename T, size_t nodeCount, bool bEnableOverflow = true, typename Allocator = EASTLAllocatorType>class fixed_vector

2011年2月26日土曜日

Page 114: Boost study#4

Example usage:fixed_vector<Widget, 128, true> fixedVector; fixedVector.push_back(Widget());fixedVector.resize(200);fixedVector.clear();

2011年2月26日土曜日

Page 115: Boost study#4

eastl::vector

std::vector風、動的配列コンテナ

void push_back(void);など拡張あり

例外を使わず動作するよ

vector<bool>はbit vectorじゃないよ

vector<SomeClass>(x).swap(x);の替わりにset_capacityがあるよ、などなど

2011年2月26日土曜日

Page 116: Boost study#4

 ěPDVaIĐaHK.7Jæ.Pą.Ĥ

OH)ÎġªĀL

2011年2月26日土曜日

Page 117: Boost study#4

RCDVaI

ĐaHK.OHē¬LP

ö0Z]K.ĥºïĦ

2011年2月26日土曜日

Page 118: Boost study#4

A^A^ûđ

2011年2月26日土曜日

Page 119: Boost study#4

�!!$%��0QØLKEB2UNĤ

2011年2月26日土曜日

Page 120: Boost study#4

ý4R=

2011年2月26日土曜日

Page 121: Boost study#4

まぁ、めげずに、

C++を使いましょう!

2011年2月26日土曜日

Page 122: Boost study#4

A^A^�!!$%�

2011年2月26日土曜日

Page 123: Boost study#4

�0Qm��ĝìH

$��#��"%#�&����"%#`�EB

2011年2月26日土曜日

Page 124: Boost study#4

Z)}kEB

¤Ií³L

2011年2月26日土曜日

Page 125: Boost study#4

2011年2月26日土曜日

Page 126: Boost study#4

1. 腕の問題

2. 循環参照の問題

3. 生成/破棄タイミングの問題

なんでバグった?

2011年2月26日土曜日

Page 127: Boost study#4

自分の頭が悪かった

考え無しに何でもshared_ptrというわけにはいかない

shared_ptr/weak_ptrでは要件を満たせなかった

腕の問題

2011年2月26日土曜日

Page 128: Boost study#4

めぐりめぐって循環参照してたりする

お互いがお互いを監視するシーンが多かった

循環参照の問題

2011年2月26日土曜日

Page 129: Boost study#4

誰にも参照されなくなったタイミングで即座に消えると都合が悪い

リソースやインスタンスの生成/破棄はできるだけ意図したタイミングでやりたい

画面描画中に消えたりすると拙い(ラインバッファのゲームとか特に)

生成/破棄の問題

2011年2月26日土曜日

Page 130: Boost study#4

�0QĖ¹č¸¿`ċĊ=\

2011年2月26日土曜日

Page 131: Boost study#4

追尾誘導弾?

いわゆるホーミングミサイル

誘導弾が狙うべきターゲットを参照

誘導弾は発射したオーナーも参照

誘導弾は発生させるループエフェクトも参照

2011年2月26日土曜日

Page 132: Boost study#4

誘導弾

オーナーターゲット

エフェクト2011年2月26日土曜日

Page 133: Boost study#4

誘導弾

オーナーターゲット

エフェクト

座標参照 パラメータ参照

2011年2月26日土曜日

Page 134: Boost study#4

誘導弾

オーナーターゲット

エフェクト

座標参照 パラメータ参照

でも、めぐりめぐってこの誘導弾を見る人でてくるんじゃない?

2011年2月26日土曜日

Page 135: Boost study#4

例えばこんな話も

誘導弾ループエフェクト

エフェクトアタッチャ

2011年2月26日土曜日

Page 136: Boost study#4

例えばこんな話も

誘導弾ループエフェクト

誘導弾消滅時に減衰消滅させたい

エフェクトアタッチャ

エフェクトを追従させたい2011年2月26日土曜日

Page 137: Boost study#4

例えばこんな話も

誘導弾ループエフェクト

誘導弾消滅時に減衰消滅させたい

エフェクトアタッチャ

エフェクトを追従させたい

どこから消す?

2011年2月26日土曜日

Page 138: Boost study#4

ªãhe�rhpr�w��rC7HPğ;.

2011年2月26日土曜日

Page 139: Boost study#4

¶ L��`ćFTG.B.

2011年2月26日土曜日

Page 140: Boost study#4

KaCÜ;.OP

¼ªãKaCĤ

2011年2月26日土曜日

Page 141: Boost study#4

A/C|�y�÷è;Y/of{�ujK¼ªã|�y�`Ò7QĤ

2011年2月26日土曜日

Page 142: Boost study#4

// tuple!!#include <boost/tuple/tuple.hpp>

class HandleBase;

boost::tuple<unsigned long, unsigned long> RegisterHandle(void* object);void UnregisterHandle(HandleBase handle);

class HandleBase{public: // valid か? inline bool isValid() const

2011年2月26日土曜日

Page 143: Boost study#4

template <class T>class Handle : public HandleBase{public: Handle(unsigned long id, unsigned long index) : HandleBase(id, index) { }... // こんなのでアクセス T* operator->() const

2011年2月26日土曜日

Page 144: Boost study#4

モデル

テクスチャ

テクスチャ

動的リソース管理も弱参照で

2011年2月26日土曜日

Page 145: Boost study#4

�!!$%��EGN0000

2011年2月26日土曜日

Page 146: Boost study#4

boost::array = 生配列は全て置換してもいい

boost::tuple = 多値返しに使うと良い

boost::tribool = たまに不定も欲しい

boost::noncopyable = 安全のために便利

リソースやインスタンスの生成/破棄はできるだけ意図したタイミングでやりたいのでshared_ptrは避けた

小物は使いやすいよ

2011年2月26日土曜日

Page 147: Boost study#4

9TaY1111

2011年2月26日土曜日

Page 148: Boost study#4

Boost.使わないやつは

って言われそう2011年2月26日土曜日

Page 149: Boost study#4

RIT

2011年2月26日土曜日

Page 150: Boost study#4

C++は使う前が大変

使ってからも大変(変なプロジェクトだと)

でも、開発を楽にするには必須

STLもBoost.も色んな環境で動きます

メモリが4Mbyteしかなくて諦めない!

まとめ

2011年2月26日土曜日

Page 151: Boost study#4

Óúûđ�!!$%��EI7�""����#�LÂZ]\2Z

2011年2月26日土曜日

Page 152: Boost study#4

ø�Õ)üTGSBûÖ3)

8]CYĤĤ2011年2月26日土曜日

Page 153: Boost study#4

9Ġā-[3I/9:.R;B

2011年2月26日土曜日