Terrain方案比较

  • 作者:admin
  • /
  • 时间:2019年09月23日
  • /
  • 浏览:1285 次
  • /
  • 分类:厚积薄发

1)Terrain方案比较
2)关于Batch.DrawInstanced的理解
3)粒子系统问题
4)如何定位Physics.Raycast的耗时
5)在Unity如何用代码安全地隐藏Spine角色的某一部分


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

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


Terrian

Q:Unity中Terrain实现原理是什么?T4M有什么优势?在移动平台还有没有其它可行方案?

A:Unity Terrain的实现原理,这个问题有点大。不过题主可以理解为它是一种基于Heightmap的实现方式,并且会产生不同的LOD细节层,同时根据用户的不同编辑操作产生不同的地形片,进而在不同的距离时展现不同的细节。在以前,Unity Terrain最为诟病的还是用户编辑过多后会产生大量的Draw Call和Terrain Data,从而让其在移动设备上渲染也耗时、内存也大、加载也耗时等等,所以,其在目前移动项目中的使用上并不多。

但是,Unity引擎在2018.3以后大幅改进了Terrain系统,通过GPU Instancing来大幅加速了Terrain的渲染效率,同时也减少了Terrain Data数据,进而加快了加载效率。不过,具体效果如何,还需要题主根据自己的需求后续进行尝试了。在目前的移动项目中,使用该功能的项目还是很少的。

T4M的优势就是简单,开源,自己想怎么改就怎么改。

就目前的商业游戏而言,暂时还没有看到其它较为主流的地形制作方案,基本上都是基于T4M的做法。之前在GDC上,有看到World Creator工具,题主感兴趣可以自行尝试,下图是它的制作效果图。

Terrain方案比较_第1张图片

 

后续也建议关注Procedual Terrain,随着游戏场景的大幅增加,该方法将在大尺度场景中得到进一步的应用。相关开源库戳此。

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


Rendering

Q:我在UWA的性能报告中看到Batch.DrawInstanced的耗时比较高,请问这个表示什么意思,一般该怎么下手?

Terrain方案比较_第2张图片

 

Terrain方案比较_第3张图片

 

A:从图片中,我并没有看到你项目的Batch.DrawInstanced很高,相反,看上去还是很正常的。

Batch.DrawInstanced是GPU Instancing在CPU端的耗时,一般是为了节省Draw Call做的,所以大部分情况下,GPU Instancing的耗时都相对较低。但是,在一些特殊情况下,大量半透明物体的GPU Instancing渲染耗时可以会带来很高的耗时,这点我们在UWA DAY 2019的课程《Unity引擎渲染、UI、逻辑代码模块的量化分析和优化方法》中做了详细解释,建议题主有空去整体看一遍。

Terrain方案比较_第4张图片

 

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


Particle

Q:我的Unity版本是2017.4.25,项目开启了多线程渲染,目前发现了一个报错“Sub-emitters must be children of the system that spawns them”。比如:场景内有10个特效。

Terrain方案比较_第5张图片

 

A:https://unity.cn/releases/lts/2017/2017.4.31f1
2017.4.31里也有一条类似的:
Shuriken: Fixed erroneous sub-emitter error message. (949522, 1164014)
你可以装个试试看能否解决你的问题。

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


Physics

Q:如何定位Physics.Raycast的耗时?我们代码中如果调用Physics.Raycast会体现在性能报告的物理模块中吗?还是需要手动打点才能得到具体数据,因为代码中调用Physics.Raycast的地方还是挺多的。

A:需要手动调用Raycast操作的,一般都建议研发团队还是直接通过打点来监控它的性能问题。

不止是Raycast,对于Rigidbody和Character Controller的API调用,我们都建议通过上述方式来进行监控和检查。

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


Animation

Q:假如有一个怪物手上拿了一把斧头,斧头的显示隐藏、位移或缩放都是受动画曲线控制的。如果我想用代码来随时隐藏它,该如何做?

我已经尝试过几种方式来实现局部隐藏:
1、获取斧头所在的Slot,修改Slot的A值为0。但是,这个值会受动画曲线控制,如果动画里有对这个A值key帧,则控制权又回到动画。
2、修改斧头的Bone的ScaleX和ScaleY为0。但遇到上面一样的问题,这两个值是受动画曲线控制的。而且,Bone是静态数据,修改静态数据感觉不太好,也不安全。
3、设置斧头Attachment为null。还是遇到上面类似的问题,这个Attachment有可能被其它接口调用后又变回去了。

还有另一种方法,暂时没有验证,运行时生成一个新的skin,这个新的skin里不加斧头的Attachment,然后需要显隐时就切换skin。但是频繁切换skin是否会有性能影响?或者是不是有更好的方式?

A:方法1 :有一种比较简单的做法,就是FBX导入动画后,把clip文件复制出来,然后把斧头对应动画上的scale曲线删掉,这样clip文件就不会影响斧头的clip,就可以在代码随意控制了。但是如果你勾选上Optimize Game Objects,那么如果你想处理斧头的动画曲线,就只能修改复制出来的clip文件,如果需要在运行时动态修改clip,就会比较麻烦。

方法2:让美术把斧头单独导出,代码挂载到挂点,独立处理。

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


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

你可能感兴趣的:(unity)