Unity 6.3
0 онлайн 63 гостей 3 в системе
Вход

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Возвращает логическое значение, указывающее, может ли тип быть сохранен в резервном файле.