为什么Unity引擎中,显示的顶点数过多?

为什么Unity引擎中,显示的顶点数过多?

本期我们聚集了这几个话题:如何解决UV接缝;为什么导入Unity后的顶点/面片数有变化;提高动画物体的光滑性;使用Socket处理网络协议收发时的策略...


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

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


编辑器

Q1:同一个模型,在Unity中显示的顶点数与面片数远多于在3ds MAX中显示的顶点/面片数。大家知道这是为什么吗?

题主可以参考官方文档
https://docs.unity3d.com/Manual/FBXImporter-Model.html
https://docs.unity3d.com/Manual/class-Mesh.html
最后一段:

The Unity Editor shows too many vertices or triangles (compared to what my 3D app says)

This is correct. What you are looking at is the number of vertices/triangles actually being sent to the GPU for rendering
. In addition to the case where the material requires them to be sent twice, other things like hard-normals and non-contiguous UVs increase vertex/triangle counts significantly compared to what a modeling app tells you. Triangles need to be contiguous in both 3D and UV space to form a strip, so when you have UV seams, degenerate triangles have to be made to form strips - this bumps up the count.

请输入图片描述
感谢凯奥斯@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5b78effe339d267d357c6dd6


制作

Q2:我将3D模型导入Unity后,发现UV接缝处显现地非常明显,但是在建模软件里面的显示是正常的,也可以确定UV展开是正确的,这是为什么呢?

这可能是因为Mipmap引起的。纹理会自动进行缩放,因而在边缘的地方因为信息的缺失导致接缝变的明显。可以在导入设置中尝试关闭Mipmap看看是否还存在问题。
另一个方法是在UV边缘向外扩展几个像素,例如1024*1024的纹理边缘向外扩充8像素。

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


渲染

Q3:我想让动画物体的边缘更加光滑,故而设置如下:已经开启了MSAA,Rendering设置中使用了8x抗锯齿,然而虽然场景中的静态物体边缘已经比较平滑,但动画物体边缘仍然有明显的锯齿感,如何继续提高光滑性呢?
请输入图片描述

题主可以尝试关闭HDR,看是否有提升。在Intel GPU上,HDR与MSAA共同使用会出现一些问题。此外,可以使用Post Processing Stack(https://docs.unity3d.com/Manual/PostProcessing-Stack.html)代替MSAA。

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


资源管理

Q4:我使用CommandBuffer.DrawMesh不能减少SetPass Calls。即使使用相同的材质,也无法减少SetPass Calls,这和Render直接渲染不同,不知道Unity会不会开放材质排序的功能?

Mesh只是一个虚拟的概念,本质上还是点、三角面以及其他的一些属性。Renderer也不是什么直接渲染,StaticBatching和DynamicBatching一样,都是Unity自行将多个Mesh合并在一起,统一Draw Call。
所以楼主的问题,应该将相同材质的Mesh合并到一起,再调用CommandBuffer.DrawMesh就好了。

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


逻辑代码

Q5:我在Unity中使用C#的Socket处理网络协议收发时,使用独立线程处理,还是异步的方式(如BeginReceive)效率更高呢?

常规方式都是独立线程+异步。放在主线程肯定受其它逻辑顺序的牵制,导致处理不及时。异步也类似,减少频繁地去读取,也给底层以一个更宽松的条件去处理。
Write一般是主线程+异步。Write不存在及时处理的问题,没必要单独搞个线程,也减少数据维护。异步的话,可防止异常情况卡主线程。

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

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

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