直到最近,我們的遊戲通過從場景的背景紋理的一部分獲取顏色數據來檢查碰撞。這很好,但隨着設計的改變,我們需要檢查多個紋理,並決定將這些全部渲染到一個RenderTarget2D並檢查碰撞。是否有一種廉價的方法在每幀的基礎上從RenderTarget2D傳輸顏色數據?
public bool TouchingBlackPixel(GameObject p)
{
/*
Calculate rectangle under the player...
SourceX,SourceY: Position of top left corner of rectangle
SizeX,SizeY: Aproximated (cast to int from float) size of box
*/
Rectangle sourceRectangle = new Rectangle(sourceX, sourceY,
(int)sizeX, (int)sizeY);
Color[] retrievedColor = new Color[(int)(sizeX * sizeY)];
p.tileCurrentlyOn.collisionLayer.GetData(0, sourceRectangle, retrievedColor,
0, retrievedColor.Count());
/*
Check collisions
*/
}
我們一直存在的問題是,自從轉移到渲染目標以來,我們正在經歷FPS的大幅減少。
從我們所讀到的看來,問題在於,爲了從RenderTarget2D獲取數據,您需要將數據從GPU傳輸到CPU,並且速度很慢。由於我們需要兩次運行相同的功能(每個玩家一次)並且不能保持相同的數據(它們可能不在同一個區塊中),這使我們變得更加複雜。
我們已經嘗試將GetData調用移動到tile的Draw函數並將數據存儲在成員數組中,但這似乎沒有解決問題(因爲我們仍然非常有規律地調用GetData - 向下從每次更新兩次到每次抽獎一次)。
任何你可以給我們提供的幫助都會很大,因爲這個碰撞系統給我們帶來的力量是相當不可思議的,但是渲染目標的開銷會導致它無法保持。
你生成一個着色器碰撞層?通常情況下,您會在CPU上保留一個本地副本,並使用該數據結構或衍生數據結構進行碰撞檢測,或處理着色器內的碰撞。 – 2012-03-07 16:17:02
通過在圖形設備上設置渲染目標,然後繪製一個精靈批次來創建碰撞圖層。我不認爲這使用着色器。 – LlamaCloud 2012-03-07 16:55:50