游戏画面背景包含大量的图片框,启动,缩小和移动后完全显示背景需要2-3秒。这段代码对我的目的不好吗?还有另一种方法吗?谢谢。这是代码:
public class gameArea
{
private Panel gameArea;
private MemoryStream ms;
public gameArea(Panel gameArea)
{
this.gameArea = gameArea;
}
public void setBackground()
{
byte[] b_grass = File.ReadAllBytes(ImageFile.grassBG);
byte[] b_tree = File.ReadAllBytes(ImageFile.tree);
byte[] b_sea = File.ReadAllBytes(ImageFile.sea);
// [650/50=13, 550/50=11]
int[,] tile_id = {
{ 1, 2, 0, 0, 0, 1, 1, 0, 1, 2, 1, 2, 0 },
{ 2, 1, 0, 1, 0, 1, 1, 2, 2, 2, 1, 2, 0 },
{ 1, 2, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1 },
{ 1, 2, 0, 0, 1, 0, 1, 0, 1, 2, 0, 0, 0 },
{ 1, 0, 2, 0, 0, 1, 1, 2, 1, 2, 1, 2, 0 },
{ 2, 2, 0, 1, 0, 1, 2, 1, 0, 2, 0, 1, 1 },
{ 1, 1, 2, 0, 0, 0, 1, 2, 1, 1, 2, 0, 0 },
{ 0, 2, 0, 2, 1, 2, 1, 0, 1, 2, 1, 2, 2 },
{ 1, 2, 0, 0, 0, 1, 0, 2, 0, 0, 1, 2, 0 },
{ 0, 2, 0, 1, 0, 1, 1, 2, 1, 2, 0, 0, 2 },
{ 1, 1, 1, 0, 0, 0, 1, 2, 1, 2, 1, 2, 0 }
};
// tree id = 1
// sea id = 2
this.ms = new MemoryStream(b_grass);
this.gameArea.BackgroundImage = Image.FromStream(ms);
this.gameArea.BackColor = System.Drawing.Color.Transparent;
for (int yIndex = 0, y = 0; y < this.gameArea.Height; y += 50, yIndex++)
{
for (int xIndex = 0, x = 0; x < this.gameArea.Width; x += 50, xIndex++)
{
switch (tile_id[yIndex, xIndex])
{
case 1:
{
setTile(b_tree, x, y);
break;
}
case 2:
{
setTile(b_sea, x, y);
break;
}
default:
{
break;
}
}
}
}
}
private void setTile(byte[] b_img, int x, int y)
{
this.ms = new MemoryStream(b_img);
PictureBox pic = new PictureBox();
pic.Image = Image.FromStream(ms);
pic.Size = new Size(50, 50);
pic.Location = new Point(x, y);
this.gameArea.Controls.Add(pic);
}
}
答案 0 :(得分:1)
我担心你不能为这类项目做太多事情。 Visual C#并不是真正专为游戏设计的,但有几种方法可以加快速度。
1。)如果你的游戏不需要改变背景,最初加载它并只重置你需要的图片(可能在标签值中使用布尔值来确定你是否应该重绘。)
2。)使用threading。如果你开始可能有5个线程,你的渲染可能会加速大约3次。
3。)将三个图像转换为构造函数中的Image对象,这样就不需要为每个tile转换它们了。
答案 1 :(得分:1)
为什么不创建一个大的位图并将小图像复制到其中,而不是很多图片框。
答案 2 :(得分:1)
我发现(重新)绘制许多图片框的最快方法是将它们全部设置在面板上,并为面板设置visible = false。完成为面板设置可见的图片框后。在我的应用程序中调整窗口大小时,在重绘过程中大约有50次,大约有400个用于Go游戏的图片框。
我下面有一个pabel,可以看到像快速闪光设置为相同的一般颜色,所以你看不到从彩盒的一般颜色到白色背景的闪烁。