C#表格对于2D游戏来说太慢了?

C#表格对于2D游戏来说太慢了?,c#,winforms,unity3d,C#,Winforms,Unity3d,我用Python+Pygame制作了这个游戏,但是速度很慢,所以我用C#及其形式进行了尝试。更慢!我在i5 radeon 6770m NTB上的速度仅为20帧,比我希望这个游戏运行的硬件快数百万倍,我甚至还没有完成游戏,它只是渲染一张地图。这是对一款游戏的翻拍,该游戏使用的是速度较慢的几兆赫处理器。它的地图包含400x200块瓷砖,相机显示的只有79*79。我还安装了unity 4.5;它是否值得学习,它是否会给我带来显著的性能提升-如果有人知道它,我将如何制作一张由600*400个随机瓷砖组成

我用Python+Pygame制作了这个游戏,但是速度很慢,所以我用C#及其形式进行了尝试。更慢!我在i5 radeon 6770m NTB上的速度仅为20帧,比我希望这个游戏运行的硬件快数百万倍,我甚至还没有完成游戏,它只是渲染一张地图。这是对一款游戏的翻拍,该游戏使用的是速度较慢的几兆赫处理器。它的地图包含400x200块瓷砖,相机显示的只有79*79。我还安装了unity 4.5;它是否值得学习,它是否会给我带来显著的性能提升-如果有人知道它,我将如何制作一张由600*400个随机瓷砖组成的地图,无论是暗瓷砖还是亮瓷砖;它必须是“可碰撞的”?还是我在形式上做错了什么

public void render()
    {

        Bitmap frame = new Bitmap(Game.CANVAS_WIDTH, Game.CANVAS_HEIGHT);
        Graphics frameGraphics = Graphics.FromImage(frame);

        TextureID[,] textures = Background.Blocks;

        while (true)
        {

            //frameGraphics.FillRectangle(new SolidBrush(Color.Aqua), 0, 0, Game.CANVAS_WIDTH, Game.CANVAS_HEIGHT);
            for (int x = 0; x < Game.AR_WIDTH; x++)
            {
                int xx = x * Game.TILE_SIDE - game.green_tank_pos[0] + Game.DIFF;
                if (xx < 0) continue;
                if (xx > Game.CANVAS_WIDTH) break;

                for (int y = 0; y < Game.AR_HEIGHT; y++)
                {
                    int yy = y * Game.TILE_SIDE - game.green_tank_pos[1] + Game.DIFF;
                    if (yy < 0) continue;
                    if (yy > Game.CANVAS_HEIGHT) continue;
                    switch(textures[x,y])
                    {
                        case TextureID.dark:
                            frameGraphics.DrawImage(tex_dark_gnd, xx, yy);
                            break;
                        case TextureID.bright:
                            frameGraphics.DrawImage(tex_bright_gnd, x * Game.TILE_SIDE - game.green_tank_pos[0] + Game.DIFF, y * Game.TILE_SIDE - game.green_tank_pos[1] + Game.DIFF);
                            break;
                    }
                }
            }

            frameGraphics.DrawImage(tex_green_tank, Game.DIFF, Game.DIFF);



            drawHandle.DrawImage(frame, 0, 0);
public void render()
{
位图帧=新位图(Game.CANVAS\u宽度,Game.CANVAS\u高度);
Graphics frameGraphics=Graphics.FromImage(frame);
TextureID[,]纹理=背景.块;
while(true)
{
//frameGraphics.FillRectangle(新的SolidBrush(Color.Aqua)、0、0、Game.CANVAS\u WIDTH、Game.CANVAS\u HEIGHT);
对于(int x=0;x游戏画布宽度)中断;
对于(int y=0;y游戏.画布高度)继续;
切换(纹理[x,y])
{
case TextureID.dark:
frameGraphics.DrawImage(tex_dark_gnd,xx,yy);
打破
case TextureID.bright:
frameGraphics.DrawImage(tex_bright_gnd,x*Game.TILE_SIDE-Game.green_tank_pos[0]+Game.DIFF,y*Game.TILE_SIDE-Game.green_tank_pos[1]+Game.DIFF);
打破
}
}
}
frameGraphics.DrawImage(tex_green_坦克,Game.DIFF,Game.DIFF);
drawHandle.DrawImage(框架,0,0);
WinForms是一个糟糕的游戏平台,即使是2D游戏也是如此。它是为业务线应用而设计的,几乎没有硬件加速功能

此外,这项技术很难编写游戏,更不用说高效的游戏了。你可能不需要在一个非常简单的游戏中使用WPF,但你真的很想学习XNA、MonoGame、Unity或其他可以利用DirectX的实际游戏平台(顺便说一句,WPF也可以做到这一点).

WinForms是一个糟糕的游戏平台,即使是2D游戏也是如此。它是为业务线应用而设计的,几乎没有硬件加速功能


此外,这项技术很难编写游戏,更不用说高效的游戏了。你可能不需要在一个非常简单的游戏中使用WPF,但你真的很想学习XNA、MonoGame、Unity或其他可以利用DirectX的实际游戏平台(顺便说一句,WPF也可以做到这一点).

在winforms中,有很多方法可以获得更好的性能,但对于游戏来说,最好使用更适合工作的工具(不要用螺丝刀敲钉子)

新版本的Unity3D有内置的2D工具。我个人正在用它制作一个2D游戏,我强烈推荐它

编辑:删除我对XNA的提及-我不知道它“死了”

在Unity3D中创建平铺有几种方法

  • 手动将精灵放置到场景中。其位置和设置将与场景一起保存
  • 手动将精灵放置在场景中,并从中创建一个预设。因此,该组瓷砖可以重复使用
  • 创建单个平铺的预设,并在场景中某个位置附加的行为中实例化该预设的多个
至于渲染,Unity3D将为您解决这一问题

EDIT2:我创建了一个简短的Unity3D行为,您可以将其附加到场景中的某个位置。这使用了我上面概述的第三种方法,它将从应用的一组预设中随机拾取。此脚本假设从平铺中随机拾取,平铺的宽度为1个游戏单位宽/高

  • 将行为附加到场景中的某个对象(如主摄影机)
  • 将瓷砖创建为预制件
  • 将编辑器中的预置拖动到已附加行为的“Tile prefables”数组中
  • 将“瓷砖高”设置为400,“瓷砖宽”设置为600
  • 将TileMapTopLeft设置为要启动的左上角位置
  • 运行你的场景
  • 以下是行为:

    using UnityEngine;
    
    class TileCreator : MonoBehaviour
    {
        private static System.Random rng = new System.Random();
    
        public GameObject[] TilePrefabs;
    
        public int TilesWide;
    
        public int TilesHigh;
    
        public Vector3 TileMapTopLeft;
    
        void Start()
        {
            for (int x = 0; x < TilesWide; x++)
            {
                for (int y = 0; y < TilesHigh; y++)
                {
                    Instantiate(TilePrefabs[rng.Next(TilePrefabs.Length)], new Vector3(x + TileMapTopLeft.x, y + TileMapTopLeft.y, TileMapTopLeft.z), Quaternion.identity);
                }
            }
        }
    }
    
    使用UnityEngine;
    TileCreator类:单行为
    {
    private static System.Random rng=new System.Random();
    公共游戏对象[]TilePrefabs;
    公共国际瓷砖;
    公共int TilesHigh;
    公共向量3 TileMapTopLeft;
    void Start()
    {
    对于(int x=0;x

    您可能需要查阅有关如何导入资源和创建预制件的教程,但此脚本应该会让您走上正确的方向。

    在winforms中绘制性能更好的图形有很多方法,但对于游戏来说,最好使用更适合此工作的工具(不要使用螺丝刀)

    新版本的Unity3D有内置的2D工具。我个人正在用它制作一个2D游戏,我强烈推荐它

    编辑:删除我对XNA的提及-我不知道它“死了”

    可以在Unity3D中创建平铺