Como acelerar meu mecanismo de jogo (GDI +, C #)
Atualmente, estou construindo um 2D Game Engine em C #, usando GDI. Sei que existem alternativas melhores para o GDI, mas também estou tão envolvido no projeto que não posso voltar agora.
Portanto, atualmente tenho um mecanismo gráfico, que renderiza uma parte de um bitmap, dependendo da posição da câmera e do tamanho da janela, o que me proporcionou um grande aumento de desempenho. Ótimo!
No entanto, notei que, se eu colocar vários objetos do jogo, na mesma posição, obterá a mesma taxa de quadros em comparação com os objetos em posições diferentes.
Então, talvez o mecanismo gráfico esteja processando partes do bitmap que não precisam ser renderizadas? e se for esse o caso, como faço para corrigir isso?
Eu acredito que o código não é realmente necessário, mas só para ter certeza, aqui está o que meu mecanismo gráfico está fazendo durante o loop principal do jogo
namespace GameEngine.Graphics
{
public class GraphicsEngine
{
private Window window;
private View view;
private System.Drawing.Graphics frontBuffer;
private System.Drawing.Graphics backBuffer;
private System.Drawing.Bitmap backBufferBitmap;
public GraphicsEngine(Window window, View view)
{
this.window = window;
this.view = view;
frontBuffer = window.CreateGraphics();
backBufferBitmap = new Bitmap((int)view.Size.X, (int)view.Size.Y);
backBuffer = System.Drawing.Graphics.FromImage(backBufferBitmap);
frontBuffer.CompositingMode = CompositingMode.SourceCopy;
frontBuffer.CompositingQuality = CompositingQuality.AssumeLinear;
frontBuffer.SmoothingMode = SmoothingMode.None;
frontBuffer.InterpolationMode = InterpolationMode.NearestNeighbor;
frontBuffer.TextRenderingHint = TextRenderingHint.SystemDefault;
frontBuffer.PixelOffsetMode = PixelOffsetMode.HighSpeed;
backBuffer.CompositingMode = CompositingMode.SourceOver;
backBuffer.CompositingQuality = CompositingQuality.HighSpeed;
backBuffer.SmoothingMode = SmoothingMode.None;
backBuffer.InterpolationMode = InterpolationMode.Low;
backBuffer.TextRenderingHint = TextRenderingHint.SystemDefault;
backBuffer.PixelOffsetMode = PixelOffsetMode.Half;
}
public void Render()
{
frontBuffer.DrawImage(backBufferBitmap, new Rectangle(0, 0, window.Width, window.Height),
new Rectangle((int)view.Position.X, (int)view.Position.Y,
(int)view.Dimensions.X, (int)view.Dimensions.Y), GraphicsUnit.Pixel);
}
}
}