功能错误小结

最近做了福星转盘的功能,做完后发现当记录次数很多了以后会有性能问题,历史记录很多的时候,打开会卡。

第一反应

现象:当我看到优化需求的时候,“对历史记录做限制”,我第一反应,看下Profiler是什么,造成性能问题。看到是协程的调用。有出现高峰值,有高达200多M。在多次UI操作中,内存还是稳定增长。

处理:我估计是协程调用产生的,就在每个协程调用前加了StopCoroutine()方法。

问题:高峰值虽然降下来了,但是每次执行高峰值稳定增加20多M。而且最奇怪的是在于每次重启Unity后,还是会稳定出现这样的情况。

寻求主程指导(1)

现象:主程同样在看了Profiler后,给出建议是,用协程播放动画的效果改成用update执行。在处理以后,任然有内存高峰值出现。而且还是大于允许值6M。高峰值会有60多M,而且还会稳定增加。在关闭界面重新打开页面的时候,还是会特别卡。会有高达3.5G的GC。
指导建议:用协程播放动画的效果改成用update执行
处理:两次动画播放使用Update()处理。

问题:内存高峰值还存在,打开界面还是卡。这个阶段最大的问题在于认为是Unity有内存泄漏的bug。并没有想到是很多历史记录文字拼接带来的效率问题。

寻求主程指导(2)

现象:主程在看Profiler后,GameObject.Awake()有高达3.5G的GC。在看了UI界面制作的方式和对应功能配表上给出了优化意见,同时指出我对业务抽象处理不够。功能灵活性太差了。UI循序是UI策划那边排好的,我做的是获取组件有对应数据做出道具展示。有32个格子需要处理。完全可以抽象到给每一个格子处理。使用一个格子动态创建。还有所谓内外圈的效果,再抽象一层,业务逻辑就服务器根本不用管什么内外圈,根据权重比得到结果,再去看停留在内外圈的标志位值,扣除次数。
指导建议:对业务内容可以更抽象一层,UI界面创建,改用动态创建。实例化的格子太多造成卡顿。
处理:根据格子的属性不同,做不同的显示控制。动态创建。
问题:即使动态创建,还是有卡顿。关于动画的播放循序,不得不重新构思,主程给出建议是,完全可以有策划的配表实现,只要在表格设置Id循序就行。意识到是真正的问题是历史太长造成的卡顿。

历史记录的代码优化

代码如下

public void ShowRecord(RecordItem records,int recordTime)
{
  ViewLabel.text = TimeTools.GetUTCTime(recordTime)+"获得"+"\n";
  string temp;
  PropVo propVo;
  for(int i=0;i<records.Length;i++)
  {
    propVo = new PropVo(records[i].tid,records[i].num)
    temp  = ColorTools.GetColorByStage(propVo.stage)+propVo.getName()+"*"+records[i].num+" 积分"+records[i].integral+"\n"
    ViewLabel.text +=temp;//这句写的很有问题
  }
}

首先字符拼接会带来很多GC,在for循环中给UILabel赋值是反复赋值。特别是records很多的时候,会带来卡顿。代码优化如下

public void ShowRecord(RecordItem records,int recordTime)
{
  ViewLabel.text = string.format(GameDic.cfg_Sysetem_tips.getbyId(AlertDict.Tip_10086),TimeTools.GetUTCTime(recordTime)) +"\n";
  string temp,conetxt;
  PropVo propVo;
  for(int i=0;i<records.Length;i++)
  {
    propVo = new PropVo(records[i].tid,records[i].num)
    temp  =string.format(GameDic.cfg_Sysetem_tips.getbyId(AlertDict.Tip_10087,ColorTools.GetColorByStage(propVo.stage),propVo.getName(),records[i].num,records[i].integral)+"\n";
    conetxt +=temp;
  }
    ViewLabel.text = conetxt;

决解历史记录太长

现象: 在7次100连抽的后,会有UILabel的显示问题,“too Many Version on Panel”。UILabel展示范围超出去了。同时历史记录的,协议返回值的长度有8096字节。也就是需要找到合理的值。设计上是500条后,就把之前的全部删除,问题是每次抽取的长度并不固定。100次的长度肯能是18~26条之间。10次是5~
8之间。在系统策划商量后,决定为100条的长度,展示长度值小于100条。
处理:在Service给历史记录的List加值,然后再去判断长度,删除RemoveAt(0)。反复操作直到长度小于100.
问题:服务器返回协议最大值超出,服务器调整为90条。到这里性能的问题解了。

小结

这个优化的,最初觉得问题出现在动画上。结果方向还没有对。在尝试优化的基础上,反推发现,性能的问题并没有解决。从新思考造成问题的方向,确认问题所在,并给出了优化的方案。最终决解问题。
这个功能在开始做的时候,整个构思上,被策划需求所指引。并没有做到足够的抽象处理。造成面对策划需求变革的时候,不得不重新去更抽象理解整个业务内容。同时因为前期抽象不够,造成改动大架构的成本很高。服务器和客户端都要去改大量的代码。

### 回答1: 本章主要介绍了如何使用Python和一些常见的AI框架来构建一个简单的聊天机器人,包括: 1. 如何使用Python编写一个简单的聊天机器人,并且了解基本的自然语言处理技术; 2. 如何使用ChatterBot框架来实现一个基于规则的聊天机器人,可以根据预先定义好的规则进行回答; 3. 如何使用Seq2Seq模型来实现一个基于神经网络的聊天机器人,可以根据给定的问题生成相应的回答; 4. 如何使用Transformer模型来实现一个更加高级的聊天机器人,可以进行更加灵活和智能的对话。 通过本章的学习,读者可以了解到如何使用不同的AI技术来构建聊天机器人,并且能够根据不同的需求选择合适的技术来实现。 ### 回答2: 本章主要介绍了系统功能实现的相关内容。系统功能实现是指根据需求分析的结果,结合设计要求和技术要求,将系统功能进行具体的实现。在实现系统功能时,我们需要考虑以下几个方面。 首先,我们需要明确系统功能的实现目标。要清晰地了解需求分析的结果,明确功能的具体要求和实现的目标,以确保后续工作的顺利进行。 其次,我们需要选择合适的技术手段来实现系统功能。根据需求和设计要求,可以选择采用不同的开发技术和工具,如编程语言、开发框架等,来实现系统功能。同时,还可以采用模块化设计方法,对系统进行模块划分,利用模块化开发的方式来提高开发效率。 接着,我们需要编写代码来实现系统功能。根据需求和设计要求,我们可以使用选择的开发技术和工具编写代码,实现系统功能。在编写代码时,要注重代码的规范性和可读性,以方便后续的代码维护和更新。 最后,我们需要对系统功能进行测试和调试。通过对系统功能进行测试和调试,可以发现并修复系统中的问题和错误,确保系统功能的正确性和稳定性。同时,还可以进行性能测试,以验证系统功能性能是否满足需求。 综上所述,在系统功能实现过程中,我们需要明确目标、选择合适的技术手段、编写代码、进行测试和调试。通过这些步骤,可以有效地实现系统功能,并确保实现的功能符合需求和设计要求。 ### 回答3: 本章主要介绍了系统功能实现的相关内容。首先,系统功能实现是在需求分析阶段基础上的一项重要工作。通过对需求文档进行细化和拆解,将高层次需求转化为具体的功能模块,并对其进行分析和设计,以便于实现。 其次,系统功能实现需要具备相应的开发技术和工具。开发技术包括编程语言、框架、数据库等,选择合适的开发技术有利于提高系统的性能和可维护性。而工具则是辅助开发的软件,如IDE、调试器等,可以提高开发效率和质量。 另外,系统功能实现需要遵循一定的开发流程。常用的开发流程包括需求分析、设计、编码、测试、部署等环节。在每个环节,需要进行相应的工作,如需求分析中进行模块拆解和功能设计,编码阶段进行代码实现等。同时,还需要进行不同层次的测试,如单元测试、集成测试等,以保证系统的功能实现质量。 最后,系统功能实现还需要考虑到系统的可扩展性和可维护性。在设计和实现中,需要采用合适的架构和模式,以便于后期的功能扩展和维护。同时,还需要注重代码的规范和可读性,方便团队成员之间的合作和交流。 综上所述,系统功能实现是将需求转化为具体功能模块的过程,在开发技术和工具的支持下,按照一定的开发流程进行,注重系统的可扩展性和可维护性。通过系统功能实现,可以实现需求的预期效果,提高系统的性能和可用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值