From 528c99ecedafc50d121b676f3f7eaee5e04aee9e Mon Sep 17 00:00:00 2001 From: Jason Larabie Date: Thu, 16 Apr 2026 12:50:57 -0700 Subject: [PATCH] Split out @brougkr's work for replacing FTickableGameObject with FTSTicker --- .../Private/Connection/DbConnectionBase.cpp | 94 ++++++++++++------- .../Public/Connection/DbConnectionBase.h | 28 +++--- 2 files changed, 72 insertions(+), 50 deletions(-) diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/DbConnectionBase.cpp b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/DbConnectionBase.cpp index 34d878e42cb..669f8079789 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/DbConnectionBase.cpp +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Private/Connection/DbConnectionBase.cpp @@ -1,7 +1,8 @@ #include "Connection/DbConnectionBase.h" -#include "Connection/DbConnectionBuilder.h" +#include "Connection/DbConnectionBuilder.h" #include "Connection/Credentials.h" #include "Connection/LogCategory.h" +#include "Containers/Ticker.h" #include "ModuleBindings/Types/ClientMessageType.g.h" #include "ModuleBindings/Types/SubscriptionErrorType.g.h" #include "Misc/Compression.h" @@ -65,13 +66,48 @@ static FString DecodeReducerErrorMessage(const TArray& ErrorBytes) } } -UDbConnectionBase::UDbConnectionBase(const FObjectInitializer& ObjectInitializer) - : Super(ObjectInitializer) -{ - NextRequestId = 1; - NextSubscriptionId = 1; - ProcedureCallbacks = CreateDefaultSubobject(TEXT("ProcedureCallbacks")); -} +UDbConnectionBase::UDbConnectionBase(const FObjectInitializer& ObjectInitializer) + : Super(ObjectInitializer) +{ + NextRequestId = 1; + NextSubscriptionId = 1; + ProcedureCallbacks = CreateDefaultSubobject(TEXT("ProcedureCallbacks")); +} + +void UDbConnectionBase::SetAutoTicking(bool bAutoTick) +{ + if (bIsAutoTicking == bAutoTick) + { + return; + } + + bIsAutoTicking = bAutoTick; + + if (bIsAutoTicking) + { + if (!TickerHandle.IsValid()) + { + TickerHandle = FTSTicker::GetCoreTicker().AddTicker(FTickerDelegate::CreateUObject(this, &UDbConnectionBase::OnTickerTick)); + } + } + else if (TickerHandle.IsValid()) + { + FTSTicker::GetCoreTicker().RemoveTicker(TickerHandle); + TickerHandle.Reset(); + } +} + +void UDbConnectionBase::BeginDestroy() +{ + if (TickerHandle.IsValid()) + { + FTSTicker::GetCoreTicker().RemoveTicker(TickerHandle); + TickerHandle.Reset(); + } + bIsAutoTicking = false; + + Super::BeginDestroy(); +} void UDbConnectionBase::Disconnect() { @@ -216,8 +252,8 @@ void UDbConnectionBase::HandleWSBinaryMessage(const TArray& Message) }); } -void UDbConnectionBase::FrameTick() -{ +void UDbConnectionBase::FrameTick() +{ TArray Local; { FScopeLock Lock(&PendingMessagesMutex); @@ -236,31 +272,19 @@ void UDbConnectionBase::FrameTick() { //process the message, this will call DbUpdate or trigger subscription events as needed ProcessServerMessage(Msg); - } -} -void UDbConnectionBase::Tick(float DeltaTime) -{ - if (bIsAutoTicking) - { - FrameTick(); - } -} - -TStatId UDbConnectionBase::GetStatId() const -{ - // This is used by the engine to track tickables, we return a unique stat ID for this class - RETURN_QUICK_DECLARE_CYCLE_STAT(UMyTickableObject, STATGROUP_Tickables); -} - -bool UDbConnectionBase::IsTickable() const -{ - return bIsAutoTicking; -} - -bool UDbConnectionBase::IsTickableInEditor() const -{ - return bIsAutoTicking; -} + } +} + +bool UDbConnectionBase::OnTickerTick(float DeltaTime) +{ + if (HasAnyFlags(RF_BeginDestroyed | RF_FinishDestroyed) || !bIsAutoTicking) + { + return false; + } + + FrameTick(); + return true; +} void UDbConnectionBase::ProcessServerMessage(const FServerMessageType& Message) diff --git a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBase.h b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBase.h index e8c26b3a988..b32221ce641 100644 --- a/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBase.h +++ b/sdks/unreal/src/SpacetimeDbSdk/Source/SpacetimeDbSdk/Public/Connection/DbConnectionBase.h @@ -1,7 +1,8 @@ #pragma once -#include "CoreMinimal.h" -#include "UObject/NoExportTypes.h" +#include "CoreMinimal.h" +#include "Containers/Ticker.h" +#include "UObject/NoExportTypes.h" #include "Types/Builtins.h" #include "Websocket.h" #include "Subscription.h" @@ -114,8 +115,8 @@ struct THasOnUpdateDelegate> : std::true_ { }; -UCLASS() -class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGameObject +UCLASS() +class SPACETIMEDBSDK_API UDbConnectionBase : public UObject { GENERATED_BODY() @@ -135,8 +136,8 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam UFUNCTION(BlueprintCallable, Category="SpacetimeDB") void FrameTick(); - UFUNCTION(BlueprintCallable, Category="SpacetimeDB") - void SetAutoTicking(bool bAutoTick) { bIsAutoTicking = bAutoTick; } + UFUNCTION(BlueprintCallable, Category="SpacetimeDB") + void SetAutoTicking(bool bAutoTick); /** Send a raw JSON message to the server. */ bool SendRawMessage(const FString& Message); @@ -257,9 +258,11 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam } -protected: +protected: - friend class UDbConnectionBuilderBase; + virtual void BeginDestroy() override; + + friend class UDbConnectionBuilderBase; friend class UDbConnectionBuilder; friend class USubscriptionHandleBase; friend class USubscriptionBuilder; @@ -276,13 +279,7 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam UFUNCTION() void HandleWSBinaryMessage(const TArray& Message); - virtual void Tick(float DeltaTime) override; - - virtual TStatId GetStatId() const override; - - virtual bool IsTickable() const override; - - virtual bool IsTickableInEditor() const override; + bool OnTickerTick(float DeltaTime); /** Internal handler that processes a single server message. */ void ProcessServerMessage(const FServerMessageType& Message); @@ -407,6 +404,7 @@ class SPACETIMEDBSDK_API UDbConnectionBase : public UObject, public FTickableGam UPROPERTY() bool bIsAutoTicking = false; + FTSTicker::FDelegateHandle TickerHandle; /** Guard to avoid repeatedly handling the same fatal protocol error. */ FThreadSafeBool bProtocolViolationHandled = false;