JJasonLee

SkeletonRenderer.LateUpdate 中 BuildMesh 在单个mesh时正常,多个mesh时消耗过大
Debug.LogErrorFormat("{0} : {1} {2}", this.name, currentInstructions.hasActiveClipping, currentInstructions.submeshInstructions.Count);
if (currentInstructions.hasActiveClipping)
meshGenerator.BuildMesh(currentInstructions, updateTriangles);
else
meshGenerator.BuildMeshWithArrays(currentInstructions, updateTriangles);
输出为:Boss_0002 : True 8

如何设置成自由单个mesh?

---

SkeletonRenderer.png
添付ファイルを見るにはパーミッションが必要です
JJasonLee
  • 記事: 1

Harald

删除剪裁三角形时,还会得到8个子网格(8个“材质”插槽)吗?

如果可能的话,我们建议将所有内容打包到一个图集页面中(这样您就可以使用一个Material而不是两个Material)。使用单个地图集页面纹理,绘制顺序和交替的材质将不是问题。

如果无法做到这一点,建议将它们分组到地图集页面,这样就很少需要纹理切换。当绘制顺序以交替(交错)方式使用图集纹理时,必须进行纹理切换。您可以按照此处中所述的文件夹结构进行打包。

如果您想知道为什么交错的绘制顺序会导致很多子网格(渲染器中的8个“材质”插槽),我已经发布了此论坛帖子如下:

~~~~~~~~~~
当您以特定的方式(从背面到正面)对插槽(带有附件)进行排序时,请定义必须位于顶部的位置所需的渲染顺序。

假设您按以下顺序排列了广告位:
S1S2S3S4S5
每个插槽都有以下图像附件:
A1A2A3A4A5
现在,假设将附件打包成如下图册页面纹理:
T1A1A3A5
T2A2A4
现在,上面交错的纹理顺序示例变为:
T1T2T1T2T1
现在,由于每次纹理更改都需要开始一个新的绘制调用,因此最终需要进行5个绘制调用。
----
如果将附件打包成一个图集页面纹理:
T1A1A2A3A4A5
这导致它遵循以下纹理绘制顺序:
T1T1T1T1T1
不需要更改纹理,并且可以在单个绘制调用中完成。

简而言之:
[*]如@Anisoft所指出的,很少有Atlas纹理是有益的。
[*]如果您需要多个,因为它们都不适合一个,那么按绘制顺序将它们分组是很明显的(以防止其他纹理交错的附件)。例如。这可能是一个带有角色“基部”的纹理(绘制在背面),另一个是带有设备的纹理(通常位于前面)。
~~~~~~~~~~
---
Do you also get 8 submeshes (8 Materials slots) when you remove the clipping triangles?

If possible, we recommend to pack everything to a single atlas page (so you have a single Material instead of two). Using a single atlas page texture, draw order and alternating materials will not be an issue.

If this is not possible, it would be recommended to group them to atlas pages so that few texture switches are necessary. Texture switches are necessary when draw order is using atlas textures in an alternating (interleaved) way. You can pack using folder structure as described here.

If you want to know why interleaved draw order leads to many submeshes (the 8 materials slots in your Renderer), I have posted a machine-translation of this forum post.
アバター
Harald

Harri
  • 記事: 3479

JohnMayer

meshGenerator.Begin();
if (currentInstructions.hasActiveClipping)
meshGenerator.BuildMesh(currentInstructions, updateTriangles);
else
meshGenerator.BuildMeshWithArrays(currentInstructions, updateTriangles);
我也碰到这段代码性能消耗过大的问题,而且我有个疑问,hasActiveClipping这个参数是什么作用?我的一些动画,有些hasActiveClipping=true,走BuildMesh的逻辑,性能消耗很大,而有些hasActiveClipping=false,走BuildMeshWithArrays的逻辑,性能消耗比较小,我尝试了修改代码,强制让动画都走BuildMeshWithArrays的逻辑,好像也没有报出什么错误,不知道这么做可不可以?
JohnMayer
  • 記事: 2

Harald

如果你的骨架中有一个剪切附件处于活动状态,currentInstructions.hasActiveClipping将为true。如果你不打算在你的骨架中使用剪切,请过滤你的Spine项目中的Clipping并删除它们。

如果你的Spine项目不包含任何剪切附件,并且currentInstructions.hasActiveClipping仍然为真:你使用的是哪个spine-unity版本(unitypackage的名称)?
-----
currentInstructions.hasActiveClipping will be true if you have a Clipping Attachment active in your skeleton. If you don't intend to use clipping in your skeleton, filter your Spine project for Clipping and delete them.

If your Spine project does not contain any clipping attachments, and currentInstructions.hasActiveClipping is still true: which spine-unity version (name of the unitypackage) are you using?
アバター
Harald

Harri
  • 記事: 3479

JohnMayer

我们的动画师确实使用了不必要的clipping功能,去除clipping功能后性能开销明显减少,非常感谢您的解答!
JohnMayer
  • 記事: 2

Harald

听到您的消息真是太好了,谢谢您与我们联系!
That's great to hear, thanks for getting back to us!
アバター
Harald

Harri
  • 記事: 3479


Return to 中国Spine用户