所以,嗨。 我正在尝试制作2D神奇宝贝风格的游戏。所以我决定制作一个面板(所以我只让面板移动而不是一切),这将是~50 000像素盒(瓷砖)30 x 30像素......
但它给了我这个错误..
Error while creating a window handler
那么有没有人可以让50000 Picturebox出现?
我的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using World;
namespace World
{
public partial class LoadWorld : Form
{
public int TileSizeX = 30;
public int TileSizeY = 30;
public int TileT = 50630;
public int TileX = 225;
public int TileY = 225;
public PictureBox[] WorldTile = new PictureBox[50630];
public static Dictionary<PictureBox, int[]> tileProp = new Dictionary<PictureBox, int[]>();
public LoadWorld()
{
InitializeComponent();
}
private void LoadWorld_Load(object sender, EventArgs e)
{
int valueA = 0;
int valueX = 0;
int valueY = 0;
foreach (PictureBox pictureBoxValue in WorldTile)
{
if(valueY < TileY)
{
if(valueX < TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA
};
WorldMap.Controls.Add(WorldTile[valueA]);
valueA = valueA + 1;
valueX = valueX + 1;
}
else if(valueX == TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA,
};
WorldMap.Controls.Add(WorldTile[valueA]);
valueA = valueA + 1;
valueY = valueY + 1;
valueX = 0;
}
}
else if(valueY == TileY)
{
if (valueX < TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA,
};
WorldMap.Controls.Add(WorldTile[valueA]);
valueX = valueX + 1;
valueA = valueA + 1;
}
else if (valueX == TileX)
{
WorldTile[valueA] = new PictureBox()
{
Size = new Size(TileSizeX, TileSizeY),
Location = new Point(valueX * 30, valueY * 30),
BackgroundImage = new Bitmap("Sprites/null.png"),
Visible = true,
Name = "tile" + valueA,
};
WorldMap.Controls.Add(WorldTile[valueA]);
}
}
}
}
}
}
答案 0 :(得分:1)
问题的根源是Windows.Forms
并不适合这项任务。
每个PictureBox
控件都会创建一个系统Handle
。 System.Windows.Forms.Control
实际上包裹了HWND
。这为Windows.Forms
控件提供了一些操作系统功能,如绘画,鼠标点击测试,开箱即用。
问题是系统有限制 - 每个进程最多可以有 10,000个句柄,每个用户会话最多可以有66,536个句柄。在这里,您可以立即看到创建50,000个PictureBox
控件的方式超出了Windows.Forms
可以实现的限制。
即使你能够做到这一点,整个渲染过程也会非常缓慢,游戏绝对无法播放。
我建议抛弃Windows.Forms
并寻找替代方案。第一个选项是使用WPF
,它可以处理大量控件而不会出现问题。但它仍然不是游戏的最佳选择。
但是,您可以选择Monogame来实现此目的。您可以在UWP或WPF中使用Monogame。这是一个非常容易学习的C#游戏框架,可以很好地满足您的需求。
如果您想要更多控制权,可以查看Unity
,这是一个完整的游戏开发解决方案。然后,您的游戏可以移植到许多不同的平台,包括UWP,Android和iOS。