【发布时间】:2012-03-07 15:54:47
【问题描述】:
直到最近,我们的游戏通过从场景背景纹理的一部分中获取颜色数据来检查碰撞。这工作得很好,但是随着设计的改变,我们需要检查多个纹理,因此决定将这些全部渲染到单个 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 调用移动到磁贴的 Draw 函数并将数据存储在成员数组中,但这似乎并没有解决问题(因为我们仍然经常在磁贴上调用 GetData - 从每次更新两次到每次抽奖一次)。
您能给我们的任何帮助都会非常棒,因为这个碰撞系统为我们提供的功能非常棒,但是渲染目标引入的开销将使其无法保留。
【问题讨论】:
-
您是否在着色器中生成碰撞层?通常,您会在 CPU 上保留一个本地副本,并使用该副本或派生数据结构进行碰撞检测,或者在着色器中处理碰撞。
-
碰撞层是通过在图形设备上设置渲染目标然后绘制一个精灵批次来创建的。我不认为这使用着色器。