注意
この投稿はAIに質問して回答をもらった内容を転載するという実験的な投稿です。
AIの回答の正確性は保証しません。内容が正しいかどうかは各自で判断してください。
gamemakerの動作について質問だ。オブジェクトo_plantsが100個あるとする。
o_plantsにはメソッドがある。
collision_and_sway = function()
{
当たり判定と揺れ
}
これをo_plantsのStepで実行する
collision_and_sway();
それと、
どこか1箇所で
with (plants) collision_and_sway();
と書くのではパフォーマンス(負荷)は違うのか?
ChatGPT
いい質問だね!GameMakerで大量のオブジェクトを操作するとき、各オブジェクトのStepイベントで処理するのと、with
文を使って一括で処理するのでは、パフォーマンスに違いが出るか?という話だね。
基本的な仕組み理解
1. 各オブジェクトの Step で実行:
// o_plants の Step イベント内
collision_and_sway();
この方法では、全ての o_plants
インスタンスがそれぞれのStepイベントで毎フレーム collision_and_sway()
を呼ぶことになる。つまり、
- 100個あれば100回呼ばれる。
- GameMakerの内部で各インスタンスが自律的に処理する。
- 並列的な印象だけど、実際はループで1つずつ処理されている。
2. with
を使って一括で呼ぶ:
with (o_plants) collision_and_sway();
この書き方だと、その瞬間に存在している o_plants
全てに対して処理を実行する。
- たとえば、コントローラオブジェクトのStepイベントやDrawイベントなど、任意の場所でこれを実行すると、全インスタンスに処理を適用する。
with
の中はGameMakerが内部でループ処理する。
パフォーマンスの違いは?
基本的には大差ない。
なぜなら、どちらも内部的にはすべてのインスタンスに対して関数を一度ずつ実行する処理だから。
ただし、厳密に言えば次のような違いがある:
方法 | メリット | デメリット |
---|---|---|
各インスタンスのStepで処理 | 分散していてオブジェクト指向的 | オーバーヘッドがわずかに高い(イベントの分散処理) |
with(o_plants) で一括処理 | 管理しやすく、ループの集中化ができる | 可読性が下がることも(他インスタンスのコードを別オブジェクトで書く) |
使い分けのおすすめ
- 常に揺れを入れるような恒常処理なら、各インスタンスのStepに入れる方が自然。
- 一時的にすべての植物に特別な処理を与える(風が吹いた時など)なら、
with(o_plants)
を使って一括で処理するのが効率的。
補足:最適化を意識するなら
- GameMakerでは1フレームで何千回も関数を呼ぶと負荷になる。
- 100回程度ならどちらの方法でも十分高速。
結論
両方100回処理するなら基本的にパフォーマンス差はごくわずか。
でも目的や構造に応じて適切な方法を選ぶのがベスト!
もっと細かくベンチマークしたいなら、show_debug_message()
やcurrent_time
を使って実測もできるよ。やってみたい?