unity中0GC优化方案《zstring》

文章目录

  • 序言
  • 简介
  • GC带来的问题
    • 性能瓶颈
    • 玩家体验受损
  • 使用方式

序言

游戏开发秉承遇到好东西要分享,下面介绍zstring,感谢作者开源无私奉献
源码地址:https://github.com/871041532/zstring

简介

GC带来的问题

性能瓶颈

GC暂停主线程执行:当.NET的垃圾回收器开始工作时,它会暂时挂起所有程序执行以进行内存清理和整理。这意味着游戏逻辑、物理计算、渲染等都会被迫暂停,这会导致帧率下降或卡顿,影响游戏流畅度。
帧时间不一致:
由于GC的发生不可预知,其带来的延迟可能导致每一帧的时间长度不稳定,这对于实时交互的游戏体验尤其不利,特别是在需要保持稳定刷新率(如60fps)的场景。

玩家体验受损

突然的卡顿会影响玩家沉浸感,并可能导致在关键的游戏时刻出现响应延迟,比如战斗中的操作反馈或者复杂场景加载时的视觉表现。
资源浪费:
频繁的内存分配与回收也会增加系统的内存管理开销,导致整体系统效率降低,可能消耗更多的CPU周期和其他系统资源。
潜在的内存泄漏:
如果因为编程习惯不良而导致大量短生命周期对象不断产生并触发GC,则可能存在未被正确释放的内存,久而久之可能会引发内存泄漏,使得可用内存逐渐减少,最终导致游戏崩溃或其他严重问题。
因此,在Unity开发中,开发者需要密切关注代码设计,采用合适的数据结构、内存管理和对象池技术来最小化临时对象的创建和销毁,从而最大限度地减少对GC的依赖。

在Unity中实现0GC(零垃圾回收)的目标,主要是为了避免频繁触发.NET的垃圾回收机制,因为垃圾回收会导致短暂的帧率下降和性能波动。
C# 0GC字符串补充方案。结合gstring与CString两者特点(向这两个方案的作者致敬),只有一个文件,性能与使用方便性高于两者。

报告地址:
https://coh5.cn/p/1ace6338.html

使用方式

1.Unity引擎将zstring.cs文件放于plugins目录下即可使用(不在plugins目录,则IOS打包或IL2CPP打包等FULLAOT方式编译不过),或者直接把结构体定义放入zstring类中;其余C#程序将zstring.cs直接放入工程使用即可。

2.(最佳性能)当update每帧刷新标签显示,或者大量UI飘字,或者该字符串是短时间使用的则使用如下方式:

   using (zstring.Block()){uiText1.text=(zstring)"hello world"+" you";uiText2.text=zstring.format("{0},{1}","hello","world");}

此方式设置的string值位于浅拷贝缓存中,一定时间可能会改变,出作用域后正确性不予保证。

3.资源路径这种需要常驻的则需要intern一下在作用域外使用

     using (zstring.Block()){zstring a="Assets/";zstring b=a+"prefabs/"+"/solider.prefab";prefabPath1=b.Intern();prefabPath2=zstring.format("{0},{1}","hello","world").Intern();}

此方式设置的string值位于深拷贝缓存中,游戏运行期间不会改变,可以在作用域外使用。

4.不可使用zstring作为类的成员变量,不建议在using作用域中写for循环,而是在for循环内using。

5.首次调用时会初始化类,分配各种空间,建议游戏启动时调用一次using(zstring.Block()){}

6.0GC。时间消耗上,短字符串处理,zstring比gstring时间少20%30%,比原生慢。大字符串处理,zstring比gstring时间少70%80%,接近原生string速度。

7.追求极限性能的话,核心函数可以用C++Dll中的 memcpy内存拷贝函数,性能提升10%~20%,一般没这个必要。

8.测试打开zstringTest工程,在Test脚本上勾选与不勾选bigStringTest下查看Profile性能。(同时对比了zstring,gstring,CString,还有王国纪元里的string)

9.据热心用户反应,IL2CPP 2017.4 在 Android上有字节对齐问题,换成2018就木有了。所以此时解决办法有三个:1.IL2CPP换成2018以上版本。 2.719行左右的memcpy函数换成循环一次拷贝一个字节。 3.不怕麻烦的话此处调用C语言的内存拷贝函数dll,即C语言<string.h>中的memcpy,这样性能也更高。
当前Untiy版本有函数UnsafeUtility.MemCpy直接拷贝内存,建议用这个函数替换memcpy函数。

python学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

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

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

相关文章

Syntax Error: Error: Cannot find module ‘imagemin-optipng‘

一、背景&#xff1a; 心酸&#xff0c;很难受&#xff1b;本人主要做后端开发&#xff0c;这几天要打包前端项目 遇到了这个报错 Syntax Error: Error: Cannot find module imagemin-optipng 搞了3天时间才打包成功&#xff0c;使用了各种姿势才搞定。期间百度了各种方案都…

C语言编译器(C语言编程软件)完全攻略(第二十九部分:Linux GCC简明教程(使用GCC编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 二十九、Linux GCC简明教程&#xff08;使用GCC编写C语言程序&#xff09; 市面上常见的 Linux 都是发行版本&#xff0c;典型的 Linux 发行版包含了 Linux 内核、桌面环境&#xff08;例如 GNOME、KDE、Unity 等&#xff09;和各种…

小H靶场笔记:DC-5

DC-5 January 5, 2024 10:44 AM Tags&#xff1a;screen提权 Owner&#xff1a;只惠摸鱼 信息收集 探测靶机ip&#xff0c;大概率为192.168.199.135&#xff0c;且开放端口为80和111 扫描端口80&#xff0c;111相关服务、版本、操作系统、漏洞信息 sudo nmap -sS -O -sV 19…

【数据结构和算法】字符串解码

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 什么情况会用到栈 2.2 方法一&#xff1a;辅助栈法 三、代码 3.1 方法一&#xff1a;辅助栈法 四…

SpringBoot Redis入门(一)——redis、Lettuce、Redisson使用

本章&#xff1a;将展示SpringBoot集成Redis三种客户端的配置要点和常见应用示例&#xff1b;下章&#xff1a;自行实现一个方法级的缓存注解&#xff0c;简化版的Cacheable&#xff0c;使初学者加深对Spring缓存框架的理解。 一、Lettuce客户端 Lettuce 是一种可扩展的、线程…

【基础篇】十三、强软弱虚引用、终结器引用

文章目录 0、相关&#x1f58a;1、强引用2、软引用3、弱引用4、虚引用5、终结引用 关于对象能否被回收&#xff1a; 计数器可达性分析 还可以根据引用的类型&#xff0c;不同的引用类型&#xff0c;对应对象的不同GC回收规则。 0、相关&#x1f58a; &#x1f4d5;【强软弱虚…

简易视频播放器(案例)

介绍 本篇Codelab使用ArkTS语言实现视频播放器&#xff0c;主要包括主界面和视频播放界面&#xff0c;我们将一起完成以下功能&#xff1a; 主界面顶部使用Swiper组件实现视频海报轮播。主界面下方使用List组件实现视频列表。播放界面使用Video组件实现视频播放。在不使用视频组…

【信息论与编码】习题-单选题

目录 单选题1.下列说法正确的是&#xff08;B&#xff09;2.在信息论中&#xff0c;若用对数底2为&#xff0c;则信息量的单位为&#xff08;C&#xff09;3.率失真函数的下限为&#xff08;A&#xff09;4.给定xi条件下随机事件yj所包含的不确定度和条件自信息量p(yj /xi)。&a…

Fast DDS 官方--C++ API Reference

Fast DDS 官方--C API Reference 1 介绍2 接口2.1 DDS DCPS PIM2.1.1 Core2.1.1.1 Entity 【基类】2.1.1.2 DomainEntity2.1.1.3 Policy 【枚举】2.1.1.3.1 DataRepresentationId2.1.1.3.2 DataRepresentationQosPolicy2.1.1.3.3 DataSharingQosPolicy2.1.1.3.4 DataSharingKin…

使用HttpSession和过滤器实现一个简单的用户登录认证的功能

这篇文章分享一下怎么通过session结合过滤器来实现控制登录访问的功能&#xff0c;涉及的代码非常简单&#xff0c;通过session保存用户登录的信息&#xff0c;如果没有用户登录的话&#xff0c;会在过滤器中处理&#xff0c;重定向回登录页面。 创建一个springboot项目&#…

【Turtle库】海绵宝宝

在这个充满创意与想象力的时代&#xff0c;我们决定挑战一项富有意义且有趣的使命——使用Python编程语言绘制海绵宝宝。这个经典的角色&#xff0c;以其独特的魅力和无与伦比的搞笑天赋&#xff0c;已经成为了无数人心中的童年回忆。现在&#xff0c;我们希望通过Python的强大…

了解统计分析中的岭回归

一、介绍 在统计建模和机器学习领域&#xff0c;回归分析是用于理解变量之间关系的基本工具。在各种类型的回归技术中&#xff0c;岭回归是一种特别有用的方法&#xff0c;尤其是在处理多重共线性和过拟合时。本文深入探讨了岭回归的概念、其数学基础、应用、优点和局限性。 在…