版本:Unity 6 (6000.0)
语言英语
  • C#

IPropertyDatabaseView

UnityEditor.Search 中的接口

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。尽管我们无法接受所有提交,但我们会阅读我们用户提出的每项建议更改,及在必要时进行更新。

关闭

提交失败

由于某些原因,您的建议更改无法提交。请<a>再试一次</a>在几分钟后。感谢您 花时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

一个 PropertyDatabase 视图的接口。

一个 PropertyDatabase 视图的概念类似于 Windows 的内存映射文件视图,尽管简单许多。每个 PropertyDatabase 视图都有自己的文件流,它可以独立于其他视图来访问 PropertyDatabase。一个 PropertyDatabase 的视图是同步的,因此允许并发访问。然而,为了让并发访问正常工作,每个线程必须自己具有一个视图的实例。

PropertyDatabase 类中可用的所有操作都在视图本身中可用。直接在 PropertyDatabase 实例上操作时,将创建一个内部视图以处理所有同步。由于我们处理的是文件,因此打开一个视图的成本不可忽略。因此,建议打开一个视图,并在丢弃它之前尽可能长时间使用它。

using System.Collections.Generic;
using NUnit.Framework;
using UnityEditor;
using UnityEditor.Search;
using UnityEngine;

static class Example_IPropertyDatabaseView
{
    // Where the property database will be written.
    const string propertyDatabaseFilePath = "Temp/test_ipropertydatabaseview_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();
        propertyDatabase.Dispose();
    }

    static PropertyDatabaseRecordKey GetPropertyKey(int id, IPropertyDatabaseView view)
    {
        return view.CreateRecordKey((ulong)id / 100, view.CreatePropertyHash((id % 100).ToString()));
    }

    static object LoadPropertyValue(int id, IPropertyDatabaseView view)
    {
        var recordKey = GetPropertyKey(id, view);
        if (view.TryLoad(recordKey, out object value))
            return value;

        // Fetch the value with the time consuming operation and store it for future
        // accesses.
        value = id.ToString();
        view.Store(recordKey, value);
        return value;
    }

    [MenuItem("Examples/IPropertyDatabaseView/Interface")]
    public static void RunExample()
    {
        InitializePropertyDatabase();
        if (!propertyDatabase.valid)
        {
            Debug.LogFormat(LogType.Error, LogOption.NoStacktrace, null, $"PropertyDatabase \"{propertyDatabase.filePath}\" failed to open properly.");
            return;
        }

        // Doing a change on the property database internally opens a view on the actual data,
        // which is non negligible. Therefore, it is advised to open a view once and use it as much as you
        // can.
        // Note: when doing concurrent accesses to the property database, each thread must have its own
        // view instance.
        var allValues = new Dictionary<int, object>();
        using (var view = propertyDatabase.GetView())
        {
            for (var i = 0; i < 1000; ++i)
            {
                var value = LoadPropertyValue(i, view);
                allValues.Add(i, value);
            }
        }

        // Validate everything is in the database
        using (var view = propertyDatabase.GetView())
        {
            for (var i = 0; i < 1000; ++i)
            {
                var key = GetPropertyKey(i, view);
                if (!view.TryLoad(key, out object value))
                    Assert.Fail("Record should be in the database.");
                Assert.AreEqual(i.ToString(), value);
            }
        }

        ClearPropertyDatabase();
    }
}

其他资源:PropertyDatabase.GetView

公共方法

清除清除 PropertyDatabase 的全部内容。
创建文档密钥从文档标识符中创建一个文档密钥。
创建属性哈希从属性路径中创建一个属性哈希。
创建记录密钥从文档标识符和属性路径中创建一个记录密钥。
枚举全部枚举存储在 PropertyDatabase 中的所有记录
从记录中获取值将一个记录值反序列化为其正确类型。
使无效使单个属性记录无效,使其不再可检索。
使掩码无效使存储在多个文档中且与文档密钥掩码相匹配的所有属性无效。
是否是可持久化类型返回一个布尔值,表明一种类型是否可以持久化到备份文件中。
存储存储一个文档属性。
同步同步视图,使它们具有对相同内容的访问权限。
尝试加载加载一个单个属性,已反序列化为一个对象。