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);
}
}
我还应该提到,玩家保持在屏幕中央,地图围绕着玩家移动。
问题是,这创造了大量的纹理为手机渲染,并最终造成如此多的延迟,手机我运行它锁定。有没有办法让屏幕外的物体不渲染?
听起来你想做一些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);
}
}