目次

Game Programming Patterns

https://gameprogrammingpatterns.com/contents.html

ゲームプログラミングでよく使われるデザインパターンを解説しているサイト。

Command

Flyweight

Observer

Prototype

Subclass Sandbox

SuperPower

  それぞれの具体クラスで使うメソッド()
  サウンド()
  パーティクル()
  移動()
  座標取得()
  
SuperPower < SkyLaunch    
SkyLaunch
  superpowerのメソッドを用いる()

多くなって来た場合、さらに分割する。サウンド関係で分けるとか…。

SuperPower
  SoundPlayer()
  ...
SoundPlayer  
  sound()
  stop()
  setvolume()
  ...

みたいな。ベースクラスは、とにかくシンプルに保つ。

Component

再利用可能な部品に分割する。

Component: PhysicsComponent, GraphicsComponent

このようにして分割。

GameObjectを継承して、各Componentのインスタンスを生成することで再利用が可能。

GameObjectはComponentを集めるだけで、実際にはほとんど何もしない。

Event Queue

その都度すべて実行していては遅くなるのでキューに入れて実行する方式にする。 音やダメージなど、イベントをキューに入れて、処理していく。たとえば音が同時にたくさんなった場合(敵を2体同時に倒したときの断末魔)、ある数に達するとキューに追加しないなど。これによって遅くなるのを防ぎ、ゲーム体験もよくする。

キューを作るには?環状キューが便利。headとtailを用意しておいて、実行が終わったらheadを前にすすめて前の中身を削除。maxの長さに達したらheadに戻るようにする。

動的割当とコピーがなく、シンプルでキャッシュの使いやすい方法である。

イベント(event,notification)、メッセージ(message,request)、は似たような意味で使われるが、微妙な概念の違いがある。

リスナーによって、シングルキャストとブロードキャストがある。

ガベージコレクションがある言語であれば、使わないキューのアイテムを削除するのをあまり考えなくてよい。

Service Locator

いつでも使えるように便利にしたい。便利で柔軟になったsingletonパターンという感じ?

service、service provider、locater。

service providerに登録する。locatorで実装と呼び出しを対応づけする(電話帳みたいに)。 他で実装を知ることはない。高度な分離。

登録されてないやつが呼ばれたときは、Null Objectを使う。ないものを呼び出してもクラッシュすることなく安全にできる。 プログラマーでなくても動作を安全に変更できる。まさにフレームワークでよくあることだな。適当にコピペしてれば、認証機能をつけれたりする。プログラマーではないんですねw(悲)。

サービスを提供することがロケーターの仕事?

実装していないサービスはnullを返すようにしておけば、そのたびに止まらない。 これは大きなチームでの開発では役に立つことである。

Data Locality

箱と黒魔術の例。黒魔術を使った仕事は一瞬で終わるのだが、運ぶために仕事のほとんどの時間を使い、一日が終わってしまう。 運ぶ倉庫係はあまり頭がよくない。遅い。作業スペースは限られているので直しにいかないといけない。

コンピューターではこれと同じことが起こる。 つまりCPU処理は早いがデータを運ぶのに時間がかかる。早くするには、一気にまとめて運ぶとか、同時に運ぶとか工夫する必要がある。

キャッシュの話。

要するに、必要となるデータをまとめようという話。AI, render, physicsで使うエンティティはそれぞれまとめると、アクセスが効率的になる。隣り合っているので、あちこち行く必要がない。キャッシュに入る。

なんかよくわからないなぁ…。

一つにまとめたやつ(=particle?)を、ソートしたりとりあえず使わないヤツはフラグつけたりする。いちいちソートするのは非効率なので追加するときに交換する。

Dirty Flag

不必要な仕事を遅らせる。

Object Pool

オブジェクトを個別に割当てて解放する代わりに、プールするオブジェクトを再利用することでパフォーマンスとメモリ使用量を改善する。

Spatial Partition

オブジェクトを位置によって編成されたデータ構造に格納することで効率的に配置。