Unity 之 抖音小游戏本地数据最新存储方法分享

news2024/12/28 4:35:04

Unity 之 抖音小游戏本地数据最新存储方法分享

  • 一、抖音小游戏文件存储系统背景
  • 二、文件存储系统的使用方法
    • 2.1 初始化
    • 2.1 创建目录
    • 2.3 存储数据
    • 2.4 删除目录/文件
    • 2.5 其他相关操作
  • 三,小结

抖音小游戏是一种基于抖音平台开发的小型游戏,与传统的 APP 不同,抖音小游戏运行在抖音客户端内部,可以通过抖音的分享、推荐等功能进行传播。在抖音小游戏开发过程中,文件存储系统是一个非常重要的组成部分,本文将详细介绍抖音小游戏文件存储系统的实现原理和使用方法。

一、抖音小游戏文件存储系统背景

官方文档:使用新文件系统说明,
内容包括了:

  • 新文件系统的背景
  • 已有存档文件迁移方法:
  • 数据对比:在老文件系统上写入约400MB的文件后,打开游戏后占用内存约1G,在迁移后则基本不会再占用内存,游戏内存将至630MB左右

在原有实现中,C#标准的文件接口,如File.ReadAllText、File.WriteAllText、FileStream等,是将数据写入到内存文件系统,然后再在合适的时机自动同步内存数据到IndexedDB中存储。由于采用了IndexedDB文件存储系统,使得运行时内存有一定的增加,如果文件数量过多,可能会发生闪退。

另外,IndexedDB文件存储系统兼容性不够好,在部分iOS系统上会无法正常使用,从而导致无法正常进入游戏的情况。所以我们提供 StarkFileSystemManager接口作为替换,开发者可以通过调用StarkSDKSpace.StarkSDK.API.GetStarkFileSystemManager()方法来使用新的文件存储系统。


二、文件存储系统的使用方法

2.1 初始化

在使用文件系统时,我会习惯性的做一个初始化:首先需要获取文件系统管理器对象StarkFileSystemManager,然后获取到一个用户数据存储的路径StarkFileSystemManager.USER_DATA_PATH

后面的文件相关操作都要在 dyFileSystemdyFilePath 两个变量的基础上进行操作。

初始化参考代码如下:

using StarkSDKSpace;

public class StarkSDKTest : MonoBehaviour
{
    // 抖音存储文件系统
    private StarkFileSystemManager dyFileSystem;
    // 用户数据存储的路径
    private string dyFilePath;
    
    void Start()
    {
        dyFileSystem = StarkSDK.API.GetStarkFileSystemManager();
        dyFilePath = StarkFileSystemManager.USER_DATA_PATH;
    }
}

2.1 创建目录

创建目录有同步和异步两种写法:

同步方法:MkdirSync(string dirPath, bool recursive = false);

dyFileSystem.MkdirSync(dicPath, false);

  • 第一个参数表示:创建的目录路径,注意:地址要以上面获取的 dyFilePath 作为根目录。
  • 第二个参数表示:是否在递归创建该目录的上级目录后再创建该目录。如果对应的上级目录已经存在,则不创建该上级目录。

示例代码:

void CreateDic(string dicPath)
{
    // 判断文件是否存在
    if (!dyFileSystem.AccessSync(dicPath))
    {
        string isSucc = dyFileSystem.MkdirSync(dicPath, false);
        Debug.Log($"创建目录成功状态:{isSucc} 为空,则表示创建成功");
    }
    else
    {
        Debug.Log($"已经存在此目录:{dicPath}, 无需再次创建");
    }
}

异步方法 Mkdir(MkdirParam param)

参数与同步方法一致,可添加创建成功或失败回调。

void CreateDicAsync(string dicPath)
{
    if (!dyFileSystem.AccessSync(dicPath))
    {
        MkdirParam param = new MkdirParam();
        param.dirPath = dicPath;
        param.recursive = false;
        param.fail = delegate(StarkBaseResponse response)
        {
            Debug.Log($"异步创建目录失败,失败原因: errCode:{response.errCode} , errMsg:{response.errMsg}");
        };
        param.success = response =>
        {            
            Debug.Log($"异步创建目录成功,执行成功回调。");
        };
        dyFileSystem.Mkdir(param);
    }
    else
    {
        Debug.Log($"已经存在此目录:{dicPath}, 无需再次创建");
    }
}

若创建失败,则可根据errMsg进行修改,若不清楚如何修改可以使用errCode和官方文档进行比较。

官方文件系统文档地址


2.3 存储数据

涉及知识点:

  1. 写入文件
    可以写入字符串 string 或者 字节数组byte[]两种类型,也有同步异步两种方式。
  2. 读取文件
    写入时用的什么类型存储,读取时就使用使用类型。字符串方式写入默认编码格式为utf8
  3. 校验文件/目录是否存在

同步写法参考代码如下:

/// <summary> 
/// 存储数据
///     --> 不存在,创建并写入
///     --> 已存在,读取并写入
/// PS:地址要以上面获取的 dyFilePath 作为根目录,后面则可自行创建
/// </summary>
/// <param name="filePath">文件存储地址</param>
/// <param name="fileContext">文件存储内容</param>
void CreateFile(string filePath, string fileContext)
{
    if (!dyFileSystem.AccessSync(filePath))
    {
        string isSucc = dyFileSystem.WriteFileSync(filePath, fileContext, "utf8");
        Debug.Log($"创建文件成功状态:{isSucc} 为空,则表示创建成功");
    }
    else
    {
        // 读取并写入 --> 注意编码格式与创建一致
        string readContext = dyFileSystem.ReadFileSync(filePath, "utf8");
        Debug.Log($"读取文件内容:{readContext}");
        string isSucc = dyFileSystem.WriteFileSync(filePath, readContext + fileContext);
        Debug.Log($"读取并写入:{filePath}, 无需再次创建");
    }
}

2.4 删除目录/文件

dyFileSystem.RmdirSync(delPath, false);

  • 第一个参数表示:删除目录/文件的路径。
  • 第二个参数表示:是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件。为false则删除指定目录/文件。
// 删除文件/目录
void DeleteFileOrDic(string delPath)
{
    if (dyFileSystem.AccessSync(delPath))
    {
        // 第二个参数表示:是否递归删除目录。如果为 true,则删除该目录和该目录下的所有子目录以及文件
        string isSucc = dyFileSystem.RmdirSync(delPath, false);
        Debug.Log($"删除文件/目录成功状态:{isSucc} 为空,则表示删除成功");
    }
    else
    {
        Debug.Log($"不存在此文件/目录:{delPath}, 无需删除");
    }
}

2.5 其他相关操作

复制文件:也同样有同步和异步两种方法,使用方式和上面基本一致

重命名文件:


三,小结

抖音小游戏文件存储系统是一个非常重要的组成部分,它提供了一种简单、可靠的方式来存储和管理小游戏中的数据。此文件存储系统支持存储和读取文本、JSON、二进制等类型的数据,并提供了多种 API 来实现数据的存储和访问。

在开发抖音小游戏时,可以使用抖音小游戏文件存储系统来实现数据的存储和访问,从而提高小游戏的性能和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/698562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java POI (2)—— Excel文件的上传与导出(实例演示)

一、单文件的上传功能 这里是一个demo的流程图&#xff0c;下面按照这个流程图做了一个简单的实现&#xff0c;有部分判断没有加上&#xff0c;实际操作中&#xff0c;可以根据自己的需求进行增加或者修改。并且此处还是在接受文件传入后将文件进行了下载&#xff0c;保存到本地…

哪个爬虫库用的最多?

在Python中&#xff0c;最常用的爬虫库是requests和BeautifulSoup。requests库用于发送HTTP请求和处理响应&#xff0c;而BeautifulSoup库用于解析HTML文档。这两个库通常结合使用&#xff0c;用于爬取网页内容并提取所需的数据。其他常用的爬虫库还包括Scrapy、Selenium等。 常…

我的创作纪念日(256)

目录 机缘 收获 日常 成就 憧憬 机缘 要说为什么我会选择IT这条路&#xff0c;我觉得是因为从小对电脑的兴趣&#xff0c;从小学2年级开始的电脑生涯&#xff0c;但是那时候也只是玩电脑游戏&#xff0c;而由于我接触电脑较早的缘故&#xff0c;开始有许多的朋友遇到问题…

vue+heatmapjs-vue实现热力图,点击/滑动可以监听并更新

实现效果如下&#xff1a; 点击的次数或者滑动越多&#xff0c;区域的颜色越深 1.下载最新版热力图插件 npm install heatmapjs-vue 2.main.js中全局引用 注意&#xff01;&#xff01;&#xff01;只能全局引用&#xff0c;不能局部引用&#xff0c;局部引用就报错显示不出…

「2024」预备研究生mem-形式逻辑强化:入选名额

一、入选名额 从后往前推 二、课后题

第3章-数组

1. 数组的概述 数组(Array)&#xff0c; 是多个相同类型数据按一定顺序排列 的集合&#xff0c; 并使用一个名字命名&#xff0c; 并通过编号的方式 对这些数据进行统一管理数组的常见概念 数组名下标(或索引)元素数组的长度 数组本身是引用数据类型&#xff0c; 而数组中的元…

spring boot admin服务监控报错

使用spring boot admin监控服务启动出现报错&#xff1a;adminHandlerMapping对象创建失败 org.springframework.beans.factory.BeanCreationException: Error creating bean with name adminHandlerMappingdefined in class path resource [de/codecentric/boot/admin/server…

C++Qt 入门

目录 Qt 是什么 Qt 与 Qt Creator 的关系 暗黑主题音乐播放器界面 UI 设计。 简约的视频界面设计。 炫酷车载音乐 APP 主界面开发。 Qt/C与 QML 如何选择 Qt 版本 Linux 下安装 Qt 配置中文输入法 Qt Creator 简单使用 第一个 Qt 程序 新建一个项目 ​编辑 项目文…

Java JDBC

目录 JDBC定义 为什么需要JDBC JDBC的工作原理 JDBC API JDBC编程模板 JDBC编程步骤 JDBC实战 1.JDBC定义 Java连接数据库的一种能力或是技术 2.为什么需要JDBC 总结&#xff1a;利用JDBC才可以使服务器端和数据库进行数据的传递和交互 场景1&#xff1a; 客户端&am…

chatgpt赋能python:Python选择排序算法图解

Python选择排序算法图解 选择排序是计算机科学中经典的排序算法之一&#xff0c;它的原理是从待排序的数据中选择最小的元素然后排在最前面&#xff0c;接着从剩下未排序的数据中继续这个过程&#xff0c;直到所有的数据都排好序。 在本篇文章中&#xff0c;我将深入探讨Pyth…

微服务架构之网关详解

前言 由于互联网的高速发展&#xff0c;网络数据请求数激增&#xff0c;使得服务器承受的压力越来越大。在早期的系统架构中&#xff0c;为减轻单台服务器的压力&#xff0c;通常使用 Load Balancer 来将网络流量平摊到多个服务器中。如今后端服务的种类和数量在不断变多&…

Django DRF - 【Token】认证基本使用

一. 前言 Django Rest Framework Token是Django Rest Framework中的一个扩展&#xff0c;用于实现用户认证和授权。它为每个用户生成一个唯一的Token&#xff0c;并将其存储在数据库中。在用户进行API请求时&#xff0c;用户需要在请求的HTTP Header中包含Token&#xff0c;这…

【广州华锐互动】机械设备事故VR模拟体验系统

随着虚拟现实技术的不断发展&#xff0c;越来越多的行业开始尝试将VR技术应用到实际场景中&#xff0c;以提供更加真实的体验。其中&#xff0c;机械伤害事故VR警示教育系统的出现&#xff0c;为机械工程师、安全培训人员等行业提供了一种全新的培训方式。在实现上&#xff0c;…

odoo16 中ondelete的用法

odoo 中的many2one类型字段有 ondelete设置&#xff0c;对应数据表中关系处理 a fields.Many2one(‘b’, string‘b’, ondelete‘set null’) 则当对模型b进行delete操作时&#xff0c;会引发如下操作 set null: 当b中删除记录时&#xff0c;modelA中相关记录的anull casc…

Redis实战案例8-缓存击穿及其解决方案和案例说明

1. 缓存击穿 缓存击穿是指一个被频繁访问&#xff08;高并发访问并且缓存重建业务较复杂&#xff09;的缓存键因为过期失效&#xff0c;同时又有大量并发请求访问此键&#xff0c;导致请求直接落到数据库或后端服务上&#xff0c;增加了系统的负载并可能导致系统崩溃 常见的解决…

开源虚拟化工具VirtualBox安装部署

什么是Virtualbox VirtualBox是一款由Oracle开发和维护的免费开源虚拟化软件&#xff0c;用于在一台计算机上创建和管理多个虚拟机。它允许用户在单个物理计算机上运行多个操作系统&#xff0c;例如Windows、Linux、macOS等。VirtualBox提供了一个虚拟化环境&#xff0c;使用户…

详细介绍如何使用 OpenCV 实现自动文档扫描仪--附实现源码

文末附相关源代码实现的免费下载链接 文档扫描是将物理文档转换为数字形式的过程。可以通过扫描仪或手机摄像头拍摄图像来完成。我们将在本教程中讨论如何使用计算机视觉和图像处理技术有效地实现这一目标。 在当今的计算机时代,几乎不需要任何物理文书工作。尽管如此,在仍…

现代操作系统第一章学习笔记

先附上一个原版的课后习题答案的链接。 课后习题答案 1.1 什么是操作系统 操作系统&#xff1a;他的任务是为应用程序提供一个更好、更简单、更清晰的计算机模型&#xff0c;并管理贮存、磁盘等所有设备。 计算机系统总的来说分为软件和硬件&#xff0c;如下图所示。多数计算…

华为孟晚舟:拥抱5G变革

2023 MWC上海开幕&#xff0c;华为副董事长、轮值董事长、CFO孟晚舟在大会上发表了“拥抱5G变革”的主题演讲。她表示&#xff1a;全球5G商用4年来&#xff0c;正持续引领价值创造&#xff0c;而5.5G是5G网络演进的必然之路&#xff1b;面向未来&#xff0c;科技走向复杂大系统…

突破未来:SAP助力新能源产业腾飞!

新能源行业概况 在互联网的时代浪潮下&#xff0c;多数行业都开始进行了调整与整合&#xff0c;竞争无处不在。作为新兴的新能源行业&#xff0c;如果不想从竞争中被淘汰&#xff0c;就需要把握时代的脉搏&#xff0c;找到突破口&#xff0c;带领企业在市场竞争中越走越远。我…