Recently performance became a bottleneck for me, therefore I'm investigating ways of improving the situation. In particular my attention is drawn to
SpriteBatch.GraphicsDevice.DrawPrimitives function as I render a lot of primitives. I've coded a class with several draw shape methods (rectangle, circle, triangle, roundedrectangle). Now the workflow in these functions is as follows:
clear pooled list of vertices
push desired vertices to the list
render vertices on the gpu
As I'm not batching draw calls and each shape is drawn in a separate draw call it's quite reasonable that performance is pretty low.
So in particular I'm looking for a way how to efficiently batch a series of draw commands with a range (that's the problem) of options.
- Each shape can be drawn either as outline or filled (created two
RasterizerState instances and passed the correct one to the gpu when rendering vertices.
PrimitiveType types were used but this can be reworked reasonably (ex. for a line I've used a
Simply said I'd like to batch together this scenario for example:
draw circle outlined
draw circle filled
First command used
LineStrip as a primitive type, second rasterizer state
Assuming there is no other way around I'd have to use
TriangleStrip for each draw command which would result in sending more vertices that necessary to the gpu (not sure if I could somehow improve this with indicies, commands above are sort of an API my users are expected to use).
Is this a good way to go are there better approaches to take?
Thanks in advance.