SRP的多相机同时绘制

SRP的多相机同时绘制

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

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


本期目录:

  • SRP的多相机同时绘制
  • 如何将两个或以上NavMesh合并成一个新的NavMesh
  • UGUI ScrollRect动态加载Image or RawImage
  • Text.get_cachedTextGenerator的内存占用
  • Profiler与Stats和Frame Debugger里的数据不同

SRP

Q:我是用了两个摄像机看同一个物体,在不设置Graphics里面的RenderPipelineAsset的时候,在Game试图里面能正常看到两个模型,但是一旦设置了那个,就无法正常显示两个,只能看到一个。求解,这个RenderPipeline是不是需要什么特殊的设置?

如图所示,底下的Game视图,只能看到第一个摄像机的内容。两个摄像机我都是设置的depth only。

请输入图片描述

A:题主是用的LWRP吗?LWRP确实已经不支持像built-in中这种将多个相机内容绘制到同一view中的方式了,但各自相机绘制到各自视口(通过调整view port rect)还是正常工作,官方给出了不支持这种叫做Multi-Camera Tracking的原因:http://t.cn/EKEnqPi

所以之前的绕过手段是一个Camera先绘制到RT中,不过貌似新版本的LWRP做了个Camera Tracking System来实现类似的功能,参考:http://t.cn/EKEn8eS

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


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


UI

Q:在UGUI ScrollRect中,如果要从服务器加载大量图片显示(图片的尺寸不大),是应该用RawImage展示,还是创建Sprite用Image显示?这些图片本身可能是用户自己上传的,所以无法提前打包成图集,想问一下,这样的一般做法是什么?

A:1、首先要使用性能更高效的ScrollRect,例如:LoopScrollRectSuper ScrollView

2、其次服务端需要预处理用户上传图片,规范图片尺寸和格式。

3、如果UI界面会被用户频繁滑动,则不考虑动态生成图集,RawImage优于Image,原因是Sprite是Texture上的抽象区域,需要在Texture基础上进行创建,直接使用Texture则省去这一步。

4、如果UI界面长时间静止且DrawCall压力较大,可以采用RuntimeAtlas方案来降低DrawCall,此时则使用Image,参考:小米超神优化方案

Q:针对3、4,我可不可以这样理解:用RawImage实际上省去了Sprite.Create的消耗,而且运行时创建的Sprite也并不能指定Packing Tag,所以不能直接打包成图集,实际上是不能被batch的。这里有个疑问,针对UI来说,Sprite.Create()既然创建出的Sprite不能合批,是不是根本就是多此一举?如果确实需要打包图集,就需要采用Runtime Atlas类似解决方案。

A:是的,如果Texture只有一个同等大小的Sprite确实多此一举。Sprite可以视为对Texture区域的封装利用,比如border实现九宫格拉伸、设置锚点等,纯粹显示整张图像用Texture就够了。

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


UI

Q:请问一下,这个Text.get_cachedTextGenerator是什么东西,为什么会占用内存这么多?

A:这个是每次Text在Instantiate或者Active时都会进行调用的。通过堆栈信息可以推测,很可能是点击时会有大量Text组件进行Active,从而导致了较高的堆内存分配。建议题主在堆内存分配图中进行查看,根据具体截图查看其分配是否合理。

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cd8cbebe08a260abaf0239f


Editor

Q:同一帧里,我发现Profiler和Stats里还有Frame Debugger里的数据都不一样,请问大家知道是为什么吗?

请输入图片描述

A:Stats、Frame Debugger理论上是和Profiler的Total Batches是能对上的,可能是一些特殊的规则不同,比如Clear操作算不算Batch之类。看两组对比,其实差异都不是太大。

至于Profiler里的DrawCall和Total Batches的差别,可以看下这个:https://answer.uwa4d.com/question/59ddc3fa43cf099e2d2295be

该回答由UWA提供,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cd9126de08a260abaf023b2


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

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

封面图来源于网络