c# (XNA Game Studio)获取屏幕外对象不渲染

本文关键字:对象 屏幕 获取 XNA Game Studio | 更新日期: 2023-09-27 18:12:04

我目前正在开发一款面向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);
    }
}

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

问题是,这创造了大量的纹理为手机渲染,并最终造成如此多的延迟,手机我运行它锁定。有没有办法让屏幕外的物体不渲染?

c# (XNA Game Studio)获取屏幕外对象不渲染

听起来你想做一些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

在这种情况下使用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);
    }
}