使用ScriptableObject代替部分配置表的坑点

2023-11-05

1)使用ScriptableObject代替部分配置表的坑点
​2)加载配置内存过大问题
3)URP的UI在Android模型器下比在真机上暗
4)Unity在Windows上第一次运行Play启动很慢
5)如何正确卸载UnityWebRequest下载的图片资源


这是第231篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Script

Q:ScriptableObject可以通过Runtime修改,资源可以拖拽配置。这些都是Excel无法做到的优势。

所以准备尝试用ScriptableObject代替部分Excel的配置用在项目里。想知道,ScriptableObject这样用,大家有没有遇到过比较严重的坑点?例如这样的Asset的加载、解析的空间或时间上的开销是否可接受等等。

补充一下,比如装备是成组的,对每组装备做一个ScriptableObject对应的Asset拖一组装备Prefab引用,然后由外部持有ScriptableObject Asset的路径即可。像这种部分资源相关的配置走这套,粒度更细,一个Asset中包含的资源本身就是应该被同时加载的。这种情况是不是没有这种冗余加载的问题?

A1:之前的项目曾经用过这种方式做配置表,但是随着表格和配置的增加,会出现许多问题,比如以下几个:

  1. 内存:内存要比普通的加载、解析二进制文件要大不少,大概有8倍。
  2. 加载速度:加载速度比普通的解析二进制要慢十倍以上,也是个大概值,毕竟是三年前做的项目了。
  3. 卡顿:ScriptableObject的加载和解析都在主线程,会卡主线程,而自己实现的二进制可以自己写个子线程去解析,就算在主线程解析起来也很快。这块大概也是十倍的量级。
  4. 硬盘:如果二进制不压缩,其实硬盘上差距不那么大,但是稍微用zip压缩一下,就有十倍的差距了。
  5. 策划:如果面对大量的数据,Excel显然更能帮助策划高效地配置,比如现在需要配置100个道具,如果用ScriptableObject比较复杂。
  6. Runtime:Runtime修改虽然做不到,但是热重载是可以做到的,效率也不差多少。
  7. 资源可拖拽:这个功能你调查过策划是否喜欢了吗?
  8. 热更新:如果项目使用的语言是Lua,ScriptableObject会阻碍新增字段的更新,毕竟是C#声明的字段(或者后续有表格热更新增字段、表格的需求)。

以上情况如果都能接受,那么用ScriptableObject是可以的。据我所知,还是有一些上线项目是用这套方案的,并且也稳定运营了3年以上。

感谢xiaobai@UWA问答社区提供了回答

A2:举个例子,比如一个装备表关联上百个装备模型。加载直接拖上去的ScriptableObject就得同时加载这上百个装备模型。如果不用拖拽引用,这个的可编辑性远远不如Excel。

感谢欧月松@UWA问答社区提供了回答

A3:一般这种资源引用,可以考虑使用一个可加载的路径或者地址来代替,避免直接引用带来的同时加载问题。

感谢静风霁@UWA问答社区提供了回答

A4:ScriptableObject大部分时候还是没有Excel好用的,比如在公式和索引上,也无法快速定位配置错误,但是大多数Editor的编辑器功能需要用到ScriptableObject。

我们项目的方案是Excel转Protobuf + ScriptableObject转Protobuf,运行时只加载Protobuf的二进制文件即可。

感谢萧小俊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5fcd9c0710a17c6c2b09d559


Script

Q:配置表太多占用内存过大时,除了采用Sqlite,还有什么好的解决办法吗?FlatBuffer不用全部进内存吗?如果不全部进内存,访问速度如何呢?

A1:解答第一个问题:

  1. 可以针对重复数据进行剔除,尤其是一些字符串的配置。在配置导出时把这样的数据提取一份,其他用到的地方只是引用,会节省不少。
  2. 数据类型要合理。
  3. 可以使用类似FlatBuffer/ZeroFormatter的延迟加载的思路,在真正使用时再去反序列化。一次游戏过程中实际用到的配置量比较有限,使用这种策略可以尽可能地减少不必要数据的加载(这一条可能主要适用于C#层去读配置的,如果你们是存成Lua这条就不一定适用了)。

解答第二个问题:
我们上个项目也是到后期优化时遇到类似问题,只是参考了这种思路,并没有进行完全替换。在打包时,会对配置以行为单位,进行Offset和Length的计算;在Runtime阶段,初始加载只会加载每行的ID,对应的这一行的Offset和Length,然后后续逻辑调用配置表接口拿数据的时候,如果发现没有反序列化过,就根据Offset和Length再去构建一下相应的数据提供给上层。访问速度肯定没有开始直接全部加载的好,但我们测下来影响不大。

感谢范君@UWA问答社区提供了回答

A2:字符串吃内存,尽量少用或者复用。
表格中比较多的会是哪种?攻击-1000、防御-2000、血量-3000,每个Int都是4个字节,数量多了会顶不住。这种可以考虑用一个int32/int64/uint32/uint64去存多个数值。

感谢萧小俊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5fc8254010a17c6c2b09d48c


Rendering

Q:URP的UI在很多Android模型器下的明显比在手机上要暗很多。确认模拟器用的Gles3.0+ 支持Linear色彩空间,看上去就像是模拟器对UI进行了一次额外的GammaToLinearSpace,如果在导入UI图片时把sRGB勾掉,或者进行一次LinearToGamma,就能在模拟器上显示正常,但手机上就颜色太亮了,如下图:

 

A1:最新进展:之前用2019.3.5f1,更新到2019.4.10f1就没有这个问题了。

感谢题主loy_liu@UWA问答社区提供了回答

A2:Unity论坛有很多人反馈SRP + OPENGL ES + Linear Color Space在Android上面有渲染Bug。

看下Player Settings->Android->Resolution and Presentation->Blit Type设置成Auto能否解决问题呢?

感谢范君@UWA问答社区提供了回答

A3:2019.3.6f1的Release Note里有说到这个是Bug。

Mobile: [Android] [Gles3] [URP] Darker UI when using Gles3, Linear and URP

感谢Xuan@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5fbf460e10a17c6c2b09d375


Editor

Q:Unity在Windows上第一次运行Play启动很慢,但在Mac上没有这个问题。该如何进行排查呢?

A1:Mac没问题,有可能是Play启动游戏的时候在扫描各种资源文件导致,可以排查下AssetPostprocessor相关的,比如OnPostprocessAllAssets是不是每次启动的时候都在遍历。

感谢Kenji@UWA问答社区提供了回答

A2:如果是Editor的问题可以试一下Unity官方提供的编辑器耗时分析工具Performance Tracking(2019.4+),低版本从Profiler中看看能不能定位到耗时。

Performance Tracking
ScriptableObject导致的类似的问题

感谢羽飞@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5fd0640910a17c6c2b09d5bb


Resource

Q:通过UnityWebRequest和DownloadHandlerTexture下载的Texture资源,下载完成后赋值到RawImage组件,如何正确卸载UnityWebRequest下载的图片资源?

A:我们上个项目此类Texture都会被专门的Manager管理起来,确保没有被其他GameObject引用后,使用Object.DestroyImmediate来销毁掉,虽然这个接口官方不推荐使用。

或者可以尝试下确保没有引用后使用Object.Destroy卸载或等待下次调用Resources.UnloadUnusedAssets时来卸载。

感谢范君@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5fd2129410a17c6c2b09d60c

封面图来自网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用ScriptableObject代替部分配置表的坑点 的相关文章

  • 内存管理解析(2) 字节对齐详解

    很想贴出转载链接 找不到原来看的资料了 只有从个人记录的笔记上挪过来 如有错误请留言指正 目录 一 什么是字节对齐 二 为什么要字节对齐 三 有哪些对齐形式 1 结构体对齐 对齐值 对齐准则 对齐的隐患 更改对齐方式 2 栈内存对齐 3 位
  • netty5学习笔记-内存池4-PoolArena

    前面我们讲到了内存池中的几个重要的类 1 PoolChunk 维护一段连续内存 并负责内存块分配与回收 其中比较重要的两个概念 page 可分配的最小内存块单位 chunk page的集合 2 PoolSubpage 将page分为更小的块
  • Chrome自动运行Js去广告,利用插件网页自动运行Js脚本,油猴去广告教程【去处指定部位的广告】

    免自写代码去除广告 点击即可安装 点此去向去除广告的油猴脚本 以下是教学如何自己写油猴脚本删除指定广告的 目的页面 https m dmzj com view 33353 61162 html 可以看到由这两个网页元素组成了网页广告 一个灰
  • java的各类型数据在内存中分配情况详解

    有这样一种说法 如今争锋于IT战场的两大势力 MS一族偏重于底层实现 Java一族偏重于系统架构 说法根据无从考证 但从两大势力各自的社区力量和图书市场已有佳作不难看出 此说法不虚 但掌握Java的底层实现对Java程序员来说是至关重要的
  • C++内存泄漏和内存碎片的产生及避免策略

    1 内存泄漏的定义 一般我们常说的内存泄漏是指堆内存的泄漏 堆内存是指程序从堆中分配的 大小任意的 内存块的大小可以在程序运行期决定 使用完后必须显示释放的内存 应用程序一般使用malloc realloc new等函数从堆中分配到一块内存
  • 文件相关操作

    1 文件相关概念 1 1文件的概念 一个文件通常就是磁盘上一段命名的存储区 但是对于操作系统来说 文件就会更复杂一些 例如 一个大文件可以存储在一些分散的区段中 或者还会包含一些操作系统可以确定其文件类型的附加数据 但是这些是操作系统 而不
  • HTML:实现鼠标拖拽,释放效果

    第一部分body 先定义一个块标签 例如div class drag 第二部分style 自由书写其样式 不可或缺的属性position absolute 第三部分script 鼠标拖动元素移动 即元素的位置放上变化 坐标 var drag
  • 资源池 'default' 没有足够的系统内存来运行此查询

    今天 有个客户突然打电话跟我说他的系统出了点问题 一个查询查了几十秒才出来 有时候还出不来 于是我上去看了一下 打开数据库看了相关视图 发现查询确实很慢 运行多次之后出现 资源池 default 没有足够的系统内存来运行此查询 嗯 这句话的
  • C++ 中 map 容器的内存释放机制及内存碎片管理

    C 中 map 容器的内存释放机制及内存碎片管理 C 中的容器很好用 比如 vector map 等 可以动态扩容 自己管理内存 不用用户关心 但是在某些极端情况下 如果内存比较紧张的情况下 可能用户对于这些容器自己的管理规则 主要是释放规
  • pycharm IDE报错 ,记事本打开后出现卡顿,之后出现ide错误

    打开IDE之后进行编辑 点击setting出现页面无反应 右下角出现的提示 ide error occurred see detail submit display 点击进去之后 在点击这个display 类似重启IDE的命令 然后就可以继
  • 使用 Visual Studio 2022 写纯32位汇编(intel风格)

    文章目录 第0步 打开VS 2022 点击创建新项目 第1步 选择windows 桌面向导 第2步 配置项目 第3步 选择空项目 第4步 找到生成依赖项 选择生成自定义 第5步 勾选masm 第6步 新建文件 第7步 选择cpp文件并在下方
  • Linux mmap系统调用视角看缺页中断

    问题 1 mmap具体是怎么实现比read write少一次内存copy的 2 mmap共享映射和私有映射在内核实现的时候到底有什么区别 3 mmap的文件映射和匿名映射在内核实现的时候到底有什么区别 4 父子进程的COW具体怎么实现的 概
  • Unity内存与资源管理

    内存管理是程序开发的核心问题 而资源的使用又与内存息息相关 因此本章想要梳理整个开发流程中Unity对于内存与资源的管理方式 一 内存基础 1 1 基础概念 内存是暂时存放CPU中的运算数据 与硬盘等外部存储器交换的数据 在操作系统中 内存
  • [指针五]指针做参数传递--使用详解

    void myMalloc char s 我想在函数中分配内存 再返回 s char malloc 100 void main char p NULL myMalloc p 这里的p实际还是NULL p的值没有改变 为什么 if p fre
  • js的三种使用方式(行内js、内部js、外部js)

    1 行内js js不单独写出
  • valgrind Massif

    valgrind检查内存泄露 valgrind 程序 内存泄漏问题 我们有memcheck工具来检查 很爽 但是有时候memcheck工具查了没泄漏 程序一跑 内存还是狂飙 这又是什么问题 其实memcheck检查的内存泄漏只是狭义的内存泄
  • CPU高速缓存SRAM命中问题的总结与实验

    1 SRAM高速缓存的结构 获取本机CPU的SRAM缓存信息 我使用的是一个叫cpuinfo x86的小程序 可以获取x86架构的cpu相关信息 下载地址 http osxbook com book bonus misc cpuinfo x
  • Eclipse打开时出现failed to create the java virtual machine...

    一 问题分析 关于Eclipse出现failed to create the java virtual machine 等情况 1 重装系统之后会发现eclipse很意外的打不开 2 有时候Eclipse使用的时间过长 3 以上情况都会出现
  • 牛客字符串

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 我应该使用 ScriptSharp

    我正在开发我的第一个 ASP NET MVC 应用程序 我相信 Script 可以帮助我很多 但它找不到支持我发展所需的资源 我找不到 Codeplex 网站 只有一本手册 很好 但还不够 我能找到的教程很少 我知道 Script 用于开发

随机推荐

  • torch.autograd.grad求二阶导数

    1 用法介绍 pytorch中torch autograd grad函数主要用于计算并返回输出相对于输入的梯度总和 具体的参数作用如下所示 torch tril input diagonal 0 out None longrightarro
  • C语言:求斐波那契数列前n项的和

    include
  • 经典卷积神经网络——resnet

    resnet 前言 一 resnet 二 resnet网络结构 三 resnet18 1 导包 2 残差模块 2 通道数翻倍残差模块 3 rensnet18模块 4 数据测试 5 损失函数 优化器 6 加载数据集 数据增强 7 训练数据 8
  • linux安装python3以及pip过程,遇到的错误处理

    需要自己搭建环境 没想到的是基本的安装python3过程过程就踩了很多坑 希望对别人有帮助 参考 https www centoschina cn course config 11027 html 1 下载相应python3 7解释器htt
  • Unity—3D数学基础

    今天用了小半天时间初步了解3D数学基础 明天开始进入unity游戏脚本编写 每日一句 人间骄阳正好 风过林梢 彼时我们正当年少 目录 3D坐标系 全局 世界 坐标系 局部 模型 物体 坐标系 相机坐标系 屏幕坐标系 向量 向量的运算 Vec
  • div滚动到顶部或者底部触发分页查询方法

    如聊天界面 滚动到顶部触发分页 div标签里添加滚动事件 scroll passive getScrollUser event 方法 getScroll event if event target scrollTop 0 this chat
  • 6.824分布式

    MapReduce 例子加深理解 你的工作是实现一个分布式的MapReduce 包括两个程序 master 和 worker 只有一个master进程 以及 一个或多个worker进程并行执行 在真实的系统中 工作人员将在许多不同的机器上运
  • 【安全工具】Web漏洞扫描十大工具

    Web漏洞扫描十大工具 Acunetix Web Vulnerability Scanner 简称AwVS AwVS是一款知名的Web网络漏洞扫描工具 它通过网络爬虫测试你的网站安全 检测流行安全漏洞 a 自动的客户端脚本分析器 允许对Aj
  • 关于springBoot如何配置双数据源

    前言 本文采用springBoot 配置类的方式简单配置Mysql PostgreSql双数据源 1 首先导入需要的pom依赖
  • 配置测试

    1 配置测试 configuration testing 配置测试是指使用各种硬件来测试软件运行的过程 2 基于Windows的PC机包括 个人计算机 部件 系统主板 内部板卡和其他内部设备 外设 接口 可选项和内存 设备驱动程序 3 配置
  • 轻松理解转置卷积(transposed convolution)或反卷积(deconvolution)

    本译文很大程度上保留了原文原貌 并添加了细节便于理解 各种指代 在CNN中 转置卷积是一种上采样 up sampling 的常见方法 如果你不清楚转置卷积是怎么操作的 那么就来读读这篇文章吧 本文的notebook代码在Github 上采样
  • Redis——数据结构介绍

    Redis是一个key value的数据库 key一般是String类型 不过value的类型是多样的 String hello word Hash name Jack age 21 List A gt B gt C gt D Set A
  • SaltStack 自动化运维详解

    一 自动化运维工具对比 使用所需软件配置单个服务器是一项相当简单的任务 但是 如果许多服务器需要安装相同或相似的软件和配置 则该过程将需要大量的工时才能完成 这会耗尽您本已紧张的资源 如果没有某种形式的自动化 这项任务几乎无法完成 考虑到这
  • 关于SpringMVC返回date的格式问题

    Spring 项目中 java的util date和java time类型的日期 返回到前端的时候 默认的序列化方式显示的是标准格式 为了能够正确的显示想要的时间 可以使用jackson指定时间的格式 访问我的个人网站获取更多文章 数据库的
  • 汽车的操作系统AUTOSAR

    汽车软件开发autosar 01汽车相关知识 汽车发展三大趋势 电动化 智能化 网联化 1 电动化 底层支撑 网联化的驱动力 2 智能化 人工智能借助软硬融合带来功能升级 体验升级 安全升级 3 网联化 5G的应用场景 让汽车与人 车 物的
  • golang实现p2p之UDP打洞

    当今互联网到处存在着一些中间件 MIddleBoxes 如NAT和防火墙 导致两个 不在同一内网 中的客户端无法直接通信 这些问题即便是到了IPV6时代也会存在 因为即使不需要NAT 但还有其他中间件如防火墙阻挡了链接的建立 目前部署的中间
  • spring boot毕业生跟踪调查管理系统 毕业设计源码论文+答辩PPT

    答辩PPT 论文 springboot毕业生跟踪调查管理系统 摘 要 信息化社会内需要与之针对性的信息获取途径 但是途径的扩展基本上为人们所努力的方向 由于站在的角度存在偏差 人们经常能够获得不同类型信息 这也是技术最为难以攻克的课题 针对
  • CF 1843F2 - Omsk Metro (hard version)

    CF 1843F2 Omsk Metro hard version 题目描述 给定 n n n 个节点的有根树 根节点为 1 1 1 每个节点上有权值 0
  • asp.net中,<%#%>,<%=%>和<%%>分别是什么意思,有什么区别

    在asp net中经常出现包含这种形式的html代码 总的来说包含下面这样几种格式 一 这种格式实际上就是和asp的用法一样的 只是asp中里面是vbscript或者javascript代码 而在asp net中是 net平台下支持的语言
  • 使用ScriptableObject代替部分配置表的坑点

    1 使用ScriptableObject代替部分配置表的坑点 2 加载配置内存过大问题 3 URP的UI在Android模型器下比在真机上暗 4 Unity在Windows上第一次运行Play启动很慢 5 如何正确卸载UnityWebReq