androidopengl-eslibgdxopengl-es-2.0mali

Low FPS for large merged mesh


I try to render a set of 3d models. I merged meshes into one mesh with 200k vertices. With position, normal and texture coordinates attributes. I use VBO but don't use the index buffer object. I do only 2 render calls (one for shadows). I use libgdx.

I expected good FPS from the merged mesh on my weak Galaxy j3 (2016), but I got 13 FPS. On galaxy s8 and nexus 5 I got 60 FPS.

So what's the problem?
Is Galaxy j3 too weak device for 200k vertices?
Or 200k vertices is too large mesh?

Galaxy J3 characteristics:
CPU: Spreadtrum SC9830I Quad, 1.5 ГГц.
RAM: 1.5 Gb.
GPU: ARM Mali-400 MP2 .


Solution

  • Mali-400 is an old design with a very single vertex processor which doesn't scale with increasing core count, so it can definitely struggle with vertex complexity, where complexity is shader cost * vertex count.

    It's worth noting that merging everything in to a single draw is often counter-productive. You want to reduce draw call count to something to CPU can handle, but once you are under a few hundred draw calls it's unlikely to buy you much and you throw away a lot of opportunities. For example, you lose the ability to cull out-of-frustum objects on the CPU, which is highly recommended best practice even on a more modern GPU.