mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-12-11 21:31:30 +00:00
0360e33a00
As I had long suspected, building large hierarchies is fiendishly expensive (at least O(N^2)). However, this is because the hierarchies are structured such that adding high-level nodes results in a lot of copying due to the flattened (breadth-first) layout (which does make for excellent breadth-first performance when working with a hierarchy). Using tree mode allows adding new nodes to be O(1) (I guess O(N) for the size of the sub-tree being added, but that's not supported yet) and costs only an additional 8 bytes per node. Switching from flat mode to tree mode is very cheap as only the additional tree-related indices need to be fixed up (they're almost entirely ignored in flat mode). Switching from tree to flat mode is a little more expensive as the entire tree needs to be copied, but it seems to be an O(N) (size of the tree). With this, building the style editor window went from about 25% to about 5% (and most of that is realloc!), with a 1.3% cost for switching from tree mode to flat mode. There's still a lot of work to do (supporting removal and tree inserts).
90 lines
2.5 KiB
C
90 lines
2.5 KiB
C
/*
|
|
hierarchy.h
|
|
|
|
ECS Hierarchy management
|
|
|
|
Copyright (C) 2021 Bill Currie <bill@taniwha.org>
|
|
|
|
Author: Bill Currie <bill@taniwha.org>
|
|
Date: 2021/02/26
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to:
|
|
|
|
Free Software Foundation, Inc.
|
|
59 Temple Place - Suite 330
|
|
Boston, MA 02111-1307, USA
|
|
|
|
*/
|
|
|
|
#ifndef __QF_ecs_hierarchy_h
|
|
#define __QF_ecs_hierarchy_h
|
|
|
|
#include "QF/qtypes.h"
|
|
|
|
/** \defgroup entity Hierarchy management
|
|
\ingroup utils
|
|
*/
|
|
///@{
|
|
|
|
/** Descriptors for components attached to every entity in the hierarchy.
|
|
*/
|
|
typedef struct hierarchy_type_s {
|
|
uint32_t num_components;
|
|
const struct component_s *components;
|
|
} hierarchy_type_t;
|
|
|
|
typedef struct hierref_s {
|
|
struct hierarchy_s *hierarchy;
|
|
uint32_t index; ///< index in hierarchy
|
|
} hierref_t;
|
|
|
|
typedef struct hierarchy_s {
|
|
uint32_t num_objects;
|
|
uint32_t max_objects;
|
|
uint32_t *ent;
|
|
uint32_t *childCount;
|
|
uint32_t *childIndex;
|
|
uint32_t *parentIndex;
|
|
uint32_t *nextIndex;
|
|
uint32_t *lastIndex;
|
|
const hierarchy_type_t *type;
|
|
void **components;
|
|
struct ecs_registry_s *reg;
|
|
uint32_t href_comp;
|
|
bool tree_mode; // use for fast building
|
|
} hierarchy_t;
|
|
|
|
#define nullindex (~0u)
|
|
|
|
hierarchy_t *Hierarchy_New (struct ecs_registry_s *reg, uint32_t href_comp,
|
|
const hierarchy_type_t *type, int createRoot);
|
|
void Hierarchy_Reserve (hierarchy_t *hierarchy, uint32_t count);
|
|
hierarchy_t *Hierarchy_Copy (struct ecs_registry_s *reg, uint32_t href_comp,
|
|
const hierarchy_t *src);
|
|
void Hierarchy_Delete (hierarchy_t *hierarchy);
|
|
void Hierarchy_SetTreeMode (hierarchy_t *hierarchy, bool tree_mode);
|
|
|
|
uint32_t Hierarchy_InsertHierarchy (hierarchy_t *dst, const hierarchy_t *src,
|
|
uint32_t dstParent, uint32_t srcRoot);
|
|
void Hierarchy_RemoveHierarchy (hierarchy_t *hierarchy, uint32_t index,
|
|
int delEntities);
|
|
|
|
hierref_t Hierarchy_SetParent (hierarchy_t *dst, uint32_t dstParent,
|
|
hierarchy_t *src, uint32_t srcIndex);
|
|
void Hierref_DestroyComponent (void *href);
|
|
|
|
///@}
|
|
|
|
#endif//__QF_ecs_hierarchy_h
|