在XNA中优化渲染2D平铺游戏的好方法是什么?

时间:2012-12-28 19:35:15

标签: xna-4.0 2d-games

编辑:我选择了第二种方法,因为即使所有3个图块层都填满整个屏幕,我也获得了150+ fps。

编辑2:我读了很多关于顶点缓冲区对象以及它们如何适用于静态几何体,虽然我仍然不知道如何将我的2D图块转换为VBO并将其存储在GPU内存中,但它看起来确实如此就像其他人正在寻找一种快速渲染静态几何/四边形的方法一样。

我正在制作像Super Meat Boy这样的游戏,并且想知道在数组列表中存储水平图块是否更好/更快,并进行相机边界重叠测试以查看是否应该渲染。

foreach(Tile tile in world.tiles) {
    if(Overlap(camera.bounds, tile))
        render(tile);
}

或者,存储每个网格正方形并且只能在相机边界之间读取的2D数组会更好吗?

int left = (int)(camera.position.x - camera.width/2);
int right = (int)(camera.position.x + camera.width/2) + 1;
int top = (int)(camera.position.y - camera.height/2); // WHY XNA DO YOU UPSIDE DOWN!!!
int bottom = (int)(camera.position.y + camera.width/2) + 1;
for(int x = left; x < right; x++) {
    for(int y = top; y < bottom; y++) {
        render(world.tiles[x][y]);
    }
}

相机可以在屏幕上放置64 * 36个瓷砖,这是2300多个瓷砖,使用后一种方法读取,但是正在对水平中的每个瓷砖进行重叠测试吗?我读了一个关于将相邻的瓷砖连接到一个更大的四边形并重复纹理的答案(尽管我使用纹理图集,所以我不确定如何在纹理上重复一个区域)。

干杯。

1 个答案:

答案 0 :(得分:0)

根据我过去的经验,我可以分享细节。在2D地图中,通常地图就像0 - N长。现在N比屏幕尺寸长得多。现在,我一开始尝试加载所有内容。但它有点开销。好吧,这就像开销一样。我最终得到0 FPS。因为我想要不同类型的物体。因此,即使重复相同的对象和节省内存也无法正常工作。然后我尝试参考屏幕限制事物。因此,对象存在,但它们没有被渲染。因此,它从拉管线移开。并且游戏恢复了生机。

现在,为了进一步提高C#4.0的性能,我可以使用TPL和async并等待绘制。这就像更好的线程版本。所以,你可以在那里扔东西,让它随意渲染。

这是与XNA或任何类型的图形库的交易。有完整的图形渲染管道。这使得事情变得非常缓慢。特别是如果PC老了,只有64MB显卡才支持宽屏。 您的游戏将被部署到任何类型的机器上!! !!

所以,如果我用XNA的语言解释,更新是简单的代码,并尽可能快地运行它,没有什么可以阻止它。但是抽奖在它之前有完整的管道线。这是开始和结束的唯一原因。因此,在结束之后它可以开始将东西推到管道上。 [此处](http://classes.soe.ucsc.edu/cmps020/Winter11/readings/hlsl.pdf)文章供参考。

所以,这里需要一个交易渲染管道,但不需要缓慢和阻塞。只需将其设置为多线程,事情就会更快。如果你想要更简洁,那么你必须使用C#,包括链接列表和东西。但那将是最后阶段。

我希望我已经提供了足够的细节来为您提供答案。如果需要进一步的细节,请告诉我。