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++版本的 ...
随机推荐
- 构造函数中,获取yml中的参数
成员变量的注入是在Bean创建成功之后,通过setter方法进行注入的.所以下面会获取不到值 @RestController public class VipsoftImController { @A ...
- Pycharm 2023 年最新激活码、破解教程,亲测有用,永久有效
申明:本教程 Pycharm 破解补丁.激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除.若条件允许,希望大家购买正版 ! PS: 本教程最新更新时间: 2023年2月2日~ ...
- 别再问我 2050 可以干什么,Make a Movie in a Day!
2050 的每个年青人都是新物种.越是不可能见面的人见了面,就越会有奇迹发生,2050 努力让年青人见上另一位年青人,激发新的创造力.一起来 2050 看看? 2050 是什么? 2050 大会是由阿 ...
- 【辅助工具】Postman使用
Postman使用 批量处理 https://www.bbsmax.com/A/A7zglyjoJ4/ pm.test("测试结果成功", function () { pm ...
- Qt 的Cmake方式如何创建资源文件和添加类
CLion(误,QT Creator) 添加资源文件时 选择Qt 然后选择Qt Resource File 单击choose,然后给你的资源文件输入一个名字比如res单击下一步,然后完成,保存 这时候 ...
- Xmanager连接linux服务器的桌面
在办公室使用xshell通过22端口访问linux服务器大家都很熟悉,但有的时候在办公室要远程linux服务器上的桌面应用,该如何实现. 环境准备 客户端:win10 服务器:centos7.9 一. ...
- connect() failed (113: No route to host) while connecting to upstream
转载请注明出处: 用docker 搭建的服务,今天重启了一个容器之后,请求这个服务的接口都变成了 502, 但通过docker 查看日志,发现没有异常,端口也都是正常,在nginx的日志中看到了这段错 ...
- Angular系列教程之父子组件通信详解
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- CSS3之transition
随着css3不断地发展,越来越多的页面特效可以被实现. 例如当我们鼠标悬浮在某个tab上的时候,给它以1s的渐进变化增加一个背景颜色.渐进的变化可以让css样式变化得不那么突兀,也显得交互更加柔和. ...
- uniapp 子页面 滚动监听 是否到底
主要属性: handleScrollToLower <template> <view class="menu"> <scroll-view id=& ...