对于2D游戏,C#形式太慢了吗?

时间:2014-07-31 16:34:25

标签: c# winforms unity3d

我用Python + Pygame制作了这个游戏,但速度很慢,所以我尝试用C#及其形式。它甚至更慢!我在i5 radeon 6770m NTB上只获得了20fps,比我希望这款游戏运行的硬件快了数百万倍,我还没有完成游戏,它只能渲染一张地图。它是用缓慢的几MHz处理器运行的游戏的翻版。它的地图包含400x200瓷砖和相机显示仅79 * 79。我还安装了团结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);

2 个答案:

答案 0 :(得分:5)

WinForms是游戏的一个糟糕的平台,甚至是2D平台。它适用于业务线应用程序,包括很少甚至没有硬件加速。

此外,该技术很难编写游戏,更不用说高效游戏了。您可能会使用WPF来完成一个非常简单的游戏,但您真的想学习XNA,MonoGame,Unity或其他一些可以利用DirectX的实际游戏平台(WPF也是如此) ,顺便说一句。

答案 1 :(得分:2)

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

较新版本的Unity3D具有内置的2D工具。我个人正在构建一个2D游戏,并强烈推荐它。

编辑:删除了我提到的XNA - 我不知道它已经“死了”。

在Unity3D中创建切片可以通过多种方式完成

  • 手动将精灵放入场景中。他们的位置和设置将与场景一起保存。
  • 手动将精灵放置在场景中并从中创建预制件。因此,这组瓷砖可以重复使用。
  • 创建单个图块的预制件,并在附加在场景中某处的行为中实例化该预制件的倍数。

至于渲染,Unity3D将为您处理。

EDIT2 :我创建了一个简短的Unity3D行为,您可以将其附加到场景中的某个位置。这使用我上面概述的第3种方法,它将从应用的一组预制件中随机挑选。该脚本假设从瓷砖中随机挑选,并且瓷砖的宽度为1个游戏单位宽/高。

  1. 将行为附加到场景中的某些内容(如主摄像头)
  2. 创建瓷砖作为预制件
  3. 将编辑器中的预制件拖放到“Tile Prefabs”数组中,显示已附加的行为。
  4. 将“Tiles High”设置为400,将“Tiles Wide”设置为600
  5. 将TileMapTopLeft设置为您希望它开始的左上角位置。
  6. 运行你的场景。
  7. 这是行为:

    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);
                }
            }
        }
    }
    

    您可能需要查找有关如何导入资源和创建预制件的教程,但此脚本应该可以帮助您找到正确的方向。