LoxodonFramework——Preferences(应用配置)一

2024-03-05 03:50

本文主要是介绍LoxodonFramework——Preferences(应用配置)一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

应用配置

Preference比较通用的翻译是偏好设置或者首选项,这里用LF文档中的翻译,反正意思大差不差。

主要是用于存储一些客户端本地的持久化数据,比如上次登录的账号,新手教程进度之类的,或者游戏里玩家的设置,音乐音效的开关和大小之类的。

Preference没有限制存储单机游戏存档,但是如果存档不是靠一个SaveDataMgr之类的来管理(在LF里应该属于一个服务)我会觉得很难受,哪怕你就是封装一下Preferences呢。

Preferences

Preferences是一个抽象类,它有两个子类,PlayerPrefsPreferences和BinaryFilePreferences。前者是作为默认的应用配置使用,对Unity的PlayerPrefs进行了扩展和封装。后者是把数据存储成二进制文件保存在persistentDataPath路径。

Preferences不是唯一的,它有一个静态的字典类型的cache,通过名字访问不同的应用配置。这个好处是如果游戏允许多账号登录,那可以对每一个账号保存一份应用配置。同时提供了一个全局配置的接口,就是单纯封装了一个名字为“_GLOBAL_“的应用配置。

Preferences对多应用配置的创建使用了工厂模式,接口为IFactory(注意和服务容器的IFactory不是同一个,服务容器的IFactory是ServiceContainer的内部接口),有一个抽象类的实现AbstractFactory。在继承Preferences的同时需要实现子类对应的具象Factory。

AbstractFactory要求提供一个加密器(IEncryptor)和序列化器(ISerializer),主要是在创建应用配置的时候作为参数传入Preferences。二者其实都是可选的,如果需要实现其他的应用配置,可以根据需求来选择。

PlayerPrefsPreferences

PlayerPrefsPreferences是对Unity的PlayerPrefs的扩展,具体来说就是把PlayerPrefs不支持的类型都转为字符串再存储。同时提供了数据加密的支持。

根据上文,PlayerPrefsPreferences的数据加密和类型转换实际上都依赖于加密器和序列化器,它本身只负责对字段进行存储、读取、移除的操作,也就是封装了一下PlayerPrefs的API,再加上对数组序列化的支持。

PlayerPrefsPreferences中包含一个字符串数组keys来存储通过该类保存到PlayerPrefs的key。因为PlayerPrefs可能被其他逻辑引用,如果不保管key,在全部移除的时候就只能生硬地DeleteAll,这样必然会影响其他的逻辑。同时这个操作也保证了上文提到的多应用配置的实现。

性能疑点:PlayerPrefsPreferences对SetArray的操作是把数组中的每一项都先用序列化器编码成字符串后再用数组分隔符'|'拼接成一个长字符串。但其实只要加一层class包装,JSONUtility就可以序列化数组或者列表。为了测试二者性能,我去掉了JsonTypeEncoder中对IList的限制,对一个数组同时使用SetArray和SetObject(它最终会调用到JsonTypeEncoder),结果显示后者的耗时是前者的一半,二者序列化后的长度也几乎没区别。因此我感觉这里对数组的序列化是一个吃力不讨好的做法。然而SetArray又不是直接调用的序列化器进行操作,都没法通过扩展修改这段逻辑。除非新写一个类继承PlayerPrefsPreferences并且重写SetArray的操作。

说到这里不免得想要扩展开来说两句。解析LF之前的代码都能发现它的高扩展性,代码风格也是简洁易读。而看到SetArray的实现我总觉得跟整体的简洁风格有点不搭,本着“大佬肯定有自己的考虑”这样的想法做了测试,但是结果就是SetArray性能不如直接用JSONUtility。

BinaryFilePreferences

BinaryFilePreferences是把数据放在字典中,保存时先以“字段数、键、值、键、值……”的顺序转成二进制数据再写入到文本中。保存文件的地址在persistentDataPath/{Preferences.Name}/prefs.dat。由于不同应用配置是通过不同的文件夹区分的,因此这里没有对key进行处理。

其他部分跟PlayerPrefsPreferences没有区别,Set\GetArray的实现也一致(性能问题自然也一样)。就不再多赘述了。

声明

该文章只作为本人学习框架的梳理思路用,一切以官方文档为准。如有错误还请指正。

这篇关于LoxodonFramework——Preferences(应用配置)一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775250

相关文章

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

Redis MCP 安装与配置指南

《RedisMCP安装与配置指南》本文将详细介绍如何安装和配置RedisMCP,包括快速启动、源码安装、Docker安装、以及相关的配置参数和环境变量设置,感兴趣的朋友一起看看吧... 目录一、Redis MCP 简介二、安www.chinasem.cn装 Redis MCP 服务2.1 快速启动(推荐)2.

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例

《PyTorch中的词嵌入层(nn.Embedding)详解与实战应用示例》词嵌入解决NLP维度灾难,捕捉语义关系,PyTorch的nn.Embedding模块提供灵活实现,支持参数配置、预训练及变长... 目录一、词嵌入(Word Embedding)简介为什么需要词嵌入?二、PyTorch中的nn.Em

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima