Griffbewegung mit QuadTree

7

Ich habe derzeit eine QuadTree, die alle meine Entitäten enthält. Es funktioniert gut und ich habe es ziemlich anständig optimiert, aber das einzige, was weh tut, ist, dass ich fast jeden Frame entferne und in ihn einfüge. Ein kleiner Code:

    entityMap.remove(it->second, it->second->getLastAABB()); // Removes the entity, getLastAABB is it's last location

    QuadTree* nearest = entityMap.getLowestRoot(moved);
    std::unordered_set<Locatable*> entities = nearest->getAll();
    for (auto itt = entities.begin(); itt != entities.end(); itt++) {
        AABB aabb = (*itt)->getAABB();
        if (aabb.collides(moved)) {
            // COLLISION
        }
    }

    entityMap.insert(it->second);

Dieser Code wird 30 Mal pro Sekunde ausgeführt. Ich verwende eine schmutzige Flagge, damit nur Entitäten behandelt werden, die verschoben wurden. entityMapist das QuadTreeselbst.

Jeder Rat zu verringern insertund removeAnrufe wird geschätzt.

Tipps48
quelle

Antworten:

2

Entgegen der allgemeinen Meinung können Sie die Quad-Tree-Funktionseinfügung optimieren. Die übliche Implementierung von Einfügen besteht darin, von der Wurzel zu den Blättern zu wechseln und den am besten geeigneten Knoten zu finden. In Game Programming Gems 2 gibt es einen Artikel, in dem beschrieben wird, wie Sie diesen Knoten sofort finden können, wenn Sie die Ausmaße des Quatree kennen (können auf Octree erweitert werden) und die Ausdehnung des Objektbegrenzungsrahmens. Auf diese Weise können Sie sofort die Ebene und den Knoten bestimmen, der die Box enthält. Glücklicherweise finden Sie in diesem Artikel eine vollständige Erklärung .

Sie können auch die Nachbarn jedes Knotens verfolgen. Wenn sich ein Objekt bewegt, wissen Sie, wohin es geht. Dies funktioniert insbesondere, wenn Sie einen vollständigen Quatree haben. Andernfalls empfehle ich den ersten Ansatz.

concept3d
quelle
1

Ich vermute das insertund removedurchquere den Quad-Baum von Wurzel zu Blatt, und deshalb sind Sie besorgt über seine Leistung?

(Als Faustregel gilt übrigens, dass niemals Optimierungen durchgeführt werden, es sei denn, Sie haben gefragt, ob ich ein echtes Leistungsproblem gemessen habe, und können dies bejahen.)

In Spielen würde die überwiegende Mehrheit der Bewegungen kontinuierlich sein, dh Ihre Entitäten bewegen sich von einem Blattknoten zu einem Nachbarn. Sie hätten einen Baum mit verknüpften Blättern. Selbst wenn die Blätter einen sehr entfernten Vorfahren haben, müssen Sie nur den lokalen Verknüpfungen folgen, anstatt den ganzen Baum hinauf.

Congusbongus
quelle
Sie schlagen also eine verknüpfte Liste von QuadTree vor?
Tipps48
@ Tips48 nein, ich meine einen Baum, in dem die Blätter Verbindungen zu ihren Nachbarn haben, wie ein B + -Baum
Congusbongus