Unity中的string gc优化
在项目中如果有大量的字符串拼接,比如每秒执行的倒计时,协议中的日志输出,每次拼接会产生大量的gc,尤其是在ILRuntime下执行 gc alloc的次数会更加频繁。
zstring
有两个字符串处理的库都叫zstring,其中小写的zstring是一款国人开源的zstring,而大写的ZString是日本的CySharp公司的
国人的zstring:https://github.com/871041532/zstring
ZString:https://github.com/Cysharp/ZString
经测试zstring在update中是0gc,而ZString还有gc,短字符串处理,会比原生string慢一些,我的测试环境:Unity2019.3.4f1
gc分配值:string >ZString >zstring
执行耗时:zstring >ZString >string
易用性:string>zstring>ZString
测试代码
void Update()
{
Profiler.BeginSample("zstring=============concat");
ZString.Concat("abc", 1);
Profiler.EndSample();
Profiler.BeginSample("string=============concat");
string.Concat("abc", 1);
Profiler.EndSample();
Profiler.BeginSample("cn-zstring=============concat");
using (zstring.Block())
{
zstring.Concat("abc",1);
}
Profiler.EndSample();
Profiler.BeginSample("zstring=============format");
ZString.Format("hello,{0}",1111);
Profiler.EndSample();
Profiler.BeginSample("string=============format");
string.Format("hello,{0}",1111);
Profiler.EndSample();
Profiler.BeginSample("cn-zstring=============format");
using (zstring.Block())
{
zstring.Format("hello ,{0}",1111);
}
Profiler.EndSample();
}
ZString和string gc对比
Method | Allocated(B) | Mean(ns) | Mean(ns) | |||
---|---|---|---|---|---|---|
StringPlus | 224 | 126.66 | 126.66 | |||
ZStringConcat | 56 | 96.95 | 96.95 | |||
StringFormat | 128 | 158.21 | 158.21 | |||
ZStringFormat | 56 | 185.36 | 185.36 | |||
StringBuilder | 296 | 144.2 | 144.2 | |||
ZStringBuilder | 56 | 131.68 | 131.68 |
结论
个人而言更倾向于使用国人开发的zstring,它只有一个代码文件,放Plugins目录下就可以使用,相对而言上手更容易
Unity的建议
关于内存管理可看这篇: https://docs.unity3d.com/cn/current/Manual/UnderstandingAutomaticMemoryManagement.html
其中有条建议,对于需要频繁拼接的字符串,先判断字符串是否有变化,无变化则不需要拼接
对于字符串的拼接,使用stringbuilder代替string,同时我也建议使用zstring代替string的+=
对于参数的传递,可以传入引用类型,就不需要每次都构建一个新的对象
Unity中的string gc优化的更多相关文章
- Unity中的GC以及优化
[简介] 常见的 Unity GC 知识点总结出来的思维导图 Unity 官方文档,正巧在博客园发现了已经有位大神(zblade)把原文翻译出来了,而且质量很高~,译文地址 在这里.下面我就可耻地把译 ...
- 浅谈Unity中的GC以及优化
介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据不在需要的时候,存储当前数据的内存就可以被回收再次使用.内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使 ...
- Unity下XLua方案的各值类型GC优化深度剖析
转自:http://gad.qq.com/article/detail/25645 前言 Unity下的C#GC Alloc(下面简称gc)是个大问题,而嵌入一个动态类型的Lua后,它们之间的交互很容 ...
- 关于Unity中的UGUI优化,你可能遇到这些问题
https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...
- Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点 ...
- 【Unity技巧】Unity中的优化技术
http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...
- Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术
转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...
- Unity中的优化技术
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/candycat1992/article/ ...
- 【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则
作者:Williammao, 腾讯移动客户端开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/290.h ...
- Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践
protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被广泛使用的Google Protocol Buffer库的c#版本,之所以c#版本被广泛使用,是因为c++版本的 ...
随机推荐
- Web 目录文件浏览配置
IIS 配置目录浏览 在目录下 Web.config 下添加一句: <directoryBrowse enabled="true"/> <?xml version ...
- EasyUI DataGrid 没有数据
//判断后台返回数据是否没数据,没数据DataGrid添加一行 $(this).datagrid('appendRow', { itemid: '<div style="text-al ...
- Seata是什么?一文了解其实现原理
一.背景 随着业务发展,单体系统逐渐无法满足业务的需求,分布式架构逐渐成为大型互联网平台首选.伴随而来的问题是,本地事务方案已经无法满足,分布式事务相关规范和框架应运而生. 在这种情况下,大型厂商根据 ...
- RabbitMQ的ack机制
1.什么是消息确认ACK. 答:如果在处理消息的过程中,消费者的服务器在处理消息的时候出现异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失.为了确保数据不会丢失,RabbitMQ支持消 ...
- vue tabBar导航栏设计实现4-再次抽取MainTabBar
系列导航 一.vue tabBar导航栏设计实现1-初步设计 二.vue tabBar导航栏设计实现2-抽取tab-bar 三.vue tabBar导航栏设计实现3-进一步抽取tab-item 四.v ...
- 从0开发3D引擎(十三):使用领域驱动设计,从最小3D程序中提炼引擎(第四部分)
目录 上一篇博文 下一篇博文 本文流程 回顾上文 解释基本的操作 如何在浏览器上运行index.html 开始实现 准备 建立代码的文件夹结构,约定模块文件的命名规则 模块文件的命名原则 一级和二级文 ...
- C#语言 十大经典排序算法动画与解析!(动态演示+代码)(java改写成C# )
以下内容是根据 https://www.cnblogs.com/fivestudy/p/10212306.html 进行改写 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法 ...
- Vue第三篇 Vue组件
01-组件的全局注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- Jinfo 查看 jvm 配置及使用 Jstat 查看堆内存使用与垃圾回收
本文为博主远传,未经允许不得转载: 1. Jinfo 查看正在运行的Java应用程序的扩展参数: 包含 JVM 参数与 java 系统参数 命令: jinfo pid 2. 使用 jstat 查看堆 ...
- 26-IP调用 - PLL
1.PLL IP核简介 PLL(Phaze Locked Loop)锁相环是最常用的IP核之一,其性能强大,可以对输入到FPGA的时钟信号进行任意的分频.倍频.相位调整.占空比调整,从而输出一个期望时 ...