xxl

为了节省内存,我计划把Spine的动画拆分成多个文件来加载,在游戏的外部只加载简单的 idle 动画,在战斗中加载其他更多动画。

我在论坛中翻阅了之前的一些帖子,发现也有其他用户想要类似的功能,但你们拒绝提供该功能,理由是使用二进制模式足够节省性能,不需要进行进一步拆分。

然而对我来说,我的一个角色有大量的动画,即便使用了二进制格式,动画文件大小也轻松达到了将近 2M,这是不可接受的,我需要通过拆分动画文件来节省内存,希望能提供合适的方案。
xxl
  • 帖子: 11

Mario

在这种情况下,请将您的项目文件发送给我们。 2MB 的二进制导出表明您使用了大量自由形式的网格变形键,并且网格中可能有大量的顶点。 那些数据不能轻易压缩。 通常不需要 FFD,因为几乎所有的效果都可以通过使用权重来实现。

In this case, please send us your project files. A 2MB binary export indicates that you are using a LOT of free form mesh deformation keys and likely a huge number of vertices in your meshes. That data can not be easily compressed. And usually there is no need for FFD as almost all of its effect can be achieved by using weights instead.
头像
Mario

Mario
  • 帖子: 2827

xxl

1. 有个非常困惑的问题,如果通常不需要FFD,那么FFD应该在什么时候使用呢。如果没有明确的使用范围说明,可能制作者就会使用大量的FFD来达成想要的效果。

2. 修改Spine源文件的制作方式不是我想要的方案,因为这意味着大量的返工,而且一些Spine动画是从AssetStore购买的资产,没办法修改源文件。我只想通过修改加载方式这种方法来优化性能。

---

想要知道到底是什么原因使你们坚持不愿意为用户提供这个功能,是因为这个功能开发起来非常困难吗。
xxl
  • 帖子: 11

Mario

1. FFD 对于新手用户来说似乎更容易,因为加权骨骼在其行为中更难设置和预测。 然而,加权骨骼通常是首选的使用方法。

2.明白了。 您可以修改 SkeletonJson 或 SkeletonBinary 以仅加载动画的子集。 如果您告诉我您使用的是什么 Spine 运行时,我可以提供更多有关如何操作的指示。

我们通常不会坚持任何事情,但首先尝试了解用例,看看它是否是我们想要支持的东西。 在这种情况下,支持此功能会使用户创建繁重的动画,这不是我们想要鼓励的。

1. FFD may appear to be easier for novice users, as weighted bones is a bit harder to setup and anticipate in its behaviour. However, weighted bones is generally the preferred method to use.

2. Understood. You could modify SkeletonJson or SkeletonBinary to only load a subset of animations yourself. If you tell me what Spine Runtimes you are using, I can give more pointers on how to do it.

We don't usually insist on anything, but first try to understand the use case to see if it is something we want to support. In this case, supporting this feature would make users create animations that are heavy, which is not something we want to encourage.
头像
Mario

Mario
  • 帖子: 2827

xxl

非常感谢您的耐心解释,我现在明白了更多细节。我使用 spine-unity runtime,请给我一些提示让我可以把二进制文件中的动画信息分成多个部分来加载。

---

I'm using spine-unity runtime.
xxl
  • 帖子: 11

Mario

在这种情况下,您可以修改 SkeletonJons.cs 和 SkeletonBinary.cs,以便它们采用您要加载的动画名称列表。 然后,您可以在 SkeletonJson.cs 中按名称忽略这些动画:
https://github.com/EsotericSoftware/spine-runtimes/blob/4.0/spine-csharp/src/SkeletonJson.cs#L366

对于 SkeletonBinary,它更复杂,因为您仍然需要解析完整的二进制流,即使您忽略动画。 在这种情况下,您可以对“ skeletonData.animations ”进行后处理并删除您不想要的动画。

如果您想稍后加载特定动画,则适用类似的原则。 加载骨架,丢弃不需要的动画,或者从新加载的 SkeletonData 构建一个新的 Skeleton,或者从 SkeletonData 中选择我们的动画并将其添加到现有的 Skeleton。

In that case, you can modify SkeletonJons.cs and SkeletonBinary.cs such that they take a list of animation names you want to load. You can then ignore those animations by name here in SkeletonJson.cs:
https://github.com/EsotericSoftware/spine-runtimes/blob/4.0/spine-csharp/src/SkeletonJson.cs#L366

For SkeletonBinary it is more complex, as you still have to parse the full binary stream, even if you ignore animations. In that case, you could post-process skeletonData.animations and remove animations you don't want.

If you want to load a specific animation later on, a similar principle applies. Load the skeleton, discard animations you don't want and either construct a new Skeleton from the newly loaded SkeletonData, or pick the animation our of the SkeletonData and add it to an existing Skeleton.
头像
Mario

Mario
  • 帖子: 2827


回到 中国Spine用户