I am looking ways to improve the efficiency of my draw method in XNA/Monogame and understand how things work. I have just a group of 4 models (bricks), (red, green, blue, yellow) I am drawing multiple times on the screen (100-120 total models, so drawing each model 25-30 times) on the current frame.
Here is how i am drawing 1 of the 4 types of models (the red ones) right now:
Matrix[] transforms = new Matrix[Brick.Red.Bones.Count];
Brick.Red.CopyAbsoluteBoneTransformsTo(transforms);
ModelMesh mesh = Brick.Red.Meshes[0];
BasicEffect effect = (BasicEffect)mesh.Effects[0];
effect.EnableDefaultLighting();
effect.View = Matrix.CreateLookAt(cameraPosition, Vector3.Zero, Vector3.Up);
effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
aspectRatio, 1.0f, 10000.0f);
foreach (Brick brick in Bricks)
{
int i = brick.Index / Columns;
int j = brick.Index % Columns;
modelPosition = new Vector3(-HalfWidth + j * BrickWidth,
HalfHeight - i * BrickHeight, 0.0f);
effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateScale(scale) *
Matrix.CreateTranslation(modelPosition);
mesh.Draw();
}
This code seems to not perform as well as I expected (since its just 4 models drawn many times on different locations) when I timed it with a StopWatch
. Is there something silly in my code that could be done better and i'm missing it ? I can't tell because so far I have only worked with sprites and 2D.
Edit: From other codes I saw that they used effect.Parameters["World"].SetValue(...);
to set the BasicEffect
values, but that gave me a null exception, and I am not sure what is the difference of that function since in my mind it seems the same with effect.World = ...;