代码编织梦想

最近在继续做性能优化,后续空下来尽量总结一些小的优化点分享出来。这些都不是大的优化,只是积少成多的改善。

看过我之前文章的朋友,知道我们优化的目标是,战斗60帧(不开后处理的情况下,千元机达到),影响每帧消耗的东西很多,除去美术效果的消耗,程序能完全控制的部分,就只有逻辑的实现了。

所以,对于一个16ms一帧的需求,能省一点是一点。在最近项目优化中,我们尽量优化逻辑部分的消耗,这次就着手优化了战斗的掉血飘字

掉血飘字示意

在最早做掉血飘字的时候,因为需求比较简单,我们就简单实用一个dotween来做了飘字的位移。随着需求逐渐变化,需要根据各种战斗伤害参数(暴击,血量,伤害类型等)来调整掉血飘字的淡入,移动,缩放,淡出等各种效果。逐渐演变成为需要多个Dotween来实现效果。

当同屏的怪物数量变多,一个飘字需要4~5个dotween,十几个怪,就会有50~100个的dotween。这时候,dotween本身,会有接近每帧 1ms 的性能消耗。且因为dotween内部的管理方式,会导致根据当前dotween的数量,每帧都有一定的内存分配(dotween会维护一个list,导致一些分配,几十到上百byte)。

优化思路其实很简单,就是不使用dotween,而只使用dotween的核心逻辑,即EaseManager.Evaluate。

将类似这样的用法(原代码片段示意):

    _currTextMesh.DOColor(_startColor, _fadeDuration);
    _dropText.transform.DOScale(_baojiScale, _scaleDuration);
    _dropText.transform.DOMoveY(_toY, _moveDuration);

改为这样的用法:

    float passedTime = time - startTime;
    float v = EaseManager.Evaluate(Ease.Linear, null, passedTime, _scaleDuration, 0, 0);
    float scaleValue = Mathf.Lerp(_scale, _toScale, v);
    _dropText.transform.localScale = new Vector3(scaleValue, scaleValue, scaleValue);

    float v = EaseManager.Evaluate(Ease.InBounce, null, passedTime, _moveDuration, 0, 0);
    Vector3 tempPos = _dropText.transform.position;
    tempPos.y = Mathf.Lerp(_pos.y, _toY, v);
    _dropText.transform.position = tempPos;

这里可以使用update每帧更新,或者使用Coroutine,更方便管理逻辑。

使用这种方式,代码没有原来的那么好理解,调用上也不够原来优雅简单。但是性能是能节省下来的,这1ms的节省,还是很可观的,且能减少dotween每帧的内存分配。

我们已经把战斗中用到dotween的大部分地方(掉血,掉金币等)改为这种方式。在安卓打包测试后,如果上面表述的战斗情况下(同时存在十几个掉血飘字,几十个dotween),每帧能节省1~2ms的调用。

严格意义上,这篇文章讲的并非优化了Dotween本身的性能,而是基于需求,优化了对Dotween的使用方式。在性能和代码可读性的取舍中,我们倾向于向一些可高内聚的小模块榨取性能,给一些需要更清晰逻辑维护的部分留出性能空间。

 

dotween unity 延时_十六:Unity Dotween使用优化,1ms优化-爱代码爱编程

最近在继续做性能优化,后续空下来尽量总结一些小的优化点分享出来。这些都不是大的优化,只是积少成多的改善。 看过我之前文章的朋友,知道我们优化的目标是,战斗60帧(不开后处理的情况下,千元机达到),影响每帧消耗的东西很多,除去美术效果的消耗,程序能完全控制的部分,就只有逻辑的实现了。 所以,对于一个16ms一帧的需求,能省一点是一点。在最近项目优化中

Unity搭配Kinect制作仿节奏光剑的游戏-爱代码爱编程

打算做一个仿照节奏光剑的游戏,先是花了一晚上找了找解决方案,有一个Openpose还有一个ThreeDPoseTracker,看了看配置好麻烦,而且都太吃配置了,我的1060还想多用几年,所以最后还是买了个Kinect 下面先探究下怎么去实现物体切割,用到了ezy-slice这个插件https://github.com/DavidArayan/ezy-s

UniTask使用笔记-爱代码爱编程

异步处理&同步处理 同步处理:简单说就是代码按顺序执行,在方法1里调用方法2时,要等到方法2执行完毕才接着执行方法1的代码。 异步处理:简单说就是在两个方法里的代码同时或者来回执行,在方法1里调用方法2时,不等方法2执行完就接着执行接下来的代码。 异步不等于多线程 异步处理不等于多线程,因为即使是单线程,也可以通过切换执行的代码来实现异步。典

【unity】归纳与面试准备(持续更新...)-爱代码爱编程

一 、算法 1. 冒泡排序 public class BubbleSort:ISort { public void sort(int[] arr) { for (int i = 0; i < arr.Length-1; i++) {

Unity 性能优化方法总结-爱代码爱编程

性能优化是游戏项目开发过程中一个永恒的话题。项目的性能优化主要围绕CPU、GPU和内存三大方面进行。但是如此的总结我感觉太繁杂不能成系统,例如:影响内存的主要三个部分1.资源内存占用;2.引擎模块自身内存占用;3.托管堆内存占用。你得资源和代码质量都会影响内存。这里主要从五个方面对项目进行优化,分别是资源内存,图形和GPU,编程和代码框架,项目中各种资

[翻译] Unity游戏优化实践-爱代码爱编程

优化你游戏开发的9种方式 帮助你发行游戏的Unity专家贴士 原文链接: Unity Games Optimization Best Practices v5​share.weiyun.com/5Unx7UR 本文翻译自Unity官方发行的电子书《Unity Game Optimization Best Practices》。本文主要介绍了使用

[Unity]Optimize Your Mobile Game Performance中文版-爱代码爱编程

写在最前,能力有限,翻了个大概,轻喷。有兴趣和能力的同学还是建议看英文原版。 原版链接 提取码:p9fu 注:标黄部分是由于能力有限,实在难翻,大家可以参考英文原文做一个理解。 顺便吐槽下:如果直接复制整个word文档在博客发布页,图片会一直卡在“正在上传中...”,只能一张一张去复制。 分析工具(Profiling ) Unity自带工具

Unity 工具 之 常用插件分类汇总(UI/VR/AR/建模/Shader/动画/网络/AI/资源/数据/区块链等)-爱代码爱编程

目录 一、 UI / 2D 相关 二、VR/AR 游戏的常用插件 三、模型构建/环境构建插件相关 四、Shader 相关插件  五、动画插件 六、网络/网络视频语音 插件 七、AI 相关 八、区块链相关 九、资源/数据相关插件 一、 UI / 2D 相关 1、Doozy UI Manager Doozy UI Manager

unity移动端游戏性能优化简谱之 以引擎模块为划分的cpu耗时调优_uwa的博客-爱代码爱编程

《Unity移动端游戏性能优化简谱》从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能检测工具确定和解决这些问题。内容包括了性能优化的基本逻辑、UWA性能检测工具和常见性能问题,希望能提供给Unity开发者更多高效的研发方法和实战经验。 今天向大家介绍文

unity 优化总结_和诺的博客-爱代码爱编程

性能优化是游戏项目开发过程中一个永恒的话题。项目的性能优化主要围绕CPU、GPU和内存三大方面进行。但是如此的总结我感觉太繁杂不能成系统,例如:影响内存的主要三个部分1.资源内存占用;2.引擎模块自身内存占用;3.托管堆内存占用。你得资源和代码质量都会影响内存。这里主要从五个方面对项目进行优化,分别是资源内存,图形和GPU,编程和代码框架,项目中各种资源组件的配置。 目录

lua字符串相关方法,如截取中文字符串_星际行走的博客-爱代码爱编程

string.sub(s, i, j) string.sub截取字符串,是按字节截取的。截取英文没问题,有中文就会出错,因为一个中文可能是2到5个字节。所以我们需要先获取字符的字节长度。  string.byte(s, i, j) 参数s为字符串,i为开始字符索引,j为结束字符索引解释:函数返回字符s[i], s[i+1], ···, s[j

redisson lock--分布式锁_萝卜啃土豆的博客-爱代码爱编程

流程 RedissonClient-(getLock)->RedissonLock-(lock)->tryAcquire-(同步转异步)->tryAcquireAsync-(最终调用)->tryLo

unity移动游戏优化指南_unity设置移动端帧率_an逞祥的博客-爱代码爱编程

目录 简介性能分析CPU Usage Profiler 模块 内存自适应性能编程和代码架构项目配置资源图形和GPU优化用户界面音频动画物理工作流程和协作 简介 优化 iOS 和 Android

istio envoyfilter+lua 简单实现动态路由转发_enovy lua-爱代码爱编程

公众号: 尹安灿 欢迎关注交流 因为种种原因,我们需要实现一个将服务名和subset携带在http请求的header里面,根据这个来实现将服务转发去特定的istio的服务的subset。 比如以下example

apisix的ext-爱代码爱编程

背景 项目上基于apisix-runner,我们自己写了一些插件,执行点为ext-plugin-pre-req,按照apisix的官方文档上我们知道ext-plugin-req 的执行顺序是在大多数 APISIX buil

openresty 快速入门_openresty/1.11.2.5-爱代码爱编程

一、OpenResty安装 OpenResty® - 中文官方站 1.下载安装包 wget https://openresty.org/download/openresty-1.11.2.5.tar.gz 2. 解压 tar -zxvf openresty-1.11.2.5.tar.gz 3. 安装 cd openresty-1.11.2.5