You are probably hitting 100% CPU because you are at the batch limit. You get a few thousand* batches per frame. A batch is basically equivalent to a call to one of the GraphicsDevice.Draw*
functions.
You probably want to read this answer.
While you can reduce the number of batches with instancing, because your geometry is so simple you are probably better off using DynamicVertexBuffer
or DrawUserPrimatives
to put all your geometry into a single batch. (This is the technique that SpriteBatch
uses.)
For such a small amount of geometry, the cost of calculating and sending the vertex data to the GPU will be comparable to, and quite possibly better than, the cost of transmitting the instancing data.
Additionally, if your data doesn't change every frame, you should use DynamicVertexBuffer
and instead of refreshing it every frame, add a ContentLost
handler and then only refresh it when you need to or if the device is lost.
Obviously, if your data never changes at all you should simply build it into a single, static VertexBuffer
. If what you are drawing is terrain, and it is not deformable, just have one (or more) huge (thousands of vertices) vertex buffer that you can scroll around, and let the GPU handle culling for you.