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++版本的 ...
随机推荐
- 叫板GPT-4的Gemini,我做了一个聊天网页,可图片输入,附教程
先看效果: 简介 Gemini 是谷歌研发的最新一代大语言模型,目前有三个版本,被称为中杯.大杯.超大杯,Gemini Ultra 号称可与GPT-4一较高低: Gemini Nano(预览访问) 为 ...
- 彻底干掉了Windows的cmd,一个字:爽!
彻底干掉了Windows的cmd,一个字:爽! 先说一句:Windows下的 cmd 就是垃圾! 习惯了Ubuntu和Mac的Terminal,再去用Windows的 cmd 简直难以忍受. 今天就向 ...
- 《Flask Web 开发指南 pt.1》
最近在看辉哥的<Flask Web 开发实战>,这才有了<Flask Web 开发指南>系列的文章,偏向学习笔记多一点,也有实战的内容 看下这个系列的文章我能写多少篇 :) 愚 ...
- Step by step guide to becoming a C++ developer in 2023
https://roadmap.sh/cpp https://roadmap.sh/backend
- Educational Codeforces Round 82 (Rated for Div. 2) A. Erasing Zeroes(超简单的写法)
题意: 统计间隔在1中0的个数 思路: 超简单写法,直接利用string的find.rfind函数即可 #include<bits/stdc++.h> using namespace st ...
- Codeforces 451B Sort the Array(水题)
题目连接:Codeforces 451B Sort the Array 题目大意:给出一个长度为n的序列,可以有一次机会旋转a[l]到a[r]之间的数,问说可否形成一个递增序列. 解题思路:将数组排下 ...
- C++ bitset的简单使用
bitset 一般代替 bool 数组使用,常用于优化空间,因为 bitset 中一个元素只占 1 bit. bitset 的大小在定义使就需要确定.如果想要不定长的 bitset,就需要使用 vec ...
- C++跨DLL内存所有权问题探幽(一)DLL提供的全局单例模式
最近在开发的时候,特别是遇到关于跨DLL申请对象.指针.内存等问题的时候遇到了这么一个问题. 问题 跨DLL能不能调用到DLL中提供的单例? 问题比较简单,就是我现在有一个进程A,有DLL B DLL ...
- 解决Xshell/Xftp提示“要继续使用此程序必须应用到最新的更新或者新版本”(临时规避和彻底解决方案)
一.xshell与xftp登录时提示,但是更新却又每次都失败,无法登录 二. 临时规避方案:手动修改日期为1年前,问题解决软件可以打开,但是每次启动都要手动修改,甚是麻烦 三.彻底解决方案,修改xs ...
- Python数据可视化-动态柱状图可视化
Python数据可视化-动态柱状图可视化 一.基础柱状图 通过Bar构建基础柱状图 """ 演示基础柱状图的开发 """ from pyec ...