0

我目前正在为 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);
    }
}

我还应该提到,玩家保持在屏幕中心,地图围绕玩家移动。

问题在于,这会为手机渲染创建大量纹理,并最终导致如此多的延迟,以至于我运行它的手机会锁定。那么有没有办法让屏幕外的对象不渲染?

4

2 回答 2

1

听起来你想做一些平截头体剔除

我对手机应用程序的 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。

于 2013-05-03T14:55:33.387 回答
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);
    }
}
于 2013-05-04T07:14:55.140 回答