Godot中导入的spineDrawCall过大的问题
Davide 只有一个图集页面(尺寸小于2048*2048),我正在试着逐级排除问题的源头。我又使用texturePacker工具将spine中使用的散图导出为spine格式的图集给godot,但依然没能合批。或许问题的源头不在spine导出的设置上,而在于godot中。我在godot中尝试使用相同的材质(如shaderMaterial、CanvasItemMaterial)给spine但都无法合批。我尝试询问了AI但没能找到AI所说的一些选项。
如果没有能解决godot合批spine的方法,或许godot用户就要被迫使用godot自带的骨骼动画工具了,这对spine工具的忠实用户以及spine官方都是一个损失,希望在此问题上能得到官方工程师的协助。
We cannot help you if you don't send us a minimal reproduction project of your issue, as I said above.
Many users use spine-godot without any issue with draw calls.
@gyzbean Thanks for preparing a reproduction project. As Davide said above, you can send it to contact@esotericsoftware.com.
Harald I uploaded it to GitHub, including the Godot and Spine projects
Gyzbean/TestProject_SpineBatch
This is a limitation of Godot. They currently do not implement batching for 2D triangle meshes.
orgs/godotengineprojects/33?pane=issue&itemId=20224421
We've worked around this as best as possible, by using meshes explicitely:
EsotericSoftware/spine-runtimesblob/4.2/spine-godot/spine_godot/SpineSprite.cpp#L173
However, that does not help with draw calls. It does improve performance compared to canvas_item_add_triangle_array though.
Note however, that Godot 4+ uses Vulkan as the default renderer. Batching is much less impactful there, which is one of the reasons it hasn't been implemented by Godot yet.
I think Godot is mature enough for production use, including on mobile. Vulkan makes batching mostly irrelevant.
I suggest you setup a simple scene with multiple SpineSprite
nodes that's similar to your target complexity and test performance on devices you care about.
Mario 我测试了一下,在godot里跑200个spine和unity里跑200个合批的spine,最后unity的FPS非常稳定,godot在100个的时候i5处理器就已经扛不住了,200个时drawcall达到了3000+,i7也抗不住了。但unity跑到300个i5都能稳定在60fps(unity甚至是在3D空间里)。
其实godot无法让多个spine合批这个事儿还勉强能接收。但godot甚至无法让1个spine文件只使用1个drawcall就太糟糕了,如果godot能让1个spine只使用1个drawcall绘制,200个spine控制在200dc,应该也不会太卡,现在一个spineSprite就要耗费20-30个dc,很难大规模使用
Well, I suppose there's your answer. Did you use a release build for benchmarking? And what rendering profile did you use? Make sure to use Vulkan.
We have no control over Godot itself, so we can't make things faster on our end. If Unity fits your needs, go for it. Our spine-unity runtime is as capable as our spine-godot runtime, if not more.