在特定情况下:
- 一个32x32的平铺地图即将用C#在monogame中绘制。
- 每个纹理都是64x64像素。
- 只有一种纹理(即一个.png文件)反复重复以填充地图
- 每个瓷砖都是来自Tile.cs类的对象
例1:
创建一个静态/抽象类,其中包含要绘制的一个纹理,以便每个tile对象在绘制时都可以使用它。
public void Draw(){
//Texture.GrassTexture is from the static class
tile.Draw(Textures.GrassTexture);
}
例2:
另一种方法是在从中创建新对象时为每个图块设置纹理变量。
Texture2D tileTexture;
public Tile(Texture texture){
tileTexture = texture;
}
绘制图块时,可以使用tileTexture变量。
例3:
在绘制图块时将纹理作为每个图块的参数发送。
public void Draw(Texture2D texture){
tile.draw(texture)
}
从绩效的角度来看,哪些例子是最好的做法?欢迎任何其他想法!
该代码是为这篇文章制作的。
答案 0 :(得分:2)
从渲染性能角度来看,重要的是你在一次绘制地图时不会使用许多不同的纹理。
根据我的经验,经常切换纹理会损害性能。因此,您真正感兴趣的是将地图上的所有图块保存在单个纹理上(这通常称为纹理图集)。
MonoGame没有开箱即用的纹理图集支持。但是,您可以查看我们如何在MonoGame.Extended中实现它。
核心思想是实现一个类来表示纹理区域,它代表多块纹理中的单个图块。
public class TextureRegion2D
{
public TextureRegion2D(string name, Texture2D texture, int x, int y, int width, int height)
{
if (texture == null) throw new ArgumentNullException("texture");
Name = name;
Texture = texture;
X = x;
Y = y;
Width = width;
Height = height;
}
public string Name { get; private set; }
public Texture2D Texture { get; protected set; }
public int X { get; private set; }
public int Y { get; private set; }
public int Width { get; private set; }
public int Height { get; private set; }
public Rectangle Bounds
{
get { return new Rectangle(X, Y, Width, Height); }
}
}
然后在渲染瓷砖时,使用sprite批量的重载,该过量采用源矩形。
var sourceRectangle = textureRegion.Bounds;
spriteBatch.Draw(textureRegion.Texture, position, sourceRectangle, color);
当然,要让这一切顺利完成仍然需要一些其他步骤。
最后,如果您已经使用Tiled Map Editor创建地图,您可能有兴趣知道MonoGame.Extended已经支持加载和渲染它们。