少し背景を説明しますが、エンティティシステムにENTTを使用して、C ++の友人と進化ゲームをコーディングしています。クリーチャーは2Dマップ内を歩き回り、緑や他のクリーチャーを食べ、繁殖し、その形質が変化します。
さらに、ゲームをリアルタイムで実行した場合のパフォーマンスは良好です(60fpsは問題ありません)が、大幅な変更を確認するために4時間待つ必要がないように大幅にスピードアップできるようにしたいと思います。だから、私はできるだけ早くそれを取得したい。
クリーチャーが食物を見つけるための効率的な方法を見つけるのに苦労しています。各クリーチャーは、彼らに十分近い最高の食べ物を探すことになっています。
食べたい場合、中央に描かれた生き物は、149.64の半径(視界距離)で自分の周りを見回し、栄養、距離、およびタイプ(肉または植物)に基づいて、追求すべき食物を判断することになっています。 。
すべてのクリーチャーの食料を見つける機能は、実行時間の約70%を消費します。現在どのように書かれているかを単純化すると、次のようになります。
for (creature : all_creatures)
{
for (food : all_entities_with_food_value)
{
// if the food is within the creatures view and it's
// the best food found yet, it becomes the best food
}
// set the best food as the target for creature
// make the creature chase it (change its state)
}
この関数は、クリーチャーが食物を見つけて状態が変わるまで、食物を探しているすべてのクリーチャーのティックごとに実行されます。また、すでに特定の食物を追いかけているクリーチャーに新しい食物が出現するたびに実行され、すべての人が利用可能な最高の食物を確実に追跡します。
このプロセスをより効率的にする方法についてのアイデアを受け入れています。から複雑さを減らしたいのですが、それが可能かどうかはわかりません。
私がすでに改善している方法の1つは、all_entities_with_food_value
グループをソートして、クリーチャーが食べるには大きすぎる食物を繰り返したときに、そこで止まるようにすることです。その他の改善点は大歓迎です!
編集:返信いただきありがとうございます!私はさまざまな答えからさまざまなものを実装しました:
私はまず、罪悪感関数が5ティックごとに1回だけ実行されるように単純に作成しました。これにより、ゲームについて何も目に見えて変化することなく、ゲームが約4倍高速になりました。
その後、食品検索システムに、それが実行されるのと同じティックで生成された食品の配列を保存しました。このように、クリーチャーが追いかけている食べ物と登場した新しい食べ物を比較するだけです。
最後に、スペースパーティショニングの研究とBVHとクアッドツリーを検討した後、後者に進みました。これは私のケースにはるかに単純で、より適していると感じたからです。私はそれを非常に迅速に実装し、パフォーマンスを大幅に改善しました。食べ物の検索にはほとんど時間がかかりません!
今ではレンダリングが私の速度を遅くしているものですが、それは別の日の問題です。皆さん、ありがとうございました!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
する方が、パフォーマンスが十分であれば、「複雑な」ストレージ構造を実装するよりも簡単です。(関連:内側のループにもう少しコードを投稿すると役立つ場合があります)