C#表格对于2D游戏来说太慢了?
我用Python+Pygame制作了这个游戏,但是速度很慢,所以我用C#及其形式进行了尝试。更慢!我在i5 radeon 6770m NTB上的速度仅为20帧,比我希望这个游戏运行的硬件快数百万倍,我甚至还没有完成游戏,它只是渲染一张地图。这是对一款游戏的翻拍,该游戏使用的是速度较慢的几兆赫处理器。它的地图包含400x200块瓷砖,相机显示的只有79*79。我还安装了unity 4.5;它是否值得学习,它是否会给我带来显著的性能提升-如果有人知道它,我将如何制作一张由600*400个随机瓷砖组成的地图,无论是暗瓷砖还是亮瓷砖;它必须是“可碰撞的”?还是我在形式上做错了什么C#表格对于2D游戏来说太慢了?,c#,winforms,unity3d,C#,Winforms,Unity3d,我用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中创建平铺有几种方法
- 手动将精灵放置到场景中。其位置和设置将与场景一起保存
- 手动将精灵放置在场景中,并从中创建一个预设。因此,该组瓷砖可以重复使用
- 创建单个平铺的预设,并在场景中某个位置附加的行为中实例化该预设的多个
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中创建平铺