2013-05-03 102 views
0

我目前正在开发一个游戏的Windows Phone 7的地图为我的游戏由一个保存在每个单元体素2维数组。渲染地图的代码如下。C#(XNA游戏工作室)获取屏幕外的物体不能渲染

//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

我对XNA并不熟悉,但在性能方面,通常是将打算绘制到一个调用中的所有精灵批处理。在这里,您将每个绘图循环单独绘制。这是很多电话。 – eriknelson 2013-05-03 14:50:19

+0

我假设这些职位是按某种顺序排列的?你应该能够调整你的循环开始和结束位置 – Sayse 2013-05-03 14:50:19

+1

@ErikN spriteBatch有一个你必须调用的'Begin'和'End'。我不是100%确定的,但我敢打赌,当调用“End”时,它会将它们一起分配到一个调用中。 – Cemafor 2013-05-03 14:58:45

回答

1

听起来像是你想要做一些Frustum Culling

我不跟熟悉并且XNA的手机应用程序,但我敢肯定它是相同的proccess。

//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帧与帧。

+0

我喜欢你的方法,BoundingFrustum是我以前从未听说过的东西,只是我的逻辑很多 – Cyral 2013-05-03 21:08:22

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); 
    } 
}