diff --git a/Source/Engine/Content/Cache/AssetsCache.cpp b/Source/Engine/Content/Cache/AssetsCache.cpp index e9ce23e1a..188a52583 100644 --- a/Source/Engine/Content/Cache/AssetsCache.cpp +++ b/Source/Engine/Content/Cache/AssetsCache.cpp @@ -141,7 +141,7 @@ void AssetsCache::Init() } stopwatch.Stop(); - LOG(Info, "Asset Cache loaded {0} entries in {1} ms ({2} rejected)", _registry.Count(), stopwatch.GetMilliseconds(), rejectedCount); + LOG(Info, "Asset Cache loaded {0} entries in {1}ms ({2} rejected)", _registry.Count(), stopwatch.GetMilliseconds(), rejectedCount); } bool AssetsCache::Save() diff --git a/Source/Engine/Content/Storage/AssetHeader.h b/Source/Engine/Content/Storage/AssetHeader.h index 3c37ce35e..5c4031993 100644 --- a/Source/Engine/Content/Storage/AssetHeader.h +++ b/Source/Engine/Content/Storage/AssetHeader.h @@ -6,6 +6,7 @@ #include "Engine/Core/Types/Pair.h" #include "Engine/Core/Types/String.h" #if USE_EDITOR +#include "Engine/Core/Types/DateTime.h" #include "Engine/Core/Collections/Array.h" #endif #include "FlaxChunk.h" diff --git a/Source/Engine/Content/Storage/FlaxChunk.h b/Source/Engine/Content/Storage/FlaxChunk.h index 710540a02..df6a8974a 100644 --- a/Source/Engine/Content/Storage/FlaxChunk.h +++ b/Source/Engine/Content/Storage/FlaxChunk.h @@ -78,9 +78,9 @@ public: FlaxChunkFlags Flags = FlaxChunkFlags::None; /// - /// The last usage time (atomic, ticks of DateTime in UTC). + /// The last usage time. /// - int64 LastAccessTime = 0; + double LastAccessTime = 0.0; /// /// The chunk data. diff --git a/Source/Engine/Content/Storage/FlaxStorage.cpp b/Source/Engine/Content/Storage/FlaxStorage.cpp index df99418bb..a24e01884 100644 --- a/Source/Engine/Content/Storage/FlaxStorage.cpp +++ b/Source/Engine/Content/Storage/FlaxStorage.cpp @@ -27,7 +27,7 @@ String AssetHeader::ToString() const void FlaxChunk::RegisterUsage() { - Platform::AtomicStore(&LastAccessTime, DateTime::NowUTC().Ticks); + LastAccessTime = Platform::GetTimeSeconds(); } const int32 FlaxStorage::MagicCode = 1180124739; @@ -229,7 +229,9 @@ uint32 FlaxStorage::GetRefCount() const bool FlaxStorage::ShouldDispose() const { - return Platform::AtomicRead((int64*)&_refCount) == 0 && Platform::AtomicRead((int64*)&_chunksLock) == 0 && DateTime::NowUTC() - _lastRefLostTime >= TimeSpan::FromMilliseconds(500); + return Platform::AtomicRead((int64*)&_refCount) == 0 && + Platform::AtomicRead((int64*)&_chunksLock) == 0 && + Platform::GetTimeSeconds() - _lastRefLostTime >= 0.5; // TTL in seconds } uint32 FlaxStorage::GetMemoryUsage() const @@ -1363,12 +1365,13 @@ void FlaxStorage::Tick() if (Platform::AtomicRead(&_chunksLock) != 0) return; - const auto now = DateTime::NowUTC(); + const double now = Platform::GetTimeSeconds(); bool wasAnyUsed = false; + const float unusedDataChunksLifetime = ContentStorageManager::UnusedDataChunksLifetime.GetTotalSeconds(); for (int32 i = 0; i < _chunks.Count(); i++) { - auto chunk = _chunks[i]; - const bool wasUsed = (now - DateTime(Platform::AtomicRead(&chunk->LastAccessTime))) < ContentStorageManager::UnusedDataChunksLifetime; + auto chunk = _chunks.Get()[i]; + const bool wasUsed = (now - chunk->LastAccessTime) < unusedDataChunksLifetime; if (!wasUsed && chunk->IsLoaded()) { chunk->Unload(); diff --git a/Source/Engine/Content/Storage/FlaxStorage.h b/Source/Engine/Content/Storage/FlaxStorage.h index 77c912c5a..23fb7a35f 100644 --- a/Source/Engine/Content/Storage/FlaxStorage.h +++ b/Source/Engine/Content/Storage/FlaxStorage.h @@ -5,7 +5,6 @@ #include "Engine/Core/Object.h" #include "Engine/Core/Delegate.h" #include "Engine/Core/Types/String.h" -#include "Engine/Core/Types/DateTime.h" #include "Engine/Core/Collections/Array.h" #include "Engine/Platform/CriticalSection.h" #include "Engine/Serialization/FileReadStream.h" @@ -90,7 +89,7 @@ protected: // State int64 _refCount; int64 _chunksLock; - DateTime _lastRefLostTime; + double _lastRefLostTime; CriticalSection _loadLocker; // Storage @@ -115,7 +114,7 @@ private: Platform::InterlockedDecrement(&_refCount); if (Platform::AtomicRead(&_refCount) == 0) { - _lastRefLostTime = DateTime::NowUTC(); + _lastRefLostTime = Platform::GetTimeSeconds(); } } diff --git a/Source/Engine/Core/ObjectsRemovalService.cpp b/Source/Engine/Core/ObjectsRemovalService.cpp index a185ce8b3..454ce7d43 100644 --- a/Source/Engine/Core/ObjectsRemovalService.cpp +++ b/Source/Engine/Core/ObjectsRemovalService.cpp @@ -17,7 +17,7 @@ Span Utilities::Private::HertzSizes(HertzSizesData, ARRAY_COUNT(Her namespace { CriticalSection PoolLocker; - DateTime LastUpdate; + double LastUpdate; float LastUpdateGameTime; Dictionary Pool(8192); uint64 PoolCounter = 0; @@ -114,7 +114,7 @@ void ObjectsRemovalService::Flush(float dt, float gameDelta) bool ObjectsRemoval::Init() { - LastUpdate = DateTime::NowUTC(); + LastUpdate = Platform::GetTimeSeconds(); LastUpdateGameTime = 0; return false; } @@ -124,8 +124,8 @@ void ObjectsRemoval::LateUpdate() PROFILE_CPU(); // Delete all objects - const auto now = DateTime::NowUTC(); - const float dt = (now - LastUpdate).GetTotalSeconds(); + const double now = Platform::GetTimeSeconds(); + const float dt = (float)(now - LastUpdate); float gameDelta = Time::Update.DeltaTime.GetTotalSeconds(); if (Time::GetGamePaused()) gameDelta = 0; diff --git a/Source/Engine/ShadowsOfMordor/Builder.h b/Source/Engine/ShadowsOfMordor/Builder.h index 5475e8028..cf4000389 100644 --- a/Source/Engine/ShadowsOfMordor/Builder.h +++ b/Source/Engine/ShadowsOfMordor/Builder.h @@ -4,6 +4,7 @@ #include "Engine/Content/Assets/Model.h" #include "Engine/Content/Assets/Shader.h" +#include "Engine/Core/Types/DateTime.h" #include "Engine/CSG/CSGMesh.h" #include "Builder.Config.h" diff --git a/Source/Engine/Streaming/IStreamingHandler.h b/Source/Engine/Streaming/IStreamingHandler.h index 0dd615c2a..91a06cb77 100644 --- a/Source/Engine/Streaming/IStreamingHandler.h +++ b/Source/Engine/Streaming/IStreamingHandler.h @@ -13,19 +13,15 @@ class StreamableResource; class FLAXENGINE_API IStreamingHandler { public: - virtual ~IStreamingHandler() = default; -public: - /// /// Calculates target quality level (0-1) for the given resource. /// /// The resource. - /// The current time and date. /// The current platform time (seconds). /// Target quality (0-1). - virtual float CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime) = 0; + virtual float CalculateTargetQuality(StreamableResource* resource, double currentTime) = 0; /// /// Calculates the residency level for a given resource and quality level. diff --git a/Source/Engine/Streaming/StreamableResource.h b/Source/Engine/Streaming/StreamableResource.h index 27ae0a089..d65b8f95c 100644 --- a/Source/Engine/Streaming/StreamableResource.h +++ b/Source/Engine/Streaming/StreamableResource.h @@ -110,8 +110,8 @@ public: struct StreamingCache { - int64 LastUpdate = 0; - int64 TargetResidencyChange = 0; + double LastUpdateTime = 0.0; + double TargetResidencyChangeTime = 0; int32 TargetResidency = 0; bool Error = false; SamplesBuffer QualitySamples; diff --git a/Source/Engine/Streaming/Streaming.cpp b/Source/Engine/Streaming/Streaming.cpp index a7b2cad44..32d19f3d5 100644 --- a/Source/Engine/Streaming/Streaming.cpp +++ b/Source/Engine/Streaming/Streaming.cpp @@ -81,14 +81,14 @@ StreamableResource::~StreamableResource() void StreamableResource::RequestStreamingUpdate() { - Streaming.LastUpdate = 0; + Streaming.LastUpdateTime = 0.0; } void StreamableResource::ResetStreaming(bool error) { Streaming.Error = error; Streaming.TargetResidency = 0; - Streaming.LastUpdate = DateTime::MaxValue().Ticks; + Streaming.LastUpdateTime = 3e+30f; // Very large number to skip any updates } void StreamableResource::StartStreaming(bool isDynamic) @@ -115,7 +115,7 @@ void StreamableResource::StopStreaming() } } -void UpdateResource(StreamableResource* resource, DateTime now, double currentTime) +void UpdateResource(StreamableResource* resource, double currentTime) { ASSERT(resource && resource->CanBeUpdated()); @@ -127,7 +127,7 @@ void UpdateResource(StreamableResource* resource, DateTime now, double currentTi float targetQuality = 1.0f; if (resource->IsDynamic()) { - targetQuality = handler->CalculateTargetQuality(resource, now, currentTime); + targetQuality = handler->CalculateTargetQuality(resource, currentTime); targetQuality = Math::Saturate(targetQuality); } @@ -142,14 +142,14 @@ void UpdateResource(StreamableResource* resource, DateTime now, double currentTi auto allocatedResidency = resource->GetAllocatedResidency(); auto targetResidency = handler->CalculateResidency(resource, targetQuality); ASSERT(allocatedResidency >= currentResidency && allocatedResidency >= 0); - resource->Streaming.LastUpdate = now.Ticks; + resource->Streaming.LastUpdateTime = currentTime; // Check if a target residency level has been changed if (targetResidency != resource->Streaming.TargetResidency) { // Register change resource->Streaming.TargetResidency = targetResidency; - resource->Streaming.TargetResidencyChange = now.Ticks; + resource->Streaming.TargetResidencyChangeTime = currentTime; } // Check if need to change resource current residency @@ -224,15 +224,14 @@ void StreamingSystem::Job(int32 index) PROFILE_CPU_NAMED("Streaming.Job"); // TODO: use streaming settings - TimeSpan ResourceUpdatesInterval = TimeSpan::FromMilliseconds(100); + const double ResourceUpdatesInterval = 0.1; int32 MaxResourcesPerUpdate = 50; // Start update ScopeLock lock(ResourcesLock); - auto now = DateTime::NowUTC(); const int32 resourcesCount = Resources.Count(); int32 resourcesUpdates = Math::Min(MaxResourcesPerUpdate, resourcesCount); - double currentTime = Platform::GetTimeSeconds(); + const double currentTime = Platform::GetTimeSeconds(); // Update high priority queue and then rest of the resources // Note: resources in the update queue are updated always, while others only between specified intervals @@ -248,9 +247,9 @@ void StreamingSystem::Job(int32 index) const auto resource = Resources[LastUpdateResourcesIndex]; // Try to update it - if (now - DateTime(resource->Streaming.LastUpdate) >= ResourceUpdatesInterval && resource->CanBeUpdated()) + if (currentTime - resource->Streaming.LastUpdateTime >= ResourceUpdatesInterval && resource->CanBeUpdated()) { - UpdateResource(resource, now, currentTime); + UpdateResource(resource, currentTime); resourcesUpdates--; } } diff --git a/Source/Engine/Streaming/StreamingHandlers.cpp b/Source/Engine/Streaming/StreamingHandlers.cpp index c2f7693ca..a0a966cfe 100644 --- a/Source/Engine/Streaming/StreamingHandlers.cpp +++ b/Source/Engine/Streaming/StreamingHandlers.cpp @@ -11,7 +11,7 @@ #include "Engine/Audio/Audio.h" #include "Engine/Audio/AudioSource.h" -float TexturesStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime) +float TexturesStreamingHandler::CalculateTargetQuality(StreamableResource* resource, double currentTime) { ASSERT(resource); auto& texture = *(StreamingTexture*)resource; @@ -93,7 +93,7 @@ int32 TexturesStreamingHandler::CalculateRequestedResidency(StreamableResource* return residency; } -float ModelsStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime) +float ModelsStreamingHandler::CalculateTargetQuality(StreamableResource* resource, double currentTime) { // TODO: calculate a proper quality levels for models based on render time and streaming enable/disable options return 1.0f; @@ -132,7 +132,7 @@ int32 ModelsStreamingHandler::CalculateRequestedResidency(StreamableResource* re return residency; } -float SkinnedModelsStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime) +float SkinnedModelsStreamingHandler::CalculateTargetQuality(StreamableResource* resource, double currentTime) { // TODO: calculate a proper quality levels for models based on render time and streaming enable/disable options return 1.0f; @@ -171,7 +171,7 @@ int32 SkinnedModelsStreamingHandler::CalculateRequestedResidency(StreamableResou return residency; } -float AudioStreamingHandler::CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime) +float AudioStreamingHandler::CalculateTargetQuality(StreamableResource* resource, double currentTime) { // Audio clips don't use quality but only residency return 1.0f; diff --git a/Source/Engine/Streaming/StreamingHandlers.h b/Source/Engine/Streaming/StreamingHandlers.h index 6ec4a678a..2e70a31ef 100644 --- a/Source/Engine/Streaming/StreamingHandlers.h +++ b/Source/Engine/Streaming/StreamingHandlers.h @@ -11,7 +11,7 @@ class FLAXENGINE_API TexturesStreamingHandler : public IStreamingHandler { public: // [IStreamingHandler] - float CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime) override; + float CalculateTargetQuality(StreamableResource* resource, double currentTime) override; int32 CalculateResidency(StreamableResource* resource, float quality) override; int32 CalculateRequestedResidency(StreamableResource* resource, int32 targetResidency) override; }; @@ -23,7 +23,7 @@ class FLAXENGINE_API ModelsStreamingHandler : public IStreamingHandler { public: // [IStreamingHandler] - float CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime) override; + float CalculateTargetQuality(StreamableResource* resource, double currentTime) override; int32 CalculateResidency(StreamableResource* resource, float quality) override; int32 CalculateRequestedResidency(StreamableResource* resource, int32 targetResidency) override; }; @@ -35,7 +35,7 @@ class FLAXENGINE_API SkinnedModelsStreamingHandler : public IStreamingHandler { public: // [IStreamingHandler] - float CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime) override; + float CalculateTargetQuality(StreamableResource* resource, double currentTime) override; int32 CalculateResidency(StreamableResource* resource, float quality) override; int32 CalculateRequestedResidency(StreamableResource* resource, int32 targetResidency) override; }; @@ -47,7 +47,7 @@ class FLAXENGINE_API AudioStreamingHandler : public IStreamingHandler { public: // [IStreamingHandler] - float CalculateTargetQuality(StreamableResource* resource, DateTime now, double currentTime) override; + float CalculateTargetQuality(StreamableResource* resource, double currentTime) override; int32 CalculateResidency(StreamableResource* resource, float quality) override; int32 CalculateRequestedResidency(StreamableResource* resource, int32 targetResidency) override; bool RequiresStreaming(StreamableResource* resource, int32 currentResidency, int32 targetResidency) override; diff --git a/Source/Engine/Utilities/Screenshot.cpp b/Source/Engine/Utilities/Screenshot.cpp index 7e1d3d902..408eb95f7 100644 --- a/Source/Engine/Utilities/Screenshot.cpp +++ b/Source/Engine/Utilities/Screenshot.cpp @@ -2,6 +2,7 @@ #include "Screenshot.h" #include "Engine/Core/Log.h" +#include "Engine/Core/Types/DateTime.h" #include "Engine/Core/Math/Math.h" #include "Engine/Graphics/RenderTask.h" #include "Engine/Platform/FileSystem.h"