Use the resource manager to access and use resources in kzb files. More...
#include <kanzi/core.ui/resource/resource_manager.hpp>
Classes | |
class | AcquireTask |
Load task for a group of resources. More... | |
class | FinishingQueue |
Collection of resource loading tasks that have been already been loaded by a loader thread and are waiting to be finished by the main thread. More... | |
struct | LoadTask |
Use this base class to implement the load tasks that load new resources. More... | |
Public Types | |
typedef shared_ptr< AcquireTask > | AcquireTaskSharedPtr |
AcquireTask shared pointer type. More... | |
typedef function< void()> | AsyncAcquireFinishedCallback |
Callback function type for acquire tasks. More... | |
typedef vector< LoadTaskSharedPtr > | FinishingQueueContainer |
Container type for the finishing queue. Used internally. More... | |
typedef map< string, vector< KzbFilePtr > > | KzbFileDictionary |
Type for the KZB file container. More... | |
typedef unique_ptr< KzbFile > | KzbFilePtr |
Type for a smart pointer to a KZB file. More... | |
typedef shared_ptr< LoadTask > | LoadTaskSharedPtr |
LoadTask shared pointer type. More... | |
enum | MemoryStrategy { KeepInMemory, OptimizeMemory } |
Resource manager memory strategy. More... | |
using | ProtocolHandler = function< kzsException(ResourceManager *resourceManager, string_view resourceURL, string_view protocol, string_view hostname, unsigned port, string_view path, ResourceSharedPtr &out_resource, LoadTaskSharedPtr &out_loadTask)> |
Type definition for the protocol handler of the load function. More... | |
using | ProtocolResourceReloadFunction = function< void(ResourceManager *, string_view resourceURL, string_view protocol, string_view hostname, unsigned port, string_view path, Resource *resource)> |
Type definition for the protocol handler of the reload function. More... | |
using | ResourceContainer = vector< ResourceSharedPtr > |
Alias for a container of resources. More... | |
typedef unordered_set< string > | UrlContainer |
Container type for URL set. More... | |
Public Member Functions | |
ResourceSharedPtr | acquireLoadedResource (string_view url) const |
Acquires a resource associated with the given URL. More... | |
ResourceSharedPtr | acquireResource (string_view url) |
Acquires a resource associated with the given URL. More... | |
template<typename Type > | |
shared_ptr< Type > | acquireResource (string_view url) |
Acquires a resource associated with the given URL and casts the resource to the given type. More... | |
AcquireTaskSharedPtr | acquireResourcesAsync (const UrlContainer &urls, AsyncAcquireFinishedCallback callback) |
Creates a background task that loads and deploys all resources from a set of URLs. More... | |
void | addKzbFile (string_view fileName) |
Opens a kzb file from the file system and adds it to the list of files. More... | |
void | addKzbFile (unique_ptr< KzbFile > kzbFile, bool enforceColorspace=true) |
Adds a kzb file to the list of files. More... | |
void | addKzbFile (ConstByteSpan data, bool enforceColorspace=true) |
Adds a memory block as a kzb file. More... | |
KzbFileDictionary::const_iterator | beginKzbFiles () const |
Returns the iterator to the beginning of loaded KZB files. More... | |
void | deployGPUResources () |
Kanzi internally uses this function to reload all GPU resources that have been invalidated by the pause-resume event. More... | |
KzbFileDictionary::const_iterator | endKzbFiles () const |
Returns the iterator to the end of loaded KZB files. More... | |
void | enqueueDependencies (LoadTaskSharedPtr loadTask, UrlContainer urls) |
Enqueue resource dependencies of a load task for async loading. More... | |
size_t | getAcquireTaskCount () const |
Returns the number of acquire tasks that have been started with a call to acquireResourcesAsync and have not yet been completed. More... | |
ResourceContainer | getAllLoadedResources () const |
Get a container of all existing resources. More... | |
MemoryStrategy | getDefaultMemoryStrategy () const |
Gets the memory release strategy. More... | |
Domain * | getDomain () const |
Returns the domain. More... | |
FinishingQueue & | getFinishingQueue () |
Gets the finishing queue for asynchronous loading tasks. More... | |
KzbFile * | getKzbFile (string_view hostname, size_t index=0) const |
Get the kzb file construct corresponding to the given name. More... | |
size_t | getLoaderThreadCount () const |
Gets the number of loader threads of the resource manager. More... | |
ThreadNativeHandleType | getLoaderThreadHandle (size_t threadIndex) |
Gets the native handle of a loader thread. More... | |
size_t | getLoadQueueSize () const |
Returns the number of resource load tasks in the load queue. More... | |
void | getMemoryUsage (size_t *out_resourceCount, size_t *out_cpuMemoryUsage, size_t *out_gpuMemoryUsage) const |
Calculates the memory usage summary for all resources. More... | |
string | getResourceURL (const Resource &resource) const |
Tries to find a URL for the given resource. More... | |
bool | hasDeploymentTasks () const |
Tell if deployment queue is empty. More... | |
void | initializeLoaderThreads (size_t threadCount, size_t maxPendingResources) |
Initializes the additional resource loader threads for the resource manager. More... | |
void | invalidateAllGPUResources () |
Kanzi internally uses this function to set all the GPU resources to undeployed state when an application loses and recreates the GL context after a pause-resume event. More... | |
ReadOnlyMemoryFilePtr | openFile (string_view url, KzbFile **kzbFile) |
Opens a handle to a resource file inside a kzb file. More... | |
bool | processDeploymentQueueItem () |
Processes asynchronous loading tasks by deploying a single loaded GPU resource. More... | |
void | purge () |
Deletes unreferenced resources. More... | |
void | registerLoadTask (string_view url, LoadTaskSharedPtr loadTask) |
Associates the given URL with the resource so that the next acquireResource with the URL completes the load task and returns the result. More... | |
void | registerProtocolHandler (kzString protocol, ProtocolHandler handler, ProtocolResourceReloadFunction reloadFunction) |
Registers a protocol handler for loading resources specified with the given resource URL protocol (scheme name). More... | |
void | registerResource (string_view url, ResourceSharedPtr resource) |
Associates the given URL with the resource so that the next acquireResource with the URL returns the resource. More... | |
void | reloadFromUrl (Resource *resource) |
Kanzi internally uses this function to reload a resource from a kzb file. More... | |
ResourceManager () | |
Constructor. More... | |
void | setDefaultMemoryStrategy (MemoryStrategy resourceReleaseStrategy) |
Sets the memory release strategy for new resources. More... | |
void | setDomain (Domain *domain) |
Kanzi internally uses this function to set the domain of the resource manager when it creates a resource manager. More... | |
void | setMaxPendingResources (size_t maxPendingResources) |
You can use this function to change the maximum number of resources that can be processed by the loading threads at the same time. More... | |
bool | supportsProtocolHandler (kzString protocol) const |
Checks whether the given resource URL protocol (scheme name) is registered as a protocol handler for the resource manager. More... | |
ResourceSharedPtr | tryAcquireResource (string_view url) |
Acquires a resource associated with the given URL, like acquireResource, but does not throw exceptions. More... | |
template<typename Type > | |
shared_ptr< Type > | tryAcquireResource (string_view url) |
Acquires a resource associated with the given URL and casts the resource to the given type. More... | |
void | uninitializeLoaderThreads () |
Stops and removes the loader threads. After the call, all loading happens in the main thread. More... | |
void | unregisterProtocolHandler (kzString protocol) |
Unregisters the protocol handler with the given resource URL protocol (scheme name). More... | |
void | unregisterResource (string_view url) |
Removes the association of the given URL to a resource or a load task. More... | |
void | update () |
Processes resource manager load and deployment queues to progress the background tasks. More... | |
void | wait (AcquireTask &acquireTask) |
Blocks the execution until the async acquire task finishes and calls the callback of the task (unless it has been called already). More... | |
void | waitForAcquireTasks () |
Kanzi internally uses this function when application is about to lose GL context, to wait for all existing acquire tasks to finish. More... | |
~ResourceManager () | |
Destructor. More... | |
Friends | |
class | FinishingQueue |
class | GPUResource |
class | NewPreviewPatcher |
class | PreviewPatcher |
class | Resource |
Use the resource manager to access and use resources in kzb files.
The resource manager maintains kzb files and provides mechanisms to load resources from kzb files.
To access resources in a kzb file, use the kzb URL of the resource that you want to access. For example, the URL string "kzb://programmer_tutorial/Prefabs/Widget Item Prefab" refers to the resource called "Widget Item Prefab" inside the folder "Prefabs" in the kzb file of the "programmer_tutorial" project.
When you acquire a URL for the first time, the resource manager loads the resource and caches it. The next time you use the same URL, Kanzi does not load the resource again, but returns the previously loaded resource instead.
To acquire a single resource, use acquireResource:
Kanzi manages the lifetime of resources with shared pointers, but to cache resources, the resource manager maintains a shared pointer to each acquired resource. This means that Kanzi does not automatically release the memory used by resources, even if you are not using those resources.
To destroy resources and release the memory used up by those resources, use purge:
The resource manager uses worker threads to load multiple resources simultaneously and in the background, while the application is running. You can use Application::onConfigure to specify the number of loader threads. With loader threads you can load textures, meshes, and shaders. Kanzi uses the main thread to load all other types of resources.
You can decrease the loading time of resources by first collecting the URLs of all resources and loading multiple resources simultaneously. Kanzi does this automatically for the startup screen. If you are instantiating prefabs using the API, you can use collectResourceUrls to collect the URLs and acquireResourcesAsync to acquire the resources:
If you need the results immediately, you can use wait:
At application startup, Kanzi opens the kzb files that you specify in the application.cfg or in the configuration file specified by the Application::onConfigure. With the resource manager you can use addKzbFile to open additional kzb files at runtime:
Besides loading resources from kzb files, you can load resources from the file system. The resource manager supports the loading of these resource types from the file system:
Kanzi determines the type of the resource it creates from the file extension, not from the file contents. You have to ensure that the files use correct extensions.
To load resources from the file system, use the file:// protocol:
typedef unordered_set<string> kanzi::ResourceManager::UrlContainer |
Container type for URL set.
typedef shared_ptr<LoadTask> kanzi::ResourceManager::LoadTaskSharedPtr |
LoadTask shared pointer type.
using kanzi::ResourceManager::ProtocolHandler = function<kzsException(ResourceManager* resourceManager, string_view resourceURL, string_view protocol, string_view hostname, unsigned port, string_view path, ResourceSharedPtr& out_resource, LoadTaskSharedPtr& out_loadTask)> |
Type definition for the protocol handler of the load function.
The load function takes a resource URL and creates either a new resource or a load task that creates a new resource.
resourceManager | The resource manager. |
resourceURL | The full URL of the resource in the form of protocol://hostname[:port]/path. |
protocol | Extracted protocol part of the resource URL. |
hostname | Extracted hostname part of the resource URL. |
port | Extracted port part of the resource URL. This is 0 if the port is omitted from the URL. |
path | Extracted path part of the resource URL. |
out_resource | The loaded resource, or nullptr. |
out_loadTask | A load task for the resource, or nullptr. |
using kanzi::ResourceManager::ProtocolResourceReloadFunction = function<void(ResourceManager*, string_view resourceURL, string_view protocol, string_view hostname, unsigned port, string_view path, Resource* resource)> |
Type definition for the protocol handler of the reload function.
The reload function takes a resource URL and an existing resource, and reloads the resource.
typedef vector<LoadTaskSharedPtr> kanzi::ResourceManager::FinishingQueueContainer |
Container type for the finishing queue. Used internally.
typedef function<void()> kanzi::ResourceManager::AsyncAcquireFinishedCallback |
Callback function type for acquire tasks.
typedef shared_ptr<AcquireTask> kanzi::ResourceManager::AcquireTaskSharedPtr |
AcquireTask shared pointer type.
typedef unique_ptr<KzbFile> kanzi::ResourceManager::KzbFilePtr |
Type for a smart pointer to a KZB file.
typedef map<string, vector<KzbFilePtr> > kanzi::ResourceManager::KzbFileDictionary |
Type for the KZB file container.
using kanzi::ResourceManager::ResourceContainer = vector<ResourceSharedPtr> |
Alias for a container of resources.
Resource manager memory strategy.
Enumerator | |
---|---|
KeepInMemory | When a resource is no longer referenced, the resource manager keeps the resource in memory until you call purge(). |
OptimizeMemory | When a resource is no longer referenced, the resource manager deletes the resource and frees the (CPU and GPU) memory used by the resource. |
|
explicit |
Constructor.
kanzi::ResourceManager::~ResourceManager | ( | ) |
Destructor.
void kanzi::ResourceManager::initializeLoaderThreads | ( | size_t | threadCount, |
size_t | maxPendingResources | ||
) |
Initializes the additional resource loader threads for the resource manager.
Do not call this function, because Kanzi automatically calls it.
threadCount | The number of loader threads. If 0, parallel loading is disabled. |
maxPendingResources | The maximum number of resources that can be processed by the loading threads at the same time. If set to 0, behaves as if set to threadCount + 1. |
void kanzi::ResourceManager::waitForAcquireTasks | ( | ) |
Kanzi internally uses this function when application is about to lose GL context, to wait for all existing acquire tasks to finish.
void kanzi::ResourceManager::uninitializeLoaderThreads | ( | ) |
Stops and removes the loader threads. After the call, all loading happens in the main thread.
ThreadNativeHandleType kanzi::ResourceManager::getLoaderThreadHandle | ( | size_t | threadIndex | ) |
Gets the native handle of a loader thread.
You can use the native handle of a thread to set the priority of that thread, or to assign that thread to a dedicated CPU core:
Resource manager creates all its loader threads during application startup and does not add or delete loader threads during the rest of application runtime, except during shutdown. An appropriate place to adjust loader thread settings is in the Application::onStartup() overloaded function. Kanzi calls this function after the ResourceManager created its loader threads and before Kanzi starts using loader threads for loading assets from kzb files.
threadIndex | Index of the loader thread. |
size_t kanzi::ResourceManager::getLoaderThreadCount | ( | ) | const |
Gets the number of loader threads of the resource manager.
void kanzi::ResourceManager::setMaxPendingResources | ( | size_t | maxPendingResources | ) |
You can use this function to change the maximum number of resources that can be processed by the loading threads at the same time.
maxPendingResources | The maximum number of resources that can be processed by the loading threads at the same time. If set to 0, behaves as if set to threadCount + 1. |
void kanzi::ResourceManager::addKzbFile | ( | string_view | fileName | ) |
Opens a kzb file from the file system and adds it to the list of files.
If this function cannot open the file you pass to it or that file is not a kzb file, the function throws an exception.
fileName | The name of the file to open. |
void kanzi::ResourceManager::addKzbFile | ( | unique_ptr< KzbFile > | kzbFile, |
bool | enforceColorspace = true |
||
) |
Adds a kzb file to the list of files.
kzbFile | File to add. |
enforceColorspace | Generate a warning if the colorspace does not match the domain. |
void kanzi::ResourceManager::addKzbFile | ( | ConstByteSpan | data, |
bool | enforceColorspace = true |
||
) |
Adds a memory block as a kzb file.
This function internally creates a kzb file by reading the memory block.
data | Data to add. The memory area must be readable as long as the resource manager is alive. |
enforceColorspace | Generate a warning if the colorspace does not match the domain. |
ReadOnlyMemoryFilePtr kanzi::ResourceManager::openFile | ( | string_view | url, |
KzbFile ** | kzbFile | ||
) |
Opens a handle to a resource file inside a kzb file.
You can use this handle to read data directly from the kzb file.
url | URL of the resource. | |
[out] | kzbFile | If the function finds the resource file, returns a pointer to the kzb file. |
void kanzi::ResourceManager::invalidateAllGPUResources | ( | ) |
Kanzi internally uses this function to set all the GPU resources to undeployed state when an application loses and recreates the GL context after a pause-resume event.
void kanzi::ResourceManager::getMemoryUsage | ( | size_t * | out_resourceCount, |
size_t * | out_cpuMemoryUsage, | ||
size_t * | out_gpuMemoryUsage | ||
) | const |
Calculates the memory usage summary for all resources.
out_resourceCount | The total number of resources. |
out_cpuMemoryUsage | Estimate for the total amount of bytes of CPU memory that the resources use. |
out_gpuMemoryUsage | Estimate for the total amount of bytes of GPU memory that the resources use. |
size_t kanzi::ResourceManager::getAcquireTaskCount | ( | ) | const |
Returns the number of acquire tasks that have been started with a call to acquireResourcesAsync and have not yet been completed.
Each acquire task can load multiple resources.
size_t kanzi::ResourceManager::getLoadQueueSize | ( | ) | const |
Returns the number of resource load tasks in the load queue.
This includes the load tasks that are waiting to be loaded and load tasks that are currently being loaded. This does not include the load tasks that are in the finishing queue.
Domain* kanzi::ResourceManager::getDomain | ( | ) | const |
Returns the domain.
void kanzi::ResourceManager::registerProtocolHandler | ( | kzString | protocol, |
ProtocolHandler | handler, | ||
ProtocolResourceReloadFunction | reloadFunction | ||
) |
Registers a protocol handler for loading resources specified with the given resource URL protocol (scheme name).
protocol | The protocol name. For example, "http". |
handler | The protocol loader function. Kanzi calls this function when you use a URL with the given protocol, and Kanzi does not find an existing resource with that URL. This loader function creates a resource. |
reloadFunction | The protocol reloader function. Kanzi calls this function to recreate an existing resource. Kanzi uses this function only for GPU resources when an application loses GL context in a pause-resume event. |
void kanzi::ResourceManager::unregisterProtocolHandler | ( | kzString | protocol | ) |
Unregisters the protocol handler with the given resource URL protocol (scheme name).
bool kanzi::ResourceManager::supportsProtocolHandler | ( | kzString | protocol | ) | const |
Checks whether the given resource URL protocol (scheme name) is registered as a protocol handler for the resource manager.
protocol | The protocol to check. |
ResourceSharedPtr kanzi::ResourceManager::acquireResource | ( | string_view | url | ) |
Acquires a resource associated with the given URL.
If no resource is associated with the URL, tries to load the resource from the location specified by the URL. The URL specifies the location with a protocol and a protocol-specific path. If you already earlier acquired the resource at the given URL, this function returns a shared pointer to the already acquired resource.
The supported protocols are:
url | URL of the resource. |
ResourceSharedPtr kanzi::ResourceManager::tryAcquireResource | ( | string_view | url | ) |
Acquires a resource associated with the given URL, like acquireResource, but does not throw exceptions.
url | URL of the resource. |
|
inline |
Acquires a resource associated with the given URL and casts the resource to the given type.
If the type cast fails, the function returns nullptr.
url | URL of the resource. |
|
inline |
Acquires a resource associated with the given URL and casts the resource to the given type.
If the resource does not exist or the type cast fails, the function throws an exception.
url | URL of the resource. |
void kanzi::ResourceManager::registerResource | ( | string_view | url, |
ResourceSharedPtr | resource | ||
) |
Associates the given URL with the resource so that the next acquireResource with the URL returns the resource.
You can use this function to provide a URL to a resource that you created using the API.
url | URL of the resource. |
resource | The registered resource. |
void kanzi::ResourceManager::registerLoadTask | ( | string_view | url, |
LoadTaskSharedPtr | loadTask | ||
) |
Associates the given URL with the resource so that the next acquireResource with the URL completes the load task and returns the result.
url | URL of the resource. |
loadTask | A load task that creates the resource at the given URL. |
void kanzi::ResourceManager::unregisterResource | ( | string_view | url | ) |
Removes the association of the given URL to a resource or a load task.
You can use this function to force Kanzi to recreate a resource the next time you use this URL.
url | URL of the resource. |
ResourceSharedPtr kanzi::ResourceManager::acquireLoadedResource | ( | string_view | url | ) | const |
Acquires a resource associated with the given URL.
If no resource is associated with the URL, does not try to load the resource.
url | URL of the resource. |
string kanzi::ResourceManager::getResourceURL | ( | const Resource & | resource | ) | const |
Tries to find a URL for the given resource.
This function loops over all resources, so it can take a long time to complete.
resource | The resource. |
void kanzi::ResourceManager::setDefaultMemoryStrategy | ( | MemoryStrategy | resourceReleaseStrategy | ) |
Sets the memory release strategy for new resources.
resourceReleaseStrategy | The new memory strategy. |
MemoryStrategy kanzi::ResourceManager::getDefaultMemoryStrategy | ( | ) | const |
Gets the memory release strategy.
void kanzi::ResourceManager::purge | ( | ) |
Deletes unreferenced resources.
You can use this function to free memory. Destroys all resources that are referenced only by the resource manager.
void kanzi::ResourceManager::update | ( | ) |
Processes resource manager load and deployment queues to progress the background tasks.
Kanzi calls this function once every frame.
|
inline |
Gets the finishing queue for asynchronous loading tasks.
You can use this to control the deployment strategy of the resources.
bool kanzi::ResourceManager::processDeploymentQueueItem | ( | ) |
Processes asynchronous loading tasks by deploying a single loaded GPU resource.
This function does not do anything if there are no active asynchronous loading tasks with loaded resources. Kanzi calls this function once every frame. Call this function periodically to ensure that asynchronous loading tasks are completed.
bool kanzi::ResourceManager::hasDeploymentTasks | ( | ) | const |
Tell if deployment queue is empty.
AcquireTaskSharedPtr kanzi::ResourceManager::acquireResourcesAsync | ( | const UrlContainer & | urls, |
AsyncAcquireFinishedCallback | callback | ||
) |
Creates a background task that loads and deploys all resources from a set of URLs.
After Kanzi loads and deploys all resources, the function calls the callback you provide.
urls | Set of URLs for resources that you want to load. |
callback | Callback function that this function calls when Kanzi loads all specified resources. |
void kanzi::ResourceManager::wait | ( | AcquireTask & | acquireTask | ) |
Blocks the execution until the async acquire task finishes and calls the callback of the task (unless it has been called already).
acquireTask | Acquire task created by acquireResourcesAsync. |
void kanzi::ResourceManager::deployGPUResources | ( | ) |
Kanzi internally uses this function to reload all GPU resources that have been invalidated by the pause-resume event.
void kanzi::ResourceManager::setDomain | ( | Domain * | domain | ) |
Kanzi internally uses this function to set the domain of the resource manager when it creates a resource manager.
KzbFile* kanzi::ResourceManager::getKzbFile | ( | string_view | hostname, |
size_t | index = 0 |
||
) | const |
Get the kzb file construct corresponding to the given name.
hostname | Hostname of the kzb file. |
index | Index of the file for the given hostname, typically 0. Can be set to higher than 0 when a single hostname has multiple kzb files. |
void kanzi::ResourceManager::reloadFromUrl | ( | Resource * | resource | ) |
Kanzi internally uses this function to reload a resource from a kzb file.
resource | The reloaded resource. |
|
inline |
Returns the iterator to the beginning of loaded KZB files.
|
inline |
Returns the iterator to the end of loaded KZB files.
void kanzi::ResourceManager::enqueueDependencies | ( | LoadTaskSharedPtr | loadTask, |
UrlContainer | urls | ||
) |
Enqueue resource dependencies of a load task for async loading.
Meant to be called by LoadTask::enqueueDependencies. Informs the main thread of the dependencies of a load task, which can then trigger their async loading.
loadTask | The load task requesting the dependencies. |
urls | Container of dependency urls. |
ResourceContainer kanzi::ResourceManager::getAllLoadedResources | ( | ) | const |
Get a container of all existing resources.
|
friend |
|
friend |
|
friend |
|
friend |
|
friend |