首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >2D物理游戏性能问题(安卓系统中的libgdx box2d )

2D物理游戏性能问题(安卓系统中的libgdx box2d )
EN

Stack Overflow用户
提问于 2017-02-20 13:55:25
回答 1查看 3K关注 0票数 4

我正在制作一个2D汽车游戏,就像“挣到死2”,我几乎已经完成了。唯一的问题是物理引擎的性能。我正在使用box2d和有10米长的边缘形状,完全建立了100公里的地形。一辆车,通常是30-40箱。活动动态物体的数量约为60-100,最多为120.游戏流畅的工作在桌面上,但在安卓fps下降到30以下时,活跃的身体超过60。车与箱、箱之间都有碰撞。

我使用libgdx框架1.9.4作为版本,java是1.7,编码使用eclipse,windows 7。

这就是我如何计算世界上活跃的身体。

代码语言:javascript
运行
复制
    int num=0;
    Array<Body> bodies=new Array<>();
    world.getBodies(bodies);
    for(Body b:bodies){
        if(b.isActive())num++;
    }

活跃的动态物体通常在100左右。

这不是一个绘制所有地形和地下网格的问题,汽车和盒子花费6-7英里秒,我在box2d调试呈现关闭时测量了它们,当车压入时,world step方法调用成本约为30毫秒。

我没有加载所有的游戏对象(现在是盒子),我把整个地图分割成块,地图大小是100公里,块大小是50米,当汽车在接下来的50米(在块范围内)时,我从一个现成的池中加载这些盒子(这些对象的box2d世界表示也被池化了,当这些盒子在池中时,我用setActive(false)禁用了它们的box2d身体,当块加载时恢复为真)。

我也把这个块系统应用于地形。当游戏加载时,我加载所有的地形,然后用这种方法设置setActive(false),当汽车在地图上运行时,如果块范围包括汽车的x轴坐标,我激活下一个块,其中包含约20个大小为10米的固定装置的地形静态体,使块大小总共为200米。

绿线是活跃的地形形状,如你所看到的,在一段距离被关闭后,直到地图的结束,这部分是从地图的大约60公里在100公里的地形图中间。

当车辆移动时,前方将装载更多的新箱子,如果它们距离汽车20米的话,旧的箱子就会汇集起来。

我的问题是

1)这个fps (20 fps)正常吗?(android 7,这是电话规范http://www.androidpolice.com/2016/02/23/the-general-mobile-gm-5-plus-is-the-most-powerful-android-one-device-yet/)

( 2) 100公里的地形是否有问题?如果是这样,我该如何管理?

当地形体离开屏幕矩形时,->I尝试激活/禁用地形体。

->I尝试了数百个固定在一个单一的身体或每一个地形片是作为分离的身体,但我最好的表现与我把100公里的地形分成200米块,每块是一个身体和约20个固定装置。

3)用巨大的边缘地形模拟100个动态物体是完全不可能的?(但在赚钱的过程中他们做到了)

( 4)我应该只为这种游戏(一个简单的特定游戏)写我自己的简单物理吗?

( 5)为了2D目的,我应该使用子弹物理学而不是box2d吗?有可能吗?我会面对性能问题吗?

如果您需要任何代码,请评论,我会添加。

如果你建议改变box2D,我在网上找不到任何真正快速的物理引擎吗?

值得注意的是:

我用恒定的时间步长模拟box2d,我尝试了1/60 1/45 1/30和8-3,6-2作为迭代步骤。

对于所有物体,我都使用像.9这样的高阻尼值来表示线性和角度。

我也想把这些盒子分割成碎片,实际上我正在做,但是当汽车被压碎时,我没有撕开下摆,我正在经历这个fps下降,所以我暂时禁用了它。

只有关节是车轮接头,并用于汽车车轮,在地图上的任何地方不再使用关节。

尺寸是真实的,那些盒子有1.2米高。

用于盒子和汽车的多边形形状,用于地形边缘的形状(链状)

在世界范围内,速度阈值为1作为默认设置。

如果有任何笔记,我忘记了,请评论,我将分享。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-05 14:52:39

免责声明:我不能回答你所有的问题,下面只是我的猜测。

几年前,我用Java + box2d +平原Opengl (LWJGL)开发了一个游戏原型和游戏库。

我想你正面临着一些我想到的问题。

然而,以我的低经验,我可能是错的。

如果专家(读者)认为我的帖子有任何错误,请评论下面,我会修复它。

我猜

Java速度慢/不太适合于游戏.

免责声明:这方面有很多争论。

我不是一个足够的专家在这里提出一个坚实的声明,但我看到我的游戏原型运行3x-10倍的C++比Java快很多。(使用不太不同的算法)

内存碎片

您可能已经知道,即使您使用池,与C++相比,它仍然非常差。

你可以汇集所有的盒子,但是你不能把所有的东西都集中起来,比如游戏逻辑数据-结构,vector2D,普通数组(new[]经常),一些你使用的库中的一些恐怖算法。

失活的物体仍然消耗记忆(间接强化记忆碎片)。

你有很多静态体/静态体的高度复杂性.

你没有提到你有多少静止的身体,以及它们是什么。

你在地形上使用高数量的顶点形状吗?

像Box2D和子弹这样的流行的物理引擎在凸形上很酷,而在原始形状上很擅长,但是在凹形(例如你的可怕的)中却工作得很差。

你的形状在不断地相互碰撞。

例如,一堆100盒的计算量比分散在现场的100盒要高得多。

太大世界

据我所知,box2d将一个场景(世界)划分为一个网格。如果您的世界非常大,但是很多身体群集在网格的同一单元中,那么Box2D的工作情况就会相对较差。

它不仅限于Box2D。

子弹和Ogre3D --在某些配置中--也受到这个问题的影响。

回答(再猜一遍)

( 1)这个fps (20 fps)正常吗?

我不知道moblie,但您的代码仍然可以在某些方面进行优化。(见下文)

( 2) 100公里的地形是否有问题?如果是这样,我该如何管理?

非聚焦块->移除身体(而不仅仅是去激活它)。

是的,说起来容易做起来难,你可以只是关闭块附近的块,但删除(删除)块中所有的主体是遥远的(> 3块-距离,可能是)。

如果删除的块可以回到现场,您可能必须找到一个方法来保存它的某个地方。(例如只保留身体、大小、重量的位置)

3)用巨大的边缘地形模拟100个动态物体是完全不可能的?(但在赚钱的过程中他们做到了)

是他们干的还是你以为是他们干的?

在某些方面,编程是一门艺术。

您看到的东西可能与它们的实际实现方式有很大的不同。

你的瓶颈可能只是地形-降低它的细节水平也可能有帮助。

( 4)我应该只为这种游戏(一个简单的特定游戏)写我自己的简单物理吗?

不,只是你想学,而且有很多时间-真的很喜欢数学。

( 5)为了2D目的,我应该使用子弹物理学而不是box2d吗?有可能吗?我会面对性能问题吗?

我想你还会在某种程度上面对。

约束对于Box2D和Box2D来说都是昂贵的

你确定你真的需要约束吗?

在某些情况下,可以避免它的复合形状/修改设计的游戏一点。

我认为,如果您更改为C++和will,您至少可以获得3倍的性能,但是--我不太确定--在上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42346463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档