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,很难大规模使用