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

相关文章

win10安装及配置Gradle全过程

《win10安装及配置Gradle全过程》本文详细介绍了Gradle的下载、安装、环境变量配置以及如何修改本地仓库位置,通过这些步骤,用户可以成功安装并配置Gradle,以便进行项目构建... 目录一、Gradle下载1.1、Gradle下载地址1.2、Gradle下载步骤二、Gradle安装步骤2.1、安

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、

java程序远程debug原理与配置全过程

《java程序远程debug原理与配置全过程》文章介绍了Java远程调试的JPDA体系,包含JVMTI监控JVM、JDWP传输调试命令、JDI提供调试接口,通过-Xdebug、-Xrunjdwp参数配... 目录背景组成模块间联系IBM对三个模块的详细介绍编程使用总结背景日常工作中,每个程序员都会遇到bu

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

JDK8(Java Development kit)的安装与配置全过程

《JDK8(JavaDevelopmentkit)的安装与配置全过程》文章简要介绍了Java的核心特点(如跨平台、JVM机制)及JDK/JRE的区别,重点讲解了如何通过配置环境变量(PATH和JA... 目录Java特点JDKJREJDK的下载,安装配置环境变量总结Java特点说起 Java,大家肯定都