技术分享连载(九十)

简介:

内存

Q1:我们发现刚进入游戏,Dalvik Heap的内存很高,导致PSS比较高,切到后台,再切回游戏,Dalvik Heap内存减少非常多。然后我尝试使用网上说的Android调用GC的方式,System.GC,结合runFinalization。调用Runtime.getRuntime().gc(),都无法有效减少,不知道这块是否有办法有效调用一次?

我们查到原因了,是因为我们在Android层写了一个splash,但这个splash是png的,分辨率是1920x1080,我们之前是
int splash_bg = getResources().getIdentifier(bgName, “drawable”, getPackageName());
m_BgView.setBackgroundResource(splash_bg);

这张图片在HideSplash会被处于游离状态,要等Java的GC调用后,才会回收,但实际图片按道理内存也不该涨100MB左右,我们用测试工程只有Splash和SplashVideo,发现内存并不会增长那么多,代码一模一样。后面只能解释,可能JVM后某种内存分配算法造成的,当本来比较低的情况,分配会比较少,当到达一定数量级,再分配,就会分配更大一块内存(对Android底层机制不熟)

后面我们改为先从getResources里获得BITMAP,然后给ImageView,再HideSplash时候,调用Bitmap的手动释放方法。

该问题来自UWA问答社区,感谢题主在解决后将其方法分享公开,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a2a04c27030070236a983f5


制作

Q2:我有一个MeshRenderer,它拥有两个材质,现在我想给其设置一个不同的MaterialPropertyBlocks,但据我所知,目前还没有能实现这样的办法,因为当我从Renderer中得到MaterialPropertyBlock后,我是不能指定它还能应用于某个材质了是吧?不知道大家有没有好的解决方法呢?

是的,MaterialPropertyBlocks是以MeshRenderer为单位的,而不是以Material为单位的。只能建议题主对Mesh进行拆分,确保每个Renderer上只挂一个Material。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a263f54d99fdb2b3c628873


性能

最近项目从Unity 4 升级到Unity 5或Unity 2017时,在中低端Android机上,帧率降了10多帧,用Adreno Profiler上查了是GPU Bound。

我们游戏对帧率要求比较高, 游戏的时候必须满帧运行, 所以这个问题很明显。经过折腾,最后查出来是Unity 5 之后, 默认开启了Blit, 分辨率越高,GPU压力越大。 尤其在中低端机上,我用的是Adreno 405测试的, Unity 4能满帧, 但Unity 5或者Unity 2017最高才45左右, 简直不能忍。幸运的是,Unity 2017.2,官方终于开放了设置能禁止Blit. 但是Unity 5就没这个运气了, 根据官方的消息,他们暂时还没有计划把这个引入Unity 5.6,
具体帖子可见:https://forum.unity.com/threads/big-performance-issue-with-unity5-on-android.338847

在发现和解决问题的过程中,钱康来同学提供了不少帮助,在此感谢!开这个问题也是让大家知道下,免得像我当初摸石头过河,花太多时间折腾。

该问题来自UWA问答社区,感谢题主的无私分享,建议使用Unity 2017 或者Unity 5 版本的开发者密切注意!如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a282669a670486845f8a03d


内存

Q3:这个[Triggers RebuildInternalState]是隐藏物体就一定会触发的吗?我看Profiler里最后一列都有提示Warning,感觉挺重要的一个错误。这个要怎么去避免呢,是否会导致Animator.Initialize耗时又变得很明显(在之前有做过缓存的情况下)
请输入图片描述

这个是含有Animation组件的GameObject被Deactive时的引擎Warning,在很多情况下确实会造成较高的CPU耗时。对此,建议题主尝试在GameObject不再需要使用时,直接将其移出屏幕外,并将其挂载的Component进行Disable,而非将其GameObject进行Deactive,这样可以RebuildInternalState的发生。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a2a62cdff95f1253a1b365e


Unreal 4 渲染

Q4:你好 我看了UWA关于Unreal全局光照的那篇文章,有几点疑问想问下:
1、Unity的Lightmap烘焙时,为什么不能从Normal map获取Normal信息呢?我看Unreal的Lightmass也是烘焙出两张图,一张方向一张颜色。它的颜色可以受NormalMap的影响吗?
2、Unreal的一个场景多张Lightmap,例如白天到晚上,渐变是怎么融合的呢?

1、Lightmap中的Directional信息是指烘焙光照的方向信息。在Lightmap中一张是记录光照的Intensity,一张是记录Direcitonal,这个Directional是用来参与Shading中方向相关计算的,例如:高光计算、与normal计算等。如果是纯Dffuse材质也不用Normalmap,这个Directional信息可以去掉,减少存储和计算量。通常在材质中看到的Normalmap指的是Mesh的Normal与Lightmap中记录的Directional并不是同一个值。

2、Unreal中的Precomputed Lighting Scenarios是保存了多套Lightmap以及光照设置,只能做到配合光照进行Lightmap切换,融合现在貌似还做不到。

Q5:烘焙的时候光照的Intensity考虑Normal就类似beast那样,Lightmass烘焙的时候可以提供Normalmap吗?

我是这样理解的:Unity烘焙的时候用了辐射度,也就是先把模型分成块,然后计算快与块之间的反射,不会使用Normalmap。Normalmap提供的是细节的信息,全局光照中间接光的计算结果相对比较低频,比较平滑,加入高频的信息不一定会有好的效果。Unreal 4的lightmass可以有一个选项设置Static类型的光源在烘焙的时候使用normal map,其设在project settings->engine rendering->lighting中。






原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
SQL 分布式计算 运维
相约在冬季实战营——第五期学习报告
https://developer.aliyun.com/adc/series/wintercamplist5 这一期的实验场景主要和阿里云的大数据相关产品相关~~~
321 1
相约在冬季实战营——第五期学习报告
|
Kubernetes 监控 Docker
冬季实战营第四期学习报告
通过本期学期,掌握了容器的基本技术
75 0
|
Web App开发 弹性计算 Kubernetes
学习报告:冬季实战营第四期
在《冬季实战营第四期:零基础容器技术实战》的学习报告
160 0
学习报告:冬季实战营第四期
|
SQL 弹性计算 关系型数据库
第三期学习报告
部署博客及数据库相关基础知识加固
129 1
|
弹性计算 关系型数据库 MySQL
相约在冬季实战营——第三期学习报告
冬季实战营,关于ecs上的mysql相关操作、RDS操作~~~
495 3
相约在冬季实战营——第三期学习报告
|
开发者 云栖大会 数据库
30+云栖演讲稿实录 & 70+PPT资料下载持续更新中,错过再等一年!
2019年9月25日-27日,杭州云栖大会圆满举办。大会包含130+场峰会和专场、上千位重量级分享嘉宾以及硬核科技大型展区。开发者社区搜集全站云栖资料与大咖演讲实录,为你带来一年仅此一次的丰富云栖干货!
13301 0
|
算法
学习之道。 文/江湖一剑客
文/江湖一剑客 活到老,学到老。 Stay Foolish, Stay Hungry. 为什么要学习? 终生学习,无疑是整个人类得以存在和发展的根基。
1178 0
|
API 图形学 iOS开发

热门文章

最新文章