2013-05-03 24 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); 
    } 
}