我目前正在开发一款适用于Windows Phone 7的游戏。我的游戏地图由一个二维数组组成,每个元素都包含一个体素。渲染地图的代码如下。
//Draw Map
for (int i = 0; i < 499; i++)
{
for (int j = 0; j < 499; j++)
{
spriteBatch.Draw(groundVoxelTexture, voxels[i, j].Position, Color.White);
}
}
我还应该提到玩家在屏幕上保持居中,地图在玩家周围移动。
问题在于这会为手机创建大量纹理以进行渲染并最终造成如此多的延迟,以至于我在锁定时运行它的手机。那么有没有办法让屏幕外的对象不呈现?
答案 0 :(得分:1)
听起来你想做一些Frustum Culling
我对于手机应用程序的xna并不熟悉,但我确信它是同样的过程。
//Draw Map
BoundingFrustum bf = new BoundingFrustum(View * Projection);
for (int i = 0; i < 499; i++)
{
for (int j = 0; j < 499; j++)
{
if (bf.Intersects(new BoundingSphere(voxels[i, j].Position, voxelRadius)))
spriteBatch.Draw(groundVoxelTexture, voxels[i, j].Position, Color.White);
}
}
如果视图保持原位并且地图四处移动,您应该能够在帧与帧之间使用相同的BoundingFrustum。
答案 1 :(得分:0)
在这种情况下使用boundingfrustum有点硬核。
可以更好地计算需要绘制的网格索引。
你正在使用spritebatch,所以你在2D工作,我很容易使用视图转换并使用它反向获取索引,但我认为你没有使用它。
所以我认为你的体素大小为“S”而你的玩家位于P位置,屏幕的大小(W,H)并且没有缩放选项。
MinX= (int) ((P.X - W * 0.5) / S) - 1;
MinY= (int) ((P.Y - H * 0.5) / S) - 1;
MaxX= MinX+ W/S + 2;
MaxY= MinY+ H/S + 2;
for (int i = MinX; i < MaxX; i++)
{
for (int j = MinY; j < MaxY; j++)
{
spriteBatch.Draw(groundVoxelTexture, voxels[i, j].Position, Color.White);
}
}