Y
Mechanics schrieb:
Yamahari schrieb:
Der Vorteil eines Vektors bestehend darin, dass die Elemente kontinuierlich im Speicher untergebracht sind. Das beschleunigt das Iterieren enorm; besonders wenn jedes System eben dies 60 Mal in der Sekunde macht.
Ja, das hat schon was, ich verwende auch gern Vektoren, auch sowas wie boost::flat_map. Du musst aber schauen, ob sich das wirklich lohnt und ob du dir dadurch nicht unnötige Nachteile einhandelst. 60 mal pro Sekunde hört sich jetzt nicht nach so viel an (du wirst wahrscheinlich mehr Probleme mit dem Scheduling des Betriebssystems haben) und so wahnsinnig groß wird der Vorteil beim Iterieren auch nicht sein. Da musst du abwägen (und messen), was mehr ins Gewicht fällt.
60 mal pro Sekunde * die Anzahl der Systeme, um genau zu sein.
Achja meine Entity Klasse sieht jetzt übrigens wie folgt aus, falls es jemanden interessiert:
template < typename TSettings >
class Entity
{
public:
Entity()
: alive_{ true }
{}
~Entity() = default;
Entity(const Entity& entity) = default;
Entity(Entity&& entity) = default;
public:
Entity& operator=(const Entity& entity) = default;
Entity& operator=(Entity&& entity) = default;
public:
template < typename T, typename = std::enable_if_t<TSettings::template IsComponent<T>::value> >
void addComponentDataIndex(typename TSettings::DataIndex index) noexcept
{
componentDataIndices_.emplace(TSettings::template ComponentId<T>::value, index);
}
template < typename T, typename = std::enable_if_t<TSettings::template IsTag<T>::value> >
void attachTag() noexcept
{
signature_[TSettings::ComponentCount::value + TSettings::template TagId<T>::value] = true;
}
template < typename T, typename = std::enable_if_t<TSettings::template IsTag<T>::value> >
void detachTag() noexcept
{
signature_[TSettings::ComponentCount::value + TSettings::template TagId<T>::value] = false;
}
template < typename T, typename = std::enable_if_t<TSettings::template IsComponent<T>::value> >
void removeComponentDataIndex() noexcept
{
componentDataIndices_.erase(TSettings::template ComponentId<T>::value);
}
template < typename T, typename = std::enable_if_t<TSettings::template IsComponent<T>::value> >
void setComponentSignatureBit(bool value) noexcept
{
signature_[TSettings::template ComponentId<T>::value] = value;
}
template < typename T, typename = std::enable_if_t<TSettings::template IsTag<T>::value> >
bool hasTag() const noexcept
{
return signature_[TSettings::ComponentCount::value + TSettings::template TagId<T>::value];
}
template < typename T, typename = std::enable_if_t<TSettings::template IsComponent<T>::value> >
auto getComponentDataIndex() const noexcept
{
return componentDataIndices_[TSettings::template ComponentId<T>::value];
}
public:
void kill() noexcept
{
alive_ = false;
}
bool isAlive() const noexcept
{
return alive_;
}
const auto& getComponentDataIndices() const noexcept
{
return componentDataIndices_;
}
const auto& getSignature() const noexcept
{
return signature_;
}
private:
bool alive_;
std::map<typename TSettings::ComponentIndex, typename TSettings::DataIndex> componentDataIndices_;
typename TSettings::Signature signature_;
};
Das Problem mit den Handles besteht auch noch, kümmere ich mich aber später drum