1

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

编辑 2:我阅读了很多关于顶点缓冲区对象以及它们如何适用于静态几何的内容,尽管我仍然不知道如何将我的 2D 切片转换为 VBO 并将其存储在 GPU 内存中,但这绝对是一种方式如果其他人正在寻找一种快速渲染静态几何体/四边形的方法。

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

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

或者存储每个网格正方形并且仅在相机边界之间读取的二维数组会更好吗?

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 个奇数块,但是对关卡中的每个块进行重叠测试会更好吗?我读了一个关于将匹配的相邻图块连接成一个更大的四边形并只是重复纹理的答案(尽管我使用的是纹理图集,所以我不确定如何在纹理上重复一个区域)。

干杯,伙计们。

4

1 回答 1

0

根据我过去的经验,我可以分享细节。在 2D 地图中,通常地图的长度为 0 - N。现在 N 比屏幕尺寸长得多。现在起初我试图一次加载所有内容。但这有点开销。好吧,这就像一个开销很大。我最终得到 0 FPS。因为我想要不同类型的对象。因此,即使重复相同的对象并节省内存也不起作用。然后我尝试参考屏幕来限制事物。所以,物体在那里,但它们没有被渲染。因此,它远离绘制管线。和游戏起死回生。

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

这是 XNA 或任何类型的图形库的交易。有完整的图形渲染管线。这让事情变得很慢。特别是如果 PC 很旧,只有 64MB 显卡,只能支持宽屏。您的游戏将被部署到任何类型的机器上,对吗??!!

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

So, here is a deal rendering pipeline is needed but there is no need that is should be slow and blocking. Just make it multi-threaded and things will quite faster for you. If you want more terse then you have to use C# at it fullest including Linked list and stuff. But that will be like last stage.

I hope I have given enough details to provide you an answer. Please let me know if any further details needed.

于 2013-08-09T05:46:27.937 回答