unity崩溃解决办法-unity导致电脑系统崩溃
1.Unity关于性能方面的问题
2.虚拟机 是什么东西?
3.ue5导入玛雅模型崩溃是什么情况
4.那些女程序员,她们都有什么共同特点?
5.诡异,Unity在安卓运行崩溃问题,求助
Unity关于性能方面的问题
1、硬件支持优化
(1)平台设置优化
减少FPS,在ProjectSetting-> Quality中的
VSync Count 参数会影响你的FPS,EveryVBlank相当于FPS=60,EverySecondVBlank = 30;
这两种情况都不符合游戏的FPS的话,我们需要手动调整FPS,首先关闭垂直同步这个功能,然后在代码的Awake方法里手动设置
FPS(Application.targetFrameRate = 45;)
降低FPS的好处:
1)省电,减少手机发热的情况;
2)能都稳定游戏FPS,减少出现卡顿的情况。
当我们设置了FPS后,再调整下Fixed timestep这个参数,
这个参数在ProjectSetting->Time中,目的是减少物理计算的次数,来提高游戏性能。
(2)文件格式优化
1)Android?更新不透明贴图的压缩格式为ETC 4bit,因为Android市场的手机中的GPU有多种,每家的GPU支持不同的压缩格式,但他们都兼容ETC格式。iOS上尽量使用PVRTC。
2)对于透明贴图,我们只能选择RGBA 16bit 或者RGBA 32bit。
3)图集大小最好不要高于,否则游戏安装之后、低端机直接崩溃、原因是手机系统版本低于2.2、超过1000的图集无法读取、导致。2.2 以上没有遇见这个情况。注意手机的RAM 与 ROM、小于 512M的手机、直接放弃机型适配。
(3)Unity功能使用优化建议
Unity屏幕特效、动态的pixel光照计算(如法线)、实时的阴影,能找到替代方案就找替代方案。
2、渲染优化
(1)模型设置优化
1)合并材质球unity 3d中每倒入一次模型就多一个材质球,可我的这些模型都是共用一张贴图的就想共用一个材质球,所以每次都要删除再附上,很麻烦。怎么才能合并这些材质球?用TexturePacking吧
1、遍历gameobject,取出material,并根据shader来将material分类
2、调用Unity自带的PackTextures函数来合并每个shader分类中的material所对应的textures(PackTextures函数有缺陷,不过可以将就用)
3、根据合并的大的texture来更新原有模型的texture、material已经uv坐标值。
需要注意的是:需要合并的纹理应该是物体在场景中距离相近的,如果物体在场景中的距离较远,
则不建议合并纹理,因为这样做很有可能非但起不到优化的作用,反而降低了运行效率。?
2)mesh合并?分为2种方式合并
1.自带的合并必须勾选静态。
? 2. 脚本合并
优化建议(1)角色材质数2-3个 最多不要超过5个。可以取2+3模式,2为主 3位。(2)骨骼数量最好控制在30
(3)面片数量根据实际需求做一定删减。比较低的控制在2000以下。
(4)静态物件不需要添加Animation Component
(5)UV值范围尽量不要超过(0, 1)区间
(6)地形长宽均尽量小于257。这是因为地形太大,会造成大量顶点数据,给你的内存带宽造成一定的影响,在目前的ios设备中,内存带宽是非常有限的,需要尽量节省。同时,如果用Unity自带的地形,一定也要使用Occlusion Culling,因为Unity的刷地形工具虽然方便,但却是framekiller,刷过之后,你会发现drawcall增加的非常多。混合纹理数量不要超过4。地形的混合操作是很耗时的,应该尽量避免。能合并的纹理尽量合并。(2)渲染批次优化
3、代码编程优化
虚拟机 是什么东西?
网上时常有人问虚拟机方面的问题,虚拟机以其近乎神奇的作用,在如今被广泛应用在各个方面,可以说电脑能干什么,虚拟机也能干什么(不包括专业级的应用,如专业影像处理、3d设计等)。其中以VMware Workstation虚拟机为首。
虚拟机如此强大,但因为其应用需要一定的知识,一般人想用,而一时无法上手,给人以神秘的感觉,其实虚拟机不仅是专业人士的好工具,一般人也可以使用它的一些简单的功能,要想一下将虚拟机说清楚,很难!!!网上诸多关于虚拟机的介绍,专业词汇过多,让一般人一时看不太懂,以下用浅显简单的语言文字淡下虚拟机的一些让一般人为之心动的简单的功能,有点啰嗦,纯粹经验之谈,高手可略过(以下介绍中的“虚拟机”默认指安装在xp系统下的VMware Workstation虚拟机程序),本文并非教程,只是让一般人能初步了解虚拟机的一篇介绍,了解虚拟机的神奇、了解虚拟机的强大,勾起你的兴趣,之后再去学习具体的用法,网上诸多关于虚拟机的教程,并且本文还有一些使用经验,都是在网上经常看到有人提问的。
虚拟机是什么?有什么用?
虚拟机是一个程序,它模拟了一套虚拟的电脑硬件。安装后系统中等于多了一套虚拟的电脑,在虚拟机中可建立一套硬件设置方案(设置几个硬盘、光驱、网卡、多大内存、几核CPU)。这方案也叫做虚拟机。
虚拟机的学习功能:
我们可建立win98虚拟机、xp虚拟机、2003虚拟机、win7虚拟机、win8虚拟机、Linux虚拟机、还可装苹果电脑系统(安装较复杂且性能不怎么样)。之后通过光驱、虚拟光驱、设置镜像路径等手段加载系统光盘镜像。将各种系统安装在各个设置方案中(虚拟机),这样各个设置方案就相当于一台安装了系统的电脑。
我们可以在不动实机(真实电脑)的前提下,使用各种系统,也即我们可在实机是xp或win7系统的前提下,通过虚拟机运行win98老程序或Linux系统,或者可以免除反复开关机学习系统怎样安装。
现在流行的系统封装,大部分是在虚拟机下的进行的,相当大程度保持系统纯净,你用实机的话,除非C盘之外的其它盘是空的。否则经过长时间使用,每个人或多或少会存些文件,这些文件中也许就有污染在其中(恶意程序、捆绑程序、木马、)。现在流行的pe系统,大部分也是在虚拟机下进行测试的。
有些人爱装各种软件(本人),有时遇上有污染在其中的软件,或有缺陷的程序,很容易弄坏系统(系统还原多了也烦),这时在虚拟机下装个相同系统,测试试用一下,会很安全方便的。
有些程序要在特殊环境下运行,如在win98下才能安装或只支持win7(兼容性设置不是万能的),甚至要在Linux系统、苹果系统下运行,这时虚拟机便又可大显身手。
因此虚拟机常用来学习各种系统应用,运行特殊程序及应用。
虚拟机的网络功能:
虚拟机下的系统可以通过虚拟网卡的设置,与实机一样自由上网,好比一立电脑。虚拟网卡的设置一般用“桥接”即可。(某些杀毒软件及防火墙软件会限制虚拟机上网,如“ESET”)。
虚拟机还有强大完善的网络功能,例如实机运行xp,同时开一个win7、2003、Linux(实机电脑配置要较好),通过路由上网(拔号也行),这四个系统也就和其它连接这个路由的电脑组成了一个局域网,(网络要设置好),能互访。甚至可用2003、Linux建立一个局域网私人网站,局域网中其它人可登录这个网站。有固定IP地址的话可将这个私人网站连到英特网中,网上许多网站其实就是在虚拟机中的,优点很明显,一台高端服务器,本来只用来支持一个网站(多了很复杂),性能浪费了大半,而通过虚拟机,一台高端服务器里可同时建立几个网站,各自在各自的系统中运行(2003、Linux),节省大量成本,不会冲突干扰,维护方便。
现在VMware Workstation系列产品还有一种虚拟桌面技术:一台高端服务器通过虚拟机建立一个系统环境,通过网络,其它人可在只有显示器及键盘、鼠标的情况下,登录运行服务器建立的系统。日常办公一切与独立电脑无异。一个办公区可以节省大量。维护也方便,比网吧无盘还省。
现在许多人用虚拟机玩游戏,可以绕开游戏限制,达到多开目的,不过有些游戏会限制在虚拟机内运行,另外一些大型3D游戏在虚拟机中也运行不流畅(只可混时间)。这是因为虚拟机虚拟的显卡性能不高。目前7.0版之后的VMware Workstation有所改善,通过安装虚拟机配套的VMware-Tools镜像中的驱动,可以流畅运行CF之类3D游戏。(多开后流畅会降低)
用虚拟机还可安装软路由软件,建立一台高性能虚拟路由。一般的家用路由,功能单一,性能不高。高端路由都是几千上万的,而软件路由可达到相当于高端路由的性能及功能,用一台普通电脑建立就能达到高端路由的性能及功能。用现在的中低端双核电脑完全可以运行一台虚拟软路由,并支持几个个人网站运行,如果添上交换机,可以带上百台电脑,组成一个高性能局域网络(大型办公网,网吧)。当然要达到这种程度,要一定的技术水平,但这起码让我们有可能通过组建一个小型局域网络,来廉价学习体验高性能局域网络的知识。
因此虚拟机常用来学习网站构建,网络构建,甚至虚拟办公网、网吧构建。
虚拟机的安全性、通用性:
虚拟机下的各系统间及与实机系统间相互是独立的,在不建立相互交流数据的前提下,虚拟机下的某一系统哪怕中毒崩溃,也不会影响其它系统及实机系统。因此许多木马是在虚拟机下编写及测试的。虚拟机的安全性毋用置疑。
虚拟机相当于一台通用上网本电脑,它装在不同配置电脑上所虚拟的电脑硬件是一样的。你可以安装设置好一个稳定的系统,之后备份虚拟硬盘,这个虚拟硬盘文件可直接在不同配置电脑上运行(VMware Workstation虚拟机版本应相同)
这样便产生了一种应用:VMware Workstation虚拟机有一种打包功能,可以将一台己装好系统且系统已配置好安装好了必要应用程序的虚拟机打包成一个EXE程序,这个程序可在其它电脑上安装展开后可直接运行己装好的系统。
官方说明中这主要在一些大公司或有特殊需要的地方,无法或不允许外来电脑接入本地网络的情况下(为了安全),你可以通过大公司或有特殊需要的地方提供的其特制的虚拟机打包EXE程序安装展开后连入当地网络中。
这功能其时我们一般人也很有用。但有些绿色版虚拟机(精简破*解过的)无法打包。经过测试(本人用精简破*解绿色版虚拟机),发现其实只要保留己装好系统的虚拟硬盘文件,其它电脑上装上相同版本的VMware Workstation虚拟机,挂上保留此虚拟硬盘文件,一样可以直接运行己装好的系统。不过这功能对我们有什么用呢?
现在的网络充满各种无孔不入的污染,一台电脑使用一段时间会变慢,可能还有几个木马在你系统中潜伏,安全软件装了一堆,使电脑更慢了,还无法保证安全。怎么办用虚拟机!!!只要备份好虚拟硬盘文件,就可以在虚拟机的己装好系统中无顾忌的上网,上一些有危险的网站,不必装任何杀毒安全软件,不必装任何更新补丁。虚拟机中的系统有问题,直接删除虚拟硬盘文件,换上备份的虚拟硬盘文件,又回到干净系统状态。
你可以在实机装杀毒安全软件装更新补丁,实机只使用炒股,网购之类需保密的少量应用。有危险的或无须保密的上网在虚拟机系统中使用,这样减少在实机下的应用,使实机相对干净些。用得更久些。而大量日常工作在虚拟机中运行,自由又安全。或者将需保密的应用在虚拟机系统中使用,实机上的风险也是不能影响虚拟机的(将虚拟硬盘文件删除除外),实机系统重装后装上原来的VMware Workstation虚拟机版本程序就可以了。
总结一下:
1、将普通及危险应用转移到虚拟机系统中,使实机污染减少。
2、将用过的虚拟硬盘文件保留,实机更换系统后(XP→win7),再装虚拟机建立一个新的设置方案(虚拟机)之后将老的虚拟硬盘文件挂载,使用原虚拟机系统。也可以将虚拟硬盘文件拷到其它电脑中使用。
使用注意............:
一、VMware Workstation虚拟机版本改变后,原先的设置方案(虚拟机)不一定能用。而且虚拟硬盘文件也有可能不能用(一般兼容)。
虚拟机版本的不同有:
1、官方发行的各版本,
2、XP版、win7版之类。
3、64位版、32位版之类。
二、虚拟机系统在使用后,其虚拟硬盘文件会只会变大,不会变小。例如:刚装时虚拟硬盘文件有2G,之后在虚拟机系统中看了PPS、PPTV,又下了一些东西。这时虚拟硬盘文件有4G。在虚拟机系统中删除大量文件。虚拟硬盘文件还会有4G,虚拟硬盘文件会保持最大状态,因此建议:再建立一个虚拟硬盘,一个只用来存放各种软件缓存及下载文件的存储盘(原虚拟硬盘文件装有系统叫系统盘吧)。这样存储盘因为使用而变得太大了,只要更换存储盘即可,存储盘可随时更换对系统盘不影响,另外系统盘最好分两个区C、D。很多封装GHOST系统会用到D盘。
三、虚拟机系统的安全性是在不建立相互交流数据的前提下。也即你不把虚拟机系统中下的文件拷到实机系统中,就不会因虚拟机系统中毒而影响实机系统。
虚拟机下的各系统间及与实机系统间建立相互数据交流的方法:
1、用U盘转移:开通虚拟机USB功能后,鼠标点在虚拟机系统中,实机插上U盘,虚拟机系统能检测到U盘,将数据通过U盘传递。
2、网络互联:将虚拟机系统与实机建立网络互联,无需实际的网络,单机通过网卡也可建立网络互联。(方法我博客中有)。另外虚拟机系统加入实际的网络中。也可与网络中各电脑交流。
3、宿主化(UNITY)功能:7.0版之后的VMware Workstation虚拟机,在(查看)项中有宿主化(UNITY)项,在虚拟机下的系统安装了VMware-Tools后,并开启了虚拟机后台服务的前提下,打开宿主化(UNITY)项,虚拟机下的系统会全屏叠加到实机系统上,可互访,
4、通过添加“VMware拖放剪切支持组件”实现互访,(据说行,本人用精简破*解绿色版虚拟机未成功过).
四、虚拟机系统的性能与实机性能成正比,你的应用越复杂,同时开启的虚拟机越多,对实机硬件配置越高。尤其是内存占用,每台虚拟机都有个内存占用设置,xp一般大于256M、win7一般大于512M等等。32位系统只认3G多存。除去实机系统要保留部分内存。所以一般情况下我们只能开不到五台。再多就会很卡了。实测一般1G内存的上网本里开一台虚拟机,可正常日常办公应用。
五、正式完全版的VMware Workstation虚拟机安装程序达几百兆之多,且安装时间很长,对系统影响很大(更改多)。有许多人在安装这步出现问题,导致系统都出现了问题,因些建议一般用户可先用用“精简破*解绿色版虚拟机”,免费、免安装、大部分功能都有、体积小、易用、安装卸载方便、不影响系统。有了经验后再尝试正式完全版。
六、安装VMware-Tools(工具):是VMware Workstation虚拟机专用的驱动及管理程序,一般“精简破*解绿色版”虚拟机都只会附带WINDOS系列系统的VMware-Tools(工具)。Linux系列系统的VMware-Tools工具需要另找。安装好虚拟机中的系统后,再安装VMware-Tools工具,虚拟机中的系统使装好了所有驱动,同时一些虚拟机的功能也打开了。虚拟机中的系统性能也会提高很多。
ue5导入玛雅模型崩溃是什么情况
UE4/UE5的崩溃,卡死等问题处理
quabqi
UE4/UE5 游戏开发
来自专栏手摇虚幻引擎
虚幻引擎的业务逻辑开发基本上都是用C++/蓝图,当因为项目代码写的不好遇到Crash等问题时,如果不了解Native程序和引擎底层的一些机制,相比用C#开发业务的Unity或其他完全基于脚本虚拟机的游戏确实要难处理一些。因为业务和引擎代码本身都是基于C++,所以对于解决常规C++的Crash的方法虚幻引擎完全适用,除此外引擎在异常处理上相比于普通的C++程序还是提供了一些额外的方法和工具。本文主要介绍虚幻引擎在处理Crash时的一些做法和经验技巧。
常规崩溃定位
当游戏崩溃时,对于开发来说肯定是希望能定位到哪行代码崩了,发生崩溃当时的内存是什么样的,在虚幻引擎里这个工作是引擎自动做的。引擎会将崩溃的dump文件保存在Sed/Crashes/下面,编辑器的位置如下图
运行时的游戏包的位置也类似,PC版就是在游戏目录,安卓在Android/data/(游戏包名)/下面,iOS就在对应的Documents目录下。当有多次崩溃时,可以自己按照修改日期排序,找最新的即可
打开后可以看到有这么多信息。
dmp文件:这个文件崩溃的dump信息,可以把这个文件直接拖到visual studio里,就会自动跳到崩溃现场的那一行代码上。
log文件:这个文件就是崩溃时的log信息,可以根据打出的日志做一些崩溃判断。比如在崩溃之前做了哪些关键操作。
runtime-xml文件:这个文件用文本记录了崩溃时的现场,包括堆栈,崩溃的代码等,本质上和dmp文件差不多,因为dmp是二进制文件并不可读,在手上没有符号文件时,这个文件可以用于分析崩溃。如下图可以看到
了解了引擎的这一个功能,基本上80%的崩溃都可以定位出来。像是最常见的Signal 11,靠这个就初步能查到现场是哪里。
卡死检测
有时候我们很难根据崩溃的现场查到是什么原因崩溃的想在一些关键位置输出堆栈或内存等信息。或者不一定是崩溃,而是死循环卡死了,那么肯定不会有上面这样的dump信息输出。引擎接入了Lua或其他脚本语言,想在脚本出异常时,肯定也有想要顺便输出一下C++堆栈的情况。因此肯定还是希望能够自己有一些办法在代码里主动输出当前的堆栈。引擎也提供了这样的方法,可以见StackWalk类:
这里有一系列的函数,比如可以通过StackWalkAndDump函数将当前的堆栈输出到字符串里。当然如果不是GameThread,这个类也提供了dump指定线程的堆栈。比如lua脚本里的代码崩溃了,但因为lua的崩溃有一个通用函数兜底,C++肯定不会直接崩,我们这时就可以手动调用这样的函数,将C++的堆栈写到log里。
对于业务卡死,虚幻引擎也封装了一个单独的守护线程ThreadHeartBeat,当检测到某个线程的心跳超时时,内部也是调用上面的函数将卡死的线程堆栈输出到log里,如下图。
当然自己的业务也可以仿照上面的做法封装。这个功能默认是关闭的,毕竟有额外线程的开销,需要项目自己根据情况把USE_HANG_DETECTION宏打开。
内存随机崩溃或泄漏
内存写坏,程序随机崩溃的这个问题,我想应该是大多数项目最苦恼的问题了。其实虚幻底层也对解决这些问题提供了一些定位的代码。因为本身是内存问题,因此这些工具代码也是在内存上下功夫的。
我们知道虚幻本身有在全局重载C++的new和delete,在业务分配和释放内存时,实际调用的是引擎的FMemory类中的Malloc和Free。而引擎会根据情况从内存池去获取内存。而内存池本身的内存,是引擎根据时机去向系统要内存。如果你用过引擎的LLM统计内存,应该就知道LLM有两个Tracker,Default和Platform,这两个口径也就对应业务向引擎要内存和引擎向操作系统要内存这两种情况。
这张来源于网络,如侵权请告知删除
其中LLM Default和LLM Platform就如下图所示的关系。我们平常一直说UE4/UE5的项目不要使用STL也是因为这个机制。因为STL内部有自己的allocator,在没有指定allocator时所有的内存分配都不受引擎管理,而且因为STL本身只有头文件,即使明显指定了allocator,在跨dll使用时也可能因为疏忽造成一些内存问题。
这里重点是FMemory内部可以使用多种分配器,且有的分配器是可以嵌套的,对于上层业务来说无感知的,引擎默认一般会使用Binned2或Binned3,内部会按照size做内存池,而内存池不够时,每次向系统申请的都是固定大小的Chunk。因为本文重点不是讲内存管理以及LLM,就不过多展开了。
为了查内存写坏的问题,就需要在这里打开一些特殊的分配器。最常用的就是下面几个:
Ansi:这个是标准的分配器,也就是让UE4不使用任何额外的内存管理,就直接走平台原生的new和delete,有时候需要用到平台的一些内存工具,开到这个模式会非常好。比如在iOS平台上需要查内存泄漏问题,如果使用默认的Binned2/Binned3,那么用Xcode自带的Instruments肯定查不到泄漏的具体代码在哪,看到的都是内存池在申请,而开到Ansi就可以定位到内存泄漏的现场。
Stomp:这是引擎提供的查内存写坏的利器,一般开了这个模式,崩溃时的第一现场就是内存写坏的代码位置。具体原理是利用了操作系统的虚拟地址这个概念,我们知道向系统要内存时,拿到的指针其实只是一个虚拟地址,真正是否分配了物理内存是会根据情况来决定的。可以看下图注释,能解决这几种问题:
那些女程序员,她们都有什么共同特点?
女程序员共同的特点是喜欢解决问题,懂得去思考、去总结经验,并且她们对自己很有信心,工作的时候很有,这是大多优秀的程序员具备的特质。
女程序员喜欢解决难题,因为她们觉得一个问题一定能找得到答案。构建应用程序不是一个简单的过程。代码不编译的原因到底是什么,为什么为出现bug,在开发的过程中会出现很多问题吗,应该如何去解决,这些都是有技巧的。在压力的作用下解决问题更能提升自己的能力,不过这对心理素质是一种考验。如果系统崩溃了,你可以向管理人员寻求帮助,在你解决问题的时候,让你稍微歇息一下。
女程序员对自己很有信心,她们相信自己一定能够解决问题。 建立一个系统的方法有很多种,不管你的想法有多完美,如果你不把想法变现,它们就不会有价值。最好的女程序员对她们的想法有信心,并在设计讨论中发言,以帮助构建应用程序架构。如果你想当一个优秀的女程序员,那你可以选择增强你的自信,从一个小建议开始,而不是提出整个应用程序重新设计。
女程序员非常喜欢自己的工作,如果她们不喜欢这份工作,就无法成为这个行业中的顶尖高手。女程序员的并不是只体现在编程一个方面 —— 在工作、所使用的技术、老板、项目等方面都有,这才是优秀的女程序员。
诡异,Unity在安卓运行崩溃问题,求助
在整个开发阶段和测试阶段,出现了很多预料之外的事情,比如size是1M多的json文件解析、导致OOM、莫名其妙的崩溃等。这些意外无一不影响开发,增大压力,最直接的表现是晚上加班和周末加班。 写代码和修改代码远比想象中的难控制。用户体验增加了代码的细节处理难度、逻辑处理难度,android莫名的崩溃增加解决bug的难度。就这次开发,总结了一些经验。 测试人员经常会报告小米1手机运行壁纸软件时会崩溃的问题,崩溃日志是: ja.lang.RuntimeException: Failed to register input channel. Check logs for details. at android.view.InputQueue.nativeRegisterInputChannel(Native Method) at android.view.InputQueue.registerInputChannel(InputQueue.ja:92) at android.view.ViewRoot.setView(ViewRoot.ja:570) at android.view.WindowManagerImpl.addView(WindowManagerImpl.ja:177) at android.view.WindowManagerImpl.addView(WindowManagerImpl.ja:91) at android.widget.Toast$TN.handleShow(Toast.ja:411) at android.widget.Toast$TN$1.run(Toast.ja:337) at android.os.Handler.handleCallback(Handler.ja:587) at android.os.Handler.dispatchMessage(Handler.ja:92) at android.os.Looper.loop(Looper.ja:130) 根据日志推测该崩溃是和Toast有关。可是问题就奇怪了,我在代码中只调用Toast.makeTest(...).show(),为什么会引起这个崩溃。然后根据测试人员的反馈,当设置壁纸成功后,会引起这个崩溃,而且测试人员是在频繁的操作下报出来这个问题的。根据这个现象,推断有可能以下两个原因引起的,一是,设置壁纸引起桌面发生变化,桌面发生变化时弹出toast会导致崩溃;二是,频繁不间断的弹出toast会引起这个问题。而之后测试人员反馈了一个新的现象,当进行新浪微博分享失败后(前提是该新浪微博帐号是有问题的),再去浏览壁纸也导致了该崩溃,而且此现象仅出现了一次再也不复现。该bug最终是遗留解决。 针对这种问题,在以后的版本开发中肯定也会出现,怎么避免它再次出现。我总结了从几个方面做努力。先借来小米1手机来玩,学习手机发烧友的习惯和测试人员的思维,然后体验小米1手机,对小米1要有更深入的认识;和小米进行沟通,还没有认识牛逼的朋友在小米做开发,所以可以先在小米论坛上做活跃用户,主动和对方和网友沟通;了解input channel是什么功能,什么机制,研究 anroid2.3的关于这块的native代码。 刚开始进入测试阶段时,测试人员每天都会报告壁纸软件频繁崩溃的问题。对于一些简单的崩溃问题,一般是空指针而且还复现,就不在这里说了。测试报告说,浏览壁纸保存壁纸,预览壁纸和设置壁纸时经常的崩溃,这种崩溃没有规律可复现但是很频繁出现。这种问题的原因是OOM,比如,在MX2手机上,桌面预览要使用的位图大小是1280 X 800 X 2 X 4字节 约等于8M,软件中的位图各种处理(缩放、剪切、渲染、多个activity同时存在等)会导致内存使用量飙升到50多M,当超过64M左右时,软件会报OOM错误。没有彻底解决OOM的方法,网上有很多避免OOM的方法,比如延迟加载、及时回收内存、弱引用等。另外在生成bitmap的地方要使用try 解决了这些崩溃问题后,还会有新的导致崩溃的原因。测试人员说中午吃完饭回来,打开壁纸软件突然崩溃。分析这个现象后,找到原因是,长期待机情况下android杀掉了壁纸软件的进程。但是疑问出现了,此时进程被杀掉了之后点击的icon,不是又重新打开了进程,重新运行了吗,怎么会崩溃呢。经过分析,发现有个诡异的地方是,android待机后把壁纸进程给杀掉了,但是该软件的activity并没有从task中删除掉,所以当再点击的icon时,会执行task顶层的activity的onCreate,而onCreate里边的一些东西还未初始化,会因为空指针而崩溃。 后来,测试人员报告了一个诡异的bug,安装软件后第一次打开软件,欢迎界面的显示不出来,以后每次打开软件欢迎界面的都能打开出来。是一个jpg文件,在raw中。最后找到原因是,在decode bitmap,scale bitmap时,其中要操作的一个变量imagewidth在第一次时是0,没有赋值,之后再操作就不是0,赋值了。但是为什么会这样,最后找到原因了,imagewidth是一个全局静态变量,该全局静态变量在另外一个线程中会被赋值(赋上屏幕的宽度)。由于线程的异步问题而导致第一次imagewidth是0。后来每次打开软件,并不是进程重启,而是activity重启,imagewidth赋的值还在。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。