我正在开发一个用于学习目的的游戏,我想仅使用.NET框架和C#中的Windows Forms项目制作。
我希望将“屏幕”(可以在窗口上显示的内容)作为
我目前使用一个
构建如下:
有没有更快的方法在不使用外部库的情况下使这个工作?
我希望将“屏幕”(可以在窗口上显示的内容)作为
int[]
获取。以缓冲方式修改数组并重新应用更改后的数组到“屏幕”上(以避免闪烁)。我目前使用一个
Panel
,在其上绘制一个Bitmap
,然后使用Graphics
将Bitmap
转换为int[]
,接着我就可以修改它并重新应用到Bitmap
并重新绘制。虽然这种方法能够工作,但速度非常慢,特别是因为我必须在每一帧都要将图像放大,因为我的游戏只有300x160,而屏幕却是900x500。构建如下:
// Renders 1 frame
private void Render()
{
// Buffer setup
_bufferedContext = BufferedGraphicsManager.Current;
_buffer = _bufferedContext.Allocate(panel_canvas.CreateGraphics(), new Rectangle(0, 0, _scaledWidth, _scaledHeight));
_screen.clear();
// Get position of player on map
_xScroll = _player._xMap - _screen._width / 2;
_yScroll = _player._yMap - _screen._height / 2;
// Indirectly modifies the int[] '_pixels'
_level.render(_xScroll, _yScroll, _screen);
_player.render(_screen);
// Converts the int[] into a Bitmap (unsafe method is faster)
unsafe
{
fixed (int* intPtr = &_screen._pixels[0])
{
_screenImage = new Bitmap(_trueWidth, _trueHeight, _trueWidth * 4, PixelFormat.Format32bppRgb, new IntPtr(intPtr));
}
}
// Draw generated image on buffer
Graphics g = _buffer.Graphics;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
g.DrawImage(_screenImage, new Rectangle(0, 0, 900, 506));
// Update panel buffered
_buffer.Render();
}
有没有更快的方法在不使用外部库的情况下使这个工作?