我使用的是libgdx框架1.9.4版本,java是1.7,在eclipse neon和windows 7中进行编码。
这是我如何在世界中计算活动物体的方法。
int num=0;
Array<Body> bodies=new Array<>();
world.getBodies(bodies);
for(Body b:bodies){
if(b.isActive())num++;
}
活动的动态物体通常在100个左右。
这不是所有地形和地下网格、汽车和盒子的绘图问题,成本为6-7毫秒,当box2d调试渲染关闭时我测量了它们,而且当有大约30个盒子时,世界步骤方法调用成本约为30毫秒,而汽车正在撞入它们。
我不加载所有游戏对象(现在只有盒子),我将整个地图分成块,地图大小为100公里,块大小为50米,当汽车在下一个50米范围内(在块范围内)时,我从一个准备好的池中加载盒子(这些对象的box2d世界表示也被池化,当盒子在池中时,我使用setActive(false)来停用它们的box2d body,在加载块时再重新激活)。
我也为地形应用了这个块系统。我在游戏加载时加载所有地形,然后通过使用该方法setActive(false)来停用它们,当汽车穿过地图时,如果块范围包括汽车的x轴坐标,则激活下一个块,其中包含静态物体,其大小约为20个装置,使块大小总共为200米。
绿色线条是活动地形形状,如您所见,在距离左右一段距离后被停用,直到地图结束,这部分来自100公里地形地图中的60公里左右。
当车辆移动更多时,新的盒子将在前方加载,如果它们与汽车相隔20米,则旧的盒子将被池化。
我的问题是
1)这个fps(20 fps)正常并且可以预期吗?(安卓7,这是手机规格http://www.androidpolice.com/2016/02/23/the-general-mobile-gm-5-plus-is-the-most-powerful-android-one-device-yet/)
2)如果100公里的地形会有问题,那么我该如何管理它?
->我尝试激活/停用屏幕矩形外的地形物体。
->我尝试在单个物体上使用数百个装置,或者每个地形块都是单独的物体,但最好的性能是将100公里的地形分成200米的块,每个块是一个物体,包含约20个装置。
3)模拟带有巨大边缘形状的100个动态物体完全不可能吗?(但在赚钱之旅中他们做到了)
4)我应该为这种游戏(一个简单的特定游戏)编写自己的简单物理引擎吗?
5) 对于2D目的,我应该使用Bullet Physics而不是Box2d吗?这可行吗?我会遇到性能问题吗?
如果需要任何代码,请在评论中提出,我会添加。
是否有一些真正快速的物理引擎,我在网上找不到,如果有,您建议改用Box2D吗?
值得注意的是:
我正在以恒定时间步长模拟Box2d,我尝试了1/60, 1/45, 1/30和8-3,6-2作为迭代步骤。
我对所有物体使用高阻尼值,如.9的线性和角度阻尼。
我也想将那些盒子分裂成碎片,实际上我正在这样做,但当汽车被压坏时,我经历了这种fps下降,所以现在我将其禁用。
只有关节是车轮关节,仅用于车轮,在地图的任何其他地方都没有关节。
大小比较真实,这些盒子高1.2米。
对于盒子和汽车,使用多边形形状,对于地形,使用边缘形状(链条形状)。
速度阈值在世界设置中默认为1。
如果有我忘记的任何注释,请在评论中提出,我会分享。
谢谢。