字符串和文本:

在Unity项目中,处理字符串和文本经常会产生性能问题。在C#中,字符串是不变的。任何对字符串的操作都会重新分配新的字符串,这个代价是非常昂贵的。如果在多重循环中重复地执行字符串连接操作,就会造成性能问题,特别是对长的字符串或者大的数据集操作的时候。

因此,把N个字符串连接起来就会分配N-1个中间的字符串,这样连续的操作就会对堆内存产生压力。

当我们需要在多重循环中或者每一帧对字符串进行操作时,记得使用StringBuilder来操作字符串。StringBuilder也还能被重用,以进一步减少内存的分配。

关于字符串的使用,详细内容也可以参考微软发布的文档:Best Practices for Using Strings in .NET​docs.microsoft.com

地域限制和顺序比较:

与字符串相关代码的一个核心问题就是无意中会使用默认的、慢的字符串API。这些API的目的是为了一些商业化的应用,能够处理出现在文本中的有关不同文化和语法规则的字符。

比如,下面的代码在一些使用美式英语的地区运行时,会返回true。在欧洲地区运行时,返回false。

提示:Unity脚本都是基于美式英语来运行的。

对于大多数的项目,这个完全没有必要。而且我们简单对每个字符进行比较,判断两个字符串是否相等,这速度大约会比使用上面的方式快10倍。当然,我们也可以调用String.Equals方法,然后设置比较类型StringComparison.Ordinal来实现:

低效率的内置字符串API:

除了上面讲的顺序比较外,也有一些C#的字符串的API效率比较低。比如:String.Format,String.StartsWith和String.EndsWith。以下是Unity给出的一些测试数据:

可见,如果是我们自己实现String.StartsWith和String.EndsWith,执行效率会高的多。实现方法也可以参考下图:

正则表达式:

在字符串匹配和操作字符串方面,正则表达式是非常消耗性能的。而且,C#类库也实现了正则表达式。所以,即使是调用IsMatch这样简单的函数,都会临时分配很多的内存。我们在开发中,出了初始化会临时分配内存外,应该不允许在其他地方临时分配较多内存。

如果一定要用正则表达式的话,注意不要使用静态的Regex.Match和Regex.Replace方法。这两个方法会动态的编译正则表达式,但不会缓存生成的对象。

下面是使用正则表达式的一个例子:

每一次以上的代码被执行,它都会生成5kb的内存垃圾。为了减少垃圾的生成,我们需要对以上代码进行重构:

在这个例子中,每一次调用myRegExp.Match只会产生320b的内存垃圾。对于简单的字符串匹配而言,它对内存的消耗依旧有点多,但与之前的例子相比,这已经是很大的改进了。

因此,如果正则表达式是不变的字符串常量,那么把它们当作第一个参数传递给Regex的构造器来预编译它们会更加有效。这些Regex对象也是可以被重用的。

XML, JSON和其他的长篇文本解析:

在loading时,解析文本通常是一项耗时的操作。有些情况下,解析文本所花的时间会超过loading和实例化Assets的时间。

这原因取决于我们用的文本解析器。C#内置的XML解析器是非常灵活的,但是,它不能对一些特殊的数据布局进行优化。

许多第三方解析器都是基于反射构建的。虽然在开发中使用反射是一个不错的选择(因为它能很好的适应数据布局的变化),但用反射是非常慢的。

Unity已经引入了一个带有内置JSONUtility API(可参考:

如果在文本解析中遇到性能问题,可以考虑以下的解决方案:

1.在Build时进行解析

当我们需要解析文本时,最好避免在游戏中进行这一步的操作。我们可以在Build的时候把文本解析成二进制文件。以加快读取时的速度。

2.数据分割和延迟加载

第二种情况情况是我们需要把能解析成小块的数据分割开来。一旦分割,数据解析就可以在不同时间进行。在理想的情况下,我们确定哪部分数据是会用到的,然后只加载用到的那部分数据。

3.线程

对于那些不需要用Unity API来操作的数据,可以在另外的线程中来解析它们。这可以提高多核CPU的利用率,是相当有用的。当然,我们在写代码时需要注意避免死锁。

unity中链接字符串和变量显示_理解Unity中的优化(六):字符串和文本相关推荐

  1. picturectrl控件中加载图片并显示_在 CRA 中使用 webp 图片提升加载性能

    webp 是 google 提倡的一种新的 image 格式,意在为 web 提供体积更小的图片格式.通常情况下,无损压缩可以减小 25%-35% 的体积(有例外情况,反而会增大体积,但是是因为转换图 ...

  2. python中的repr是什么意思_理解Python中的repr()函数

    扬帆大鱼 >>> x = 'foo'>>> x'foo'所以这个名字x附在'foo'绳子.例如,当你打电话的时候repr(x)解释程序'foo'而不是x然后打电话r ...

  3. 【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 的值 | 在函数中 间接修改 指针变量 的值 | 在函数中 间接修改 外部变量 的原理 )

    文章目录 一.直接修改 和 间接修改 指针变量 的值 二.在函数中 间接修改 指针变量 的值 三.在函数中 间接修改 外部变量 的原理 一.直接修改 和 间接修改 指针变量 的值 直接修改 指针变量 ...

  4. unity lookat导致物体颠倒怎么解决_在Unity 2D中如何用一行代码实现LookAt的效果,以及向量归一化小总结...

    被疫情困在家无聊翻翻以前的文章,发现好黑历史啊,虽然是刚学unity的时候写的,后面学习了DX11并且补了3D数学,发现这些问题都是小case了O(∩_∩)O. 在我最近制作的小游戏中,需要实现防御塔 ...

  5. c++如何把字符串转为变量名_如何优雅地计算多变量

    作者:包寒吴霜 中科院心理所硕士在读(名字/人格/社会/文化心理学) 知乎:https://www.zhihu.com/people/psychbruce 社会科学研究经常会遇到"超多变量& ...

  6. java 字符串是对象吗_解析Java中的String对象的数据类型

    解析Java中的String对象的数据类型 2007-06-06 eNet&Ciweek 1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所 ...

  7. 在python中可以使用if作为变量名_变量,注释,缩进,细数Python优雅风 | Python基础连载(二)...

    开篇 在之后的几期文章中,你将会陆续学习到Python的六个标准数据类型 不过在此之前,有一些先导内容需要掌握,所以这一期就先来介绍一下这些内容. 文章首发于微信公众号:我将在南极找寻你.专注干货分享 ...

  8. html语言中的链接方式,什么是超链接_在html中设置超链接的方法 - 驱动管家

    什么是超链接?html如何设置超链接?如果想要优化自己的网站,那么肯定少不了超链接的存在.正常情况下,我们会在html中设置超链接,从而使得点击的时候会跳转到需要的界面,从而增加自己网站的浏览量.下面 ...

  9. java如果把字符串转成对象_为什么Java中的字符串对象是不可变的,有什么好处?...

    专注于Java领域优质技术号,欢迎关注 原创: 阿杜的世界 阅读本文大概需要 4分钟. 所谓不可变对象,是指一个对象在创建后,它的内部状态不会被改变的对象.这意味着当我们将一个不可变对象的引用赋值给某 ...

最新文章

  1. string生成固定长度的哈希_Redis 选择Hash还是String 存储数据?
  2. 关于Java“回调”的详细理解及使用
  3. C 把两个bitmap文件合并成一个bitmap文件
  4. 徐雷FrankXu 内推 杭州 蚂蚁金服招聘 java开发工程
  5. 使用 TypeScript 自定义装饰器给类的属性增添监听器 Listener
  6. Apache Camel 3 –新增功能前10名
  7. 随想录(无均衡负载的smp os设计)
  8. [转载][奇文共赏].由入门到精通 - 吃透PID2.0.PDF
  9. MonkeyRunner_API
  10. android ndk 下载安装(ubuntu)
  11. 双浮点运算计算机在线,双浮点运算计算器
  12. 黑苹果 10.14.6 安装记录
  13. 超牛无损图片放大神器PhotoZoom
  14. python记录鼠标和键盘操作并重复_Python模拟鼠标和键盘操作实现重复性操作
  15. 软件开发人员电脑配置
  16. FFmpeg切割视频,自定义视频ts片段时长
  17. 苏州外包php,【苏州IT外包经验】Ubuntu 17.10系统下配置PHP+Apache+Mysql
  18. Python图像处理【5】图像扭曲与逆扭曲详解
  19. 92 - 青蛙跳台阶
  20. HTML转义字符、Javascript转义字符、HTML特殊字符对照表

热门文章

  1. spring data jpa 分页查询
  2. vue路由跳转报错解决
  3. ECMAScript Decorators---装饰器
  4. 《软件工程导论》课后习题解答
  5. VMware卸载有残留,再安装时报错提示MSI Failed
  6. Leetcode 565. Array Nesting
  7. 汇编小记16/3/27
  8. Gson解析Json格式数据
  9. Linux中的Ramdisk和Initrd
  10. 走到尽头的技术-MVC