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

字符串和文本:

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

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

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

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

地域限制和顺序比较:

与字符串相关代码的一个核心问题就是无意中会使用默认的、慢的字符串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的利用率,是相当有用的。当然,我们在写代码时需要注意避免死锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bean的scope属性

1、singleton(默认值):单列对象,被标识为单例的对象在spring容器中只会存在一个实例 测试如下: 我们创建一个User类: public class User {private String name;private int age;public User() {System.out…

Oracle 索引扫描的五种类型

之前在讨论CBO和RBO的时候提到了索引扫描的几种类型。 Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/2010/08/19/5824886.aspx Oracle 索引 详解 http://blog.csdn.net/tianlesoftware/archive/2010/03/05/5347098.aspx Oracle Explain Plan http:/…

导入其他spring模块配置

列如下图中有两个spring的配置文件&#xff0c;我们想把上面的配置文件导入到下面的文件中去&#xff0c;该如何操作&#xff1a; 打开下面的配置文件&#xff0c;配置属性import,在import的resource配置上面配置文件的路径就可以了&#xff0c;如下&#xff1a; <import …

vs2019编写Linux c/c++项目

最近一直在阅读ovs的源码&#xff0c;看到用户态代码的时候&#xff0c;需要对用户态的代码进行调试&#xff0c;一开始想直接使用linux中的GDB进行调试&#xff0c;但是ovs的工程太过于复杂&#xff0c;从网上找了些文章&#xff0c;发现vs2017能够支持linux c程序的调试&…

spring属性注入的set方法注入

1、值注入 创建我们要使用的User类&#xff1a; package cn.it.bean;public class User {private String name;Overridepublic String toString() {return "User [name" name ", age" age "]";}private int age; // private Car car; // /…

系统蓝屏的几种姿势

前言 在 蓝屏&#xff08;BSOD&#xff09;转储设置&#xff0c;看本文就够了&#xff01; 这篇文章里比较详细的介绍了蓝屏转储设置。做好设置后&#xff0c;我们就可以在需要的时候使系统蓝屏了。这样我们就可以拿到一份系统转储&#xff0c;供我们分析问题了。本文介绍几种可…

nginx lua mysql 性能_深入浅出 nginx lua 为什么高性能

最近很多人问我nginx lua的优势是什么&#xff1f;为什么&#xff1f;一、同步和异步、阻塞和非阻塞如果要说清楚这个问题首先要了解&#xff1a;同步和异步、阻塞和非阻塞的关系同步&#xff1a;php、java的正常代码都是同步执行的异步&#xff1a;javascript的回调函数就是异…

求两个数字的乘积,如果大于0,说明两个数字同号,如果小于0,说明两个数字异号,如果等于0,说明其中一个是0

学了java基础东西&#xff0c;就写了这个编程&#xff0c;求两个数字的乘积&#xff0c;如果大于0&#xff0c;说明两个数字同号&#xff0c;如果小于0&#xff0c;说明两个数字异号&#xff0c;如果等于0&#xff0c;说明其中一个是0 首先程序要求我们输入两个数字&#xff0c…

处理机流水线------经典五段流水线

文章是在我遇到这部分问题时查找的所有感觉挺好的内容的整合&#xff08;全部是转载的&#xff09; 流水线基础理论就不加了&#xff0c;最新的处理器流水线处理的机制也没有&#xff08;一般以用不到&#xff09;&#xff0c;想了解去随便找个芯片厂商官网下个手册自己查。 这…

求1+2+......+100的和

如何求12…100的和&#xff1f;有很多方法&#xff0c;这里我介绍用三种循环方法去求12…100的和 方法一&#xff1a;for循环&#xff1a; 代码如下&#xff1a; /**1. 求12......100的和2. 方法1&#xff1a;for循环*/ public class Demo2 {public static void main(String[…

台湾游戏企业抢滩大陆 研发成竞争核心

近日&#xff0c;台湾游戏企业进驻大陆设立研发机构、产品同大陆企业联合运营、大陆企业的产品进入台湾联运&#xff0c;以及最新的政策新闻&#xff0c;都将大陆和台湾这对本是同根的产业兄弟推上了风口浪尖。 在正在举行的“第二届中国优秀游戏制作人评选大赛”上&#xff0c…

mysql 插入中文 ERROR 1366 (HY000): Incorrect string value: '\xE7\x8E\x9E\x97' for column

1、出现这个问题&#xff0c;是因为我们的字符编码设置出现了问题&#xff0c;用cmd打开命令终端&#xff0c;查看我们的数据库设置&#xff1a; 2、输入命令use crm&#xff08;crm是我创建的数据库,大家在修改时换成自己的数据库名即可&#xff09; 再输入&#xff1a;show …

handlersocket mysql_Mysql插件之HandlerSocket的安装、配置、使用

HandlerSocket简介HandlerSocket是针对Mysql的一个NoSQL插件&#xff0c;它作为一个守护进程工作在mysqld进程里面,接收tcp连接&#xff0c;并处理来自客户端的请求。HandlerSocket不支持SQL查询&#xff0c;作为替代&#xff0c;它支持表的简单的CRUD操作。由于下面的原因&…

java,jdk安装,配置环境变量,window10系统

1、找到我们要安装的jdk软件&#xff0c;软件下载我就不介绍了&#xff0c;jdk下载连接地址 然后安装&#xff0c;一直点下一步就可以了&#xff0c;这里不建议跟换软件目录&#xff0c;毕竟第一次用&#xff0c;出了什么错就不好弄了&#xff0c;注&#xff1a;记得软件的安装…

solr mysql数据注入_(solr系列:四)将mysql数据库中的数据导入到solr中

在前面的博文中&#xff0c;已完成了在tomcat中对solr的部署&#xff0c;为solr添加了一个自定义的core,并且引入了ik分词器。那么该如何将本地的mysql的数据导入到solr中呢&#xff1f;准备工作&#xff1a;1、mysql数据源&#xff1a;myuser库中的user表(8条数据)/*Navicat M…

Silverlight学习笔记(三):创建第一个Silverlight应用程序

在开始创建程序之前&#xff0c;还是要提一下关于Silverlight开发环境搭建的问题。如果使用VS2010&#xff0c;这可以搭建Silverlight4的开发环境。我推荐大家看这篇由大牛jv9撰写的【轻松建立Silverlight 4开发环境】。 我使用的是VS2008&#xff0c;所以要搭建的是Silverlig…

按钮旁边加一个提示_地铁站的那些“红色按钮”,你知道是干啥用的吗?乱按可能被拘留...

地铁紧急停车按钮图片来自网络位置&#xff1a;站台两侧墙壁上&#xff0c;靠近列车车头、车尾两侧。外观&#xff1a;上锁的红色四方小盒子&#xff0c;按钮为红色&#xff0c;旁边写有“紧急停车按钮”等字样。使用&#xff1a;紧急时刻击碎中间玻璃&#xff0c;按压按钮。红…

根据F12在页面中调整div的大小

我们先随便写一个div大小&#xff0c;然后在chrome浏览器打开&#xff0c;显示效果&#xff1a; #logo{border: 1px solid black;width: 1300px;height: 50px;} .top{border: blue solid 1px;width: 420px;height: 50px;float: left;}<div id"logo"><div c…

The security settings could not be applied to the database because the connection has failed安装Mysql

安装msql出现这个问题&#xff0c;&#xff0c;百度了好久才解决了问题&#xff0c;说一下怎么解决的吧 把以前安装的Mysql删除打开C盘&#xff0c;点击查看&#xff0c;然后点击隐藏的项目&#xff0c;这时候目录会出现ProgramData文件&#xff0c;然后点击这个文件&#xff…

Hibernate配置C3P0连接池(在配好基本的hibernate配置下使用)

拷贝jar包 找到我们的hibernate安装包&#xff0c;在lib目录下找到optional目录&#xff0c;打开c3p0文件&#xff0c;拷贝里面的jar包到eclipse里 写一个测试类&#xff0c;代码入下 public class C3P0Test {Testpublic void test() {Session s HabernateUtils.openSessi…