PropertyDatabase
класс в UnityEditor.Search
Описание
PropertyDatabase представляет собой систему, которая может хранить, безопасным для потоков образом, свойства различных типов в едином файле, который мы называем базой данных свойств.
Идея PropertyDatabase состоит в том, что в большинстве случаев получение значения свойства может быть дорогостоящим. Поэтому кэширование этих значений для повторного использования в будущем может сэкономить много циклов. Кэш хранится в файле, поэтому он не теряется при перезагрузке домена или при выходе из Unity (не все типы могут быть сериализированы в файле, но они все еще могут храниться в PropertyDatabase, см. PropertyDatabase.IsPersistedType). Вы можете открыть несколько PropertyDatabaseв разных файлах, но вы не можете открыть несколько PropertyDatabaseв одном файле. Это приведет к недействительному PropertyDatabase (см. valid). Вы можете выполнять параллельные операции на одном экземпляре PropertyDatabase, но по причинам производительности следует использовать вид (см. PropertyDatabase.GetView и IPropertyDatabaseView).
Существуют три основные операции, которые вы можете выполнять с PropertyDatabase: хранение значений, загрузка значений и отмена значений. При хранении значений, значения хранятся в массиве, отсортированном по их ключам (см. PropertyDatabase.CreateRecordKey и PropertyDatabaseRecordKey. Ключ — это число, представляющее документ и свойство. Вы можете хранить любые значения, поступающие из любого места в PropertyDatabase, но наиболее распространенным случаем использования является хранение свойств ассета или игрового объекта. В этих случаях ассетом или игровым объектом является документ, а свойством — любое свойство в этом документе, которое вы хотите хранить. Затем вы можете загрузить эти значения позже, либо для одного свойства, либо для всего документа.
using System.Collections.Generic; using NUnit.Framework; using UnityEditor; using UnityEditor.Search; using UnityEngine; static class Example_PropertyDatabase { // Where the property database will be written. const string propertyDatabaseFilePath = "Temp/test_property_db"; static PropertyDatabase propertyDatabase; static void InitializePropertyDatabase() { // Setup the property database. We configure it with automatic flushing so the file store // will be updated automatically after an update. propertyDatabase = new PropertyDatabase(propertyDatabaseFilePath, true); } static void ClearPropertyDatabase() { propertyDatabase.Clear(); // Since we are done with the property database, we should dispose it // to clear all resources. propertyDatabase.Dispose(); } static PropertyDatabaseRecordKey GetPropertyKey(int id) { return PropertyDatabase.CreateRecordKey((ulong)id / 100, PropertyDatabase.CreatePropertyHash((id % 100).ToString())); } static object LoadPropertyValue(int id) { var recordKey = GetPropertyKey(id); if (propertyDatabase.TryLoad(recordKey, out object value)) return value; // Fetch the value with the time consuming operation and store it for future // accesses. value = id.ToString(); propertyDatabase.Store(recordKey, value); return value; } [MenuItem("Examples/PropertyDatabase/Class")] public static void RunExample() { InitializePropertyDatabase(); if (!propertyDatabase.valid) { Debug.LogFormat(LogType.Error, LogOption.NoStacktrace, null, $"PropertyDatabase \"{propertyDatabase.filePath}\" failed to open properly."); return; } var allValues = new Dictionary<int, object>(); // Load the property values to do something with it. for (var i = 0; i < 1000; ++i) { var value = LoadPropertyValue(i); allValues.Add(i, value); } // Validate everything is in the database for (var i = 0; i < 1000; ++i) { var key = GetPropertyKey(i); if (!propertyDatabase.TryLoad(key, out object value)) Assert.Fail("Record should be in the database."); Assert.AreEqual(i.ToString(), value); } ClearPropertyDatabase(); } }
Если изменится свойство или весь документ, вы можете отменить сохраненные значения с помощью PropertyDatabase.Invalidate и PropertyDatabase.InvalidateMask.
Свойства
| Свойство | Описание |
|---|---|
| autoFlush | Логическое значение, указывающее, будет ли PropertyDatabase обновлять резервный файл автоматически или нет. |
| filePath | Файл, на котором открыт этот PropertyDatabase. |
| valid | Логический параметр, указывающий, является ли PropertyDatabase действительным. |
Конструкторы
| Конструктор | Описание |
|---|---|
| PropertyDatabase | Создает новый экземпляр PropertyDatabase. |
Открытые методы
| Метод | Описание |
|---|---|
| Clear | Очистка всего содержимого PropertyDatabase. |
| Dispose | Удалить ресурсы, используемые этим PropertyDatabase. |
| Flush | Триггер ручного обновления резервного файла. |
| GetInfo | Возвращает форматированную строку, показывающую различные сведения о PropertyDatabase. |
| GetValueFromRecord | Десериализация значения записи в соответствующий тип. |
| GetView | Открывает вид на PropertyDatabase. |
| Invalidate | Отменяет действие одной записи свойства, чтобы она больше не могла быть получена. |
| InvalidateMask | Отмена действия всех свойств, сохраненных из нескольких документов, соответствующих маске ключа документа. |
| Store | Хранит свойство документа. |
| TryLoad | Загружает одно свойство, уже разрядованное в объект. |
Статические методы
| Метод | Описание |
|---|---|
| CreateDocumentKey | Создает ключ документа из идентификатора документа. |
| CreatePropertyHash | Создает хэш свойства из пути свойства. |
| CreateRecordKey | Создает ключ записи из идентификатора документа и пути к свойству. |
| IsPersistableType | Возвращает логическое значение, указывающее, может ли тип быть сохранен в резервном файле. |