Optimize asset references to support direct registration to reduce Delegate memory allocations and overhead

This commit is contained in:
Wojtek Figat
2025-06-08 00:58:15 +02:00
parent bffb175a9b
commit 73c30d3d89
26 changed files with 365 additions and 141 deletions

View File

@@ -27,16 +27,13 @@ AnimatedModel::AnimatedModel(const SpawnParams& params)
, _counter(0)
, _lastMinDstSqr(MAX_Real)
, _lastUpdateFrame(0)
, SkinnedModel(this)
, AnimationGraph(this)
{
_drawCategory = SceneRendering::SceneDrawAsync;
GraphInstance.Object = this;
_box = BoundingBox(Vector3::Zero);
_sphere = BoundingSphere(Vector3::Zero, 0.0f);
SkinnedModel.Changed.Bind<AnimatedModel, &AnimatedModel::OnSkinnedModelChanged>(this);
SkinnedModel.Loaded.Bind<AnimatedModel, &AnimatedModel::OnSkinnedModelLoaded>(this);
AnimationGraph.Changed.Bind<AnimatedModel, &AnimatedModel::OnGraphChanged>(this);
AnimationGraph.Loaded.Bind<AnimatedModel, &AnimatedModel::OnGraphLoaded>(this);
}
AnimatedModel::~AnimatedModel()
@@ -889,6 +886,26 @@ void AnimatedModel::OnGraphLoaded()
SyncParameters();
}
void AnimatedModel::OnAssetChanged(Asset* asset, void* caller)
{
if (caller == &SkinnedModel)
OnSkinnedModelChanged();
else if (caller == &AnimationGraph)
OnGraphChanged();
}
void AnimatedModel::OnAssetLoaded(Asset* asset, void* caller)
{
if (caller == &SkinnedModel)
OnSkinnedModelLoaded();
else if (caller == &AnimationGraph)
OnGraphLoaded();
}
void AnimatedModel::OnAssetUnloaded(Asset* asset, void* caller)
{
}
bool AnimatedModel::HasContentLoaded() const
{
return (SkinnedModel == nullptr || SkinnedModel->IsLoaded()) && Entries.HasContentLoaded();

View File

@@ -13,7 +13,7 @@
/// Performs an animation and renders a skinned model.
/// </summary>
API_CLASS(Attributes="ActorContextMenu(\"New/Animation/Animated Model\"), ActorToolbox(\"Visuals\")")
class FLAXENGINE_API AnimatedModel : public ModelInstanceActor
class FLAXENGINE_API AnimatedModel : public ModelInstanceActor, IAssetReference
{
DECLARE_SCENE_OBJECT(AnimatedModel);
friend class AnimationsSystem;
@@ -422,6 +422,11 @@ private:
void OnGraphChanged();
void OnGraphLoaded();
// [IAssetReference]
void OnAssetChanged(Asset* asset, void* caller) override;
void OnAssetLoaded(Asset* asset, void* caller) override;
void OnAssetUnloaded(Asset* asset, void* caller) override;
public:
// [ModelInstanceActor]
bool HasContentLoaded() const override;

View File

@@ -30,7 +30,6 @@ GPU_CB_STRUCT(Data {
Sky::Sky(const SpawnParams& params)
: Actor(params)
, _shader(nullptr)
, _psSky(nullptr)
, _psFog(nullptr)
{

View File

@@ -29,10 +29,9 @@ StaticModel::StaticModel(const SpawnParams& params)
, _vertexColorsDirty(false)
, _vertexColorsCount(0)
, _sortOrder(0)
, Model(this)
{
_drawCategory = SceneRendering::SceneDrawAsync;
Model.Changed.Bind<StaticModel, &StaticModel::OnModelChanged>(this);
Model.Loaded.Bind<StaticModel, &StaticModel::OnModelLoaded>(this);
}
StaticModel::~StaticModel()
@@ -224,7 +223,7 @@ void StaticModel::RemoveVertexColors()
_vertexColorsDirty = false;
}
void StaticModel::OnModelChanged()
void StaticModel::OnAssetChanged(Asset* asset, void* caller)
{
if (_residencyChangedModel)
{
@@ -241,7 +240,7 @@ void StaticModel::OnModelChanged()
GetSceneRendering()->RemoveActor(this, _sceneRenderingKey);
}
void StaticModel::OnModelLoaded()
void StaticModel::OnAssetLoaded(Asset* asset, void* caller)
{
Entries.SetupIfInvalid(Model);
UpdateBounds();
@@ -316,6 +315,10 @@ void StaticModel::FlushVertexColors()
RenderContext::GPULocker.Unlock();
}
void StaticModel::OnAssetUnloaded(Asset* asset, void* caller)
{
}
bool StaticModel::HasContentLoaded() const
{
return (Model == nullptr || Model->IsLoaded()) && Entries.HasContentLoaded();

View File

@@ -11,7 +11,7 @@
/// Renders model on the screen.
/// </summary>
API_CLASS(Attributes="ActorContextMenu(\"New/Model\"), ActorToolbox(\"Visuals\")")
class FLAXENGINE_API StaticModel : public ModelInstanceActor
class FLAXENGINE_API StaticModel : public ModelInstanceActor, IAssetReference
{
DECLARE_SCENE_OBJECT(StaticModel);
private:
@@ -154,11 +154,14 @@ public:
API_FUNCTION() void RemoveVertexColors();
private:
void OnModelChanged();
void OnModelLoaded();
void OnModelResidencyChanged();
void FlushVertexColors();
// [IAssetReference]
void OnAssetChanged(Asset* asset, void* caller) override;
void OnAssetLoaded(Asset* asset, void* caller) override;
void OnAssetUnloaded(Asset* asset, void* caller) override;
public:
// [ModelInstanceActor]
bool HasContentLoaded() const override;