技术分享连载(九十)

简介:

内存

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
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
算法 安全 Unix
翁恺C语言程序设计网课笔记合集
学习自翁恺C语言程序设计网课。
1107 1
翁恺C语言程序设计网课笔记合集
|
Web App开发 Dart 搜索推荐
手把手教你获得CSDN徽章:CSDN IT冷知识 每日一练(二)
手把手教你获得CSDN徽章:CSDN IT冷知识 每日一练
308 0
CSDN竞赛第六期第二题(C++)
鬼画符门,每年都会统计自己宗门鬼画符消耗的数量,往年一直是大师兄管理,但是这次鬼艺接手了,你能帮鬼艺写一个程序统计每年消耗数量最多的鬼画符吗? 注解(这题是一道找出出现次数最多的字符串的一道题目) 输入描述: 第一行输入整数n.(1<=n<=1000)以下n行输入n个字符串,代表消耗的鬼画符。 输出描述: 输出消耗数量最多的鬼画符(字符串),无需考虑多种鬼画符消耗数量相同的情况。 示例1 输入 5 red red green green hen 输出 red
128 0
|
运维 Java Linux
职场进阶,送你的必备心法 | 开发者社区精选文章合集(二)
面对职场压力,你需要有不断进阶学习的能力,本合集就带你分享职场进阶你不能缺少的能力心法,carry你的职场人生!
职场进阶,送你的必备心法 | 开发者社区精选文章合集(二)
|
Java 程序员 双11
聚能聊每周精选 第十九期
聚能聊的粉丝们(聚丝,听起来像果汁),好久不见。 Hello! 各位社区小伙伴们!好久不见! “爱你就像,蓝天白云,晴空万里,突然暴风雨。” 接下来,让我们一起回顾一下,本周都有哪些热议的话题?各位聊主与粉丝们又有哪些精彩的互动?他们之间又碰撞出了怎样的火花? 接下来,让我们一起回顾一下,近期都有哪些热议的话题。
2997 0
|
Java 测试技术
华文慕课Java程序设计笔记
对象的自动清除 对象回收是由垃圾回收线程负责 System.gc()方法可以要求系统进行垃圾回收,仅仅是建议系统 java没有“析构方法”,但Object的finalize()有类似方法 系统在回收时会自动调用对象的finalize()方法 protected void finalize() throws Throwable{} 子类的finalize方法可以在里面释放系统资源,一般来说,子类的finalize方法中应该调用父类的finalize方法。
1263 0