unity中0GC优化方案《zstring》

news2024/9/22 11:31:28

文章目录

  • 序言
  • 简介
  • 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.coloradmin.cn/o/1361022.html

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

相关文章

你珍藏的那个表情包女孩,现在滤镜碎了一地。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文|猴哥聊娱乐 编辑|侯欢庭 七年前&#xff0c;一个年仅三岁的小女孩以其无邪的表情包风靡网络&#xff0…

科锐16位汇编学习笔记 03 汇编指令

指令种类 数据传送指令算数运算类指令位操作类指令串操作类指令控制转移类指令处理器控制类指令 数据传送类指令 传送类指令不影响标志位&#xff0c;**除了标志位传送指令外。** 传送指令MOV&#xff08;move&#xff09; 说明 ​ 把一个字节或字的操作数从源地址传送至…

安全与认证Week3 Tutorial+历年题补充

目录 1) 什么是重放攻击? 2)什么是Kerberos系统?它提供什么安全服务? 3)服务器验证客户端身份的一种简单方法是要求提供密码。在Kerberos中不使用这种身份验证&#xff0c;为什么?Kerberos如何对服务器和客户机进行身份验证? 4) Kerberos的四个要求是什么?Kerberos系…

Python IDE Pycharm服务器配置方法并结合内网穿透工具实现远程开发

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…

位移贴图还原电影3D角色

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 位移贴图&#xff08;Displacement Map&#xff09;在电影制作中是一…

Databend 的安装配置和使用

介绍 Databend 是一个内置在 Rust 中的开源、弹性和工作负载感知的云数据仓库&#xff0c;为 Snowflake 提供了具有成本效益的替代方案&#xff0c;专门对最大的数据集进行复杂分析而设计。 性能&#xff1a; 在存储对象上&#xff0c;能快速进行数据分析。没有索引和分区&a…

扩展 apiserver 连接认证 ip, apiserver证书更新

本文来自我的博客地址 文章目录 问题场景:问题分析:问题解决:查看 apiserver 证书支持的 ip 或 host使用 openssl 生成证书:再次查看 apiserver 证书支持的 ip 或 host 再次尝试将 master 加点加入参考 问题场景: k8s 1.28.1 集群后期新增 vip apiserver 证书不支持 vip 引入…

【LLM】大型语言模型:2023年完整指南

Figure 1: Search volumes for “large language models” 近几个月来&#xff0c;大型语言模型&#xff08;LLM&#xff09;引起了很大的轰动&#xff08;见图1&#xff09;。这种需求导致了利用语言模型的网站和解决方案的不断开发。ChatGPT在2023年1月创下了用户群增长最快…

工智能基础知识总结--导出SVM要优化的问题

导出SVM要优化的问题 对于上图中这样一个二分类线性可分问题,期望找到一个分类超平面将正负类分开,SVM就是一个用来寻找这样的分类超平面的算法。 定义正负类的标签分别为1、-1,分类超平面的表达式为 f ( x ) = w T x + b f(x)=w^Tx+b

vue的插值语法,vue指令系统,style和class

官网&#xff1a;https://cn.vuejs.org/ 文档3&#xff1a;https://cn.vuejs.org/ 文档2&#xff1a;https://v2.cn.vuejs.org/ M-V-VM架构 mvvm 前端vue架构 M&#xff1a;model 数据层 V&#xff1a;view 用户视图层 VM&#xff1a;viewmodel 连接数据和视图…

技术概述:ARMv8体系结构

John Goodacre, Director Program Management ARM Processor Division, November 2011 背景&#xff1a;ARM体系结构 从ARM精简指令集体系结构提出到现在已经有20多年了&#xff1b;ARMv7系列处理器是在ARMv4基础上设计的&#xff0c;随着ARMv7系列处理器大量应用&#xff0…

每天一杯羊奶,让身体更健康

每天一杯羊奶&#xff0c;让身体更健康 羊奶作为一种天然的健康饮品&#xff0c;越来越受到人们的关注和喜爱。它不仅口感醇厚&#xff0c;营养丰富&#xff0c;而且具有独特的保健功效。今天&#xff0c;小编羊大师带大家详细介绍一下每天喝一杯羊奶对身体的好处。 羊奶中的…

首发!全志T527第一款核心板,高性能8核处理器带AI NPU

今天&#xff0c;米尔电子联合战略合作伙伴全志科技&#xff0c;隆重发布第一款T527核心板及开发板。基于全志T527高性能可选AI功能MPU&#xff0c;配备八核A55高性能处理器&#xff0c;RISC-V协处理器&#xff0c;支持2Tops NPU&#xff0c;满足边缘智能AI加速应用&#xff1b…

“奶茶妹妹”章泽天被曝生双胞胎,偷拍照流出

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文|猴哥聊娱乐 编辑|侯欢庭 去年九月的某一天&#xff0c;一位网友在国外的一家商场偶遇了章泽天和刘强东…

QT5.14 实现ModbusTCP客户端 Demo

本文在QT5.14平台&#xff0c;基于QModbusClientTcp类&#xff0c;实现了客户端对单个寄存器的读写&#xff0c;用ModbusSlave做服务器做测试。 1.界面 (1)更改读按钮的名称为bt_Read (2)更改写按钮的名称为bt_Write 2.修改pro文件的第三行 greaterThan(QT_MAJOR_VERSION, 4)…

13. 强化学习编程实验1-在格子世界中寻宝(1)

文章目录 1.实验目的2.任务描述3.任务分析3.1 待求问题是多步决策问题否3.2 问题求解过程是一个马尔科夫决策过程3.3 状态空间S的确定3.4 动作空间A的确定3.5 状态转移概率P的确定3.6 立即回报R的确定3.7 折扣 γ \gamma γ的确定 4. 编程架构4.1 程序中有哪些对象和类4.2 环境…

网络摄像机的网络连接

网络摄像机的网络连接 1. 网络连接2. 网络直通线和网络交叉线的制作方法References 1. 网络连接 网络摄像机完成安装后&#xff0c;需要进行功能的配置及参数的设置&#xff0c;您可以通过浏览器进行相关功能的配置。 有线网络连接 左侧为通过网络直通线连接的示意图&#x…

注水算法—功率分配

最近一直在学习一位学姐的知乎文章&#xff0c;文章链接放到下面了。 无线通信多用户MISO系统的发射功率最小化问题 这里面涉及到了注水算法&#xff0c;为了学习的更明白&#xff0c;写这篇博客方便以后能快速记起&#xff0c;如果内容有问题的地方&#xff0c;欢迎在评论区…

ref hook之useRef

一、useRef useRef函数&#xff1a; 1.一个参数&#xff1a;默认值 2.返回一个固定的对象&#xff08;对象的地址是不会变化的&#xff09;&#xff0c;{current: 值} import React, { useState } from reactexport default function App() {const inpRef React.createRef(…

深入理解Vue3中的自定义指令

Vue3是一个流行的前端框架&#xff0c;它引入了许多新特性和改进&#xff0c;其中之一是自定义指令。自定义指令是一种强大的功能&#xff0c;可以让开发者在模板中直接操作 DOM 元素。本文将深入探讨 Vue3中的自定义指令&#xff0c;包括自定义指令的基本用法、生命周期钩子函…