背包优化问题

背包优化问题

1)背包优化问题
​2)Unity 2019在华为手机上2倍抗锯齿不生效
3)关于libunity.sym.so符号表的问题
4)Navmesh合并成一个新的NavMesh的方法
5)Prefab挂自己写的管理器脚本却无法打包


这是第260篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

UGUI

Q:经常会有人问背包卡顿的原因分析,那到底是有多少种卡顿的原因以及优化的方式呢?

A1:推荐先看一下官方的UGUI课程:《Unity UI模块优化案例精讲》
对于没有优化过的背包,最大的消耗在于物品的销毁与实例化。

感谢潜行医生-577493@UWA问答社区提供了回答

A2:以下是我想到的一些点,期待其他大神补充更多的内容。项目中实际遇到的具体问题还需要具体分析,通过性能工具进行定位消耗过高的地方,然后有针对性地进行合理优化。

1.对于未优化的背包,列表滚动过程中,Cell的加载和销毁会造成卡顿。
解决办法:使用无限滚动列表Tableview这种控件,使Cell可以进行复用,避免物体的频繁实例化和销毁。

2.背包打开一瞬间,加载了很多个格子物品进来,造成卡顿和内存冲高,GC等问题。
解决办法:分帧加载,控制一帧实例化的Cell个数,避免在同一帧内大量创建格子物品。针对资源Load过程中的卡顿,可以采用提前预加载资源到内存的方式。

3.背包刷新时卡顿,大量的格子监听某个事件,刷新时可能造成卡顿。
解决办法:用脏标志的方式去刷新,不该刷新的部分不刷新。

4.Cell上的图片,粒子特效显示等设计不合理造成DrawCall过高。
解决办法:这个需要结合具体的项目和设计方案进行分析和优化。

感谢马三小伙儿@UWA问答社区提供了回答

A3:推荐一下FairyGUI这套UI系统,FairyGUI的List只要SetVirtual就行了:https://www.fairygui.com/docs/editor/list

感谢萧小俊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60f64c3694846f188daa35d8


Rendering

Q:Unity 2019上,工程同时使用PostProcessing后处理功能加上抗锯齿,在华为手机上2倍抗锯齿是没效果的。

开启后处理+抗锯齿在手机上的效果图:

关闭后处理+抗锯齿在手机上的效果图:

A:测试机型荣耀Play 4T在开启后处理的情况下,2x MSAA不会生效,但是4x和8x会生效。

使用Graphics Analyzer分析真机上的gl调用发现,MSAA生效需要在场景加载前调用 glFramebufferTexture2DMultisampleEXT接口,但是在开启后处理功能并且设置为2x MSAA的情况下,引擎调用的却是glFramebufferTexture2D接口,导致抗锯齿在场景中没有生效。

但是测试小米8和Oppo A32在开启后处理的情况下设置为2x MSAA并且生效。猜测是引擎方面针对不同的GPU硬件做了一些设置,现在只能在性能允许的情况下尝试开启4x MSAA来达到抗锯齿效果。

附件(可戳原问答下载)中有两个测试APK包和一些真机测试结果。荣耀Play 4T上不开启后处理的情况下,单纯的2x MSAA和4x效果几乎一模一样。

感谢宗卉轩@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60ef9a9794846f188da13d40


Android

Q:项目采用的是IL2CPP模式打包,选取arm64-v8a和armeabi-v7a两个版本,没有开启Strip Engine Code选项,Unity打包版本是2018.3.6f1

现在线上的包有ANR报错如下:

  #00  pc 000000000004b7cc  /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28)
  #00  pc 000000000004f680  /apex/com.android.runtime/lib64/bionic/libc.so (__futex_wait_ex(void volatile*, bool, int, bool, timespec const*)+144)
  #00  pc 00000000000b2120  /apex/com.android.runtime/lib64/bionic/libc.so (NonPI::MutexLockWithTimeout(pthread_mutex_internal_t*, bool, timespec const*)+688)
  #00  pc 00000000009fe7b4  /data/app/~~AxXJ-H5OqAWLfQK2almqqg==/com.saiyun.avgchapters.episodestories.romance-HeZPf9aJrCJYoKrQ20DOrg==/lib/arm64/libunity.so (???)
  #00  pc 00000000009fe778  /data/app/~~AxXJ-H5OqAWLfQK2almqqg==/com.saiyun.avgchapters.episodestories.romance-HeZPf9aJrCJYoKrQ20DOrg==/lib/arm64/libunity.so (???)
  #00  pc 0000000000508938  /data/app/~~AxXJ-H5OqAWLfQK2almqqg==/com.saiyun.avgchapters.episodestories.romance-HeZPf9aJrCJYoKrQ20DOrg==/lib/arm64/libunity.so (???)
  #00  pc 0000000000347f1c  /data/app/~~AxXJ-H5OqAWLfQK2almqqg==/com.saiyun.avgchapters.episodestories.romance-HeZPf9aJrCJYoKrQ20DOrg==/lib/arm64/libunity.so (???)
  #00  pc 00000000006e3638  /data/app/~~AxXJ-H5OqAWLfQK2almqqg==/com.saiyun.avgchapters.episodestories.romance-HeZPf9aJrCJYoKrQ20DOrg==/lib/arm64/libunity.so (???)
  at com.unity3d.player.UnityPlayer.nativeInjectEvent (Native method)
  at com.unity3d.player.UnityPlayer.injectEvent (unavailable)
  at com.unity3d.player.UnityPlayer.onTouchEvent (unavailable)
  at android.view.View.dispatchTouchEvent (View.java:15199)
  at android.view.ViewGroup.dispatchTransformedTouchEvent (ViewGroup.java:3914)
  at android.view.ViewGroup.dispatchTouchEvent (ViewGroup.java:3578)

查看报错的机型Samsung Galaxy S10,使用的是arm64运行的游戏,我尝试使用PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Symbols\arm64-v8a下的libunity.sym.so文件查找函数名,但是提示找不到方法。

这是什么原因?我需要用哪个符号表才能查找函数名呢?

A:建议你试试toolchains/x86_64-4.9/prebuilt/darwin-x86_64/bin/x86_64-linux-android-addr2line这个路径。

感谢Lim@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60f6866a94846f188daa889f


NavMesh

Q:这边有一个需求,将一张很大的地图分割成若干小块,目的是为了方便美术操作,然后将单个小块地图烘焙生成NavMesh。Unity提供的NavMeshLink要配点,不方便操作。请问还有其他思路去操作嘛?

A:我觉得,Unity的原生系统给的API还是太少了,你可以试下这个插件 A* Pathfinding Project Pro,它是一个C#版本的完整RecastNavigation实现,还包含传统的Grid寻路,你可以控制的更多;至于这个动态的NavMesh,你可以考虑试试 TileMesh,具体可以查看RecastDemo中的TileMesh,可以逐个Tile的按需创建。

感谢Yaukey@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c988c0e276f530b35fdd967


Build

Q:各位有没有碰到过在场景中的一个Prefab挂了一个自己写的管理器脚本,然后打包打不进去的情况:script asset xx.cs can not be include in assetbundle

A:检查一下这个CS文件中是否有包含Editor的代码,或者Define Symbols导致Unity无法识别你的Core。

感谢萧小俊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/60f0383594846f188da22360

20210726
更多精彩问题等你回答~

1.Vulkan与OpenGL的选择是否会对内存大小产生影响
2.关于Unity出AAB包的问题
3.RTS 手游技术难点

封面图来源于:Inventory System
Unity库存系统。


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)