Java中的低FPS
你好,我叫Ryan,目前正在开发自己的2D java游戏。目前,游戏世界中有很多对象。在游戏的新开始时,通过使用arraylist和tree类,世界上随机放置了100棵树。我的游戏使用一个名为Java中的低FPS,java,performance,frame-rate,Java,Performance,Frame Rate,你好,我叫Ryan,目前正在开发自己的2D java游戏。目前,游戏世界中有很多对象。在游戏的新开始时,通过使用arraylist和tree类,世界上随机放置了100棵树。我的游戏使用一个名为checkcollisions的类来检查玩家是否与任何树相交。然后将此方法放入update方法中。当这个方法没有被调用时,我得到了额外的100fps,还有没有我仍然可以得到这个100fps,但仍然检查碰撞?我真的需要一个FPS的提升,因为我的游戏目前运行在30-50 FPS 以下是检查代码: public
checkcollisions
的类来检查玩家是否与任何树相交。然后将此方法放入update
方法中。当这个方法没有被调用时,我得到了额外的100fps,还有没有我仍然可以得到这个100fps,但仍然检查碰撞?我真的需要一个FPS的提升,因为我的游戏目前运行在30-50 FPS
以下是检查代码:
public void checkCollisions() {
for (int i = 0; i < Placing_Objects.Small_Trees.size(); i++) {
if (player.getBounds().intersects(Placing_Objects.getSmall_Tree().get(i).getBounds())) {
if (gotAxeOn) {Placing_Objects.Small_Trees.get(i).health -= rand.nextInt(3);}
}
if (Placing_Objects.Small_Trees.get(i).health <= 0) {
Placing_Objects.removeSmall_Tree(Placing_Objects.Small_Trees.get(i));
Inventory.addItemToInv("Wood");
Inventory.addItemToInv("Wood");
Inventory.addItemToInv("Stick");
Player.exp += rand.nextInt(3);
challenges.choppedDownTrees += 1;
}
}
}
public void checkCollisions(){
对于(int i=0;i 如果(放置对象。小树。获取(i).health仅检查与玩家附近的树或当前可见矩形内的树的冲突。要有效执行此操作,请保留可见的对象数组并仅在这些对象上迭代。仅检查与玩家附近的树或当前可见矩形内的树的冲突角度。要有效地执行此操作,请保留一组可见的对象,并仅在这些对象上进行迭代。使用空间数据结构进行碰撞测试。有了这样的结构,您可以大量减少测试数量
两个简单但高效的2d结构是or a
可以找到与java中kd树实现的链接相关的问题。使用空间数据结构进行冲突测试。使用这种结构,可以大量减少测试数量
两个简单但高效的2d结构是or a
可以找到一个与java中kd树实现的链接相关的问题。不要在Swing事件调度线程中检查冲突。创建一个执行此操作的并发线程,事件线程只将它们分配给它。通过最大限度地只检查屏幕上的树来减少检查的冲突量。不要检查冲突在Swing事件调度线程中创建一个并发线程,然后事件线程简单地将它们分配给它。通过对屏幕上的树进行最大限度的检查来减少检查的冲突量。正如Wilbert提到的,kd树将是完美的解决方案。
对于包含大量非移动对象的简单2d游戏,您可以尝试一种更简单的方法:
首先,按照已经完成的步骤设置所有树:
把这些树都放在你的列表里
无需将游戏场分隔为x个大小相同的矩形(例如3x5=15)并检查哪些树与哪个区域相交。将这些计算保存在适当的数据结构中。例如:
HashMap<Rectangle, ArrayList<Tree>> fieldSperation;
HashMap字段解析;
树中的白色数字表示它们相交的矩形。一棵树可能与多个矩形相交。然后必须在两个或多个列表中保留引用(例如6/7或7/12)
最后,您可以调整checkCollisions()方法,如下所示:
public void checkCollisions() {
// 1. check which Rectangle intersects with the player (can be a maximum of 4)
for (Rectangle r : fieldSeperation.keySet()) {
if (playerRect.intersect(r)) {
// 2. do your collision detection with those trees which are intersecting with those
// trees which are intersecting with the rectangles from 1.)
for (List<Tree> ts : fieldSeperation.get(r)) {
// your old code here
}
}
}
}
public void checkCollisions(){
//1.检查哪个矩形与播放器相交(最多4个)
对于(矩形r:fieldseparation.keySet()){
如果(playerRect.intersect(r)){
//2.与这些树相交的树进行碰撞检测
//从1开始与矩形相交的树。)
for(列表ts:fieldseparation.get(r)){
//你的旧代码在这里
}
}
}
}
我确信这种技术足以满足您的性能要求。正如Wilbert提到的,kd树将是完美的解决方案。
对于包含大量非移动对象的简单2d游戏,您可以尝试一种更简单的方法:
首先,按照已经完成的步骤设置所有树:
把这些树都放在你的列表里
无需将游戏场分隔为x个大小相同的矩形(例如3x5=15)并检查哪些树与哪个区域相交。将这些计算保存在适当的数据结构中。例如:
HashMap<Rectangle, ArrayList<Tree>> fieldSperation;
HashMap字段解析;
树中的白色数字表示它们相交的矩形。一棵树可能与多个矩形相交。然后必须在两个或多个列表中保留引用(例如6/7或7/12)
最后,您可以调整checkCollisions()方法,如下所示:
public void checkCollisions() {
// 1. check which Rectangle intersects with the player (can be a maximum of 4)
for (Rectangle r : fieldSeperation.keySet()) {
if (playerRect.intersect(r)) {
// 2. do your collision detection with those trees which are intersecting with those
// trees which are intersecting with the rectangles from 1.)
for (List<Tree> ts : fieldSeperation.get(r)) {
// your old code here
}
}
}
}
public void checkCollisions(){
//1.检查哪个矩形与播放器相交(最多4个)
对于(矩形r:fieldseparation.keySet()){
如果(playerRect.intersect(r)){
//2.与这些树相交的树进行碰撞检测
//从1开始与矩形相交的树。)
for(列表ts:fieldseparation.get(r)){
//你的旧代码在这里
}
}
}
}
我非常确信这项技术将足以满足您的性能要求。我刚刚重新整理了代码,现在工作正常!感谢所有帮助过您的人,我也很抱歉多次发布此问题……我是新手,不知道我在做什么。再次感谢您在ne中帮助过开发人员的所有人ed!这是新代码:
for (int i = 0; i < Placing_Objects.Small_Trees.size(); i++) {
if (gotAxeOn) {
if (player.getBounds().intersects(Placing_Objects.getSmall_Tree().get(i).getBounds())) {
Placing_Objects.Small_Trees.get(i).health -= rand.nextInt(3);
}
}
if (Placing_Objects.Small_Trees.get(i).health <= 0) {
Placing_Objects.removeSmall_Tree(Placing_Objects.Small_Trees.get(i));
Inventory.addItemToInv("Wood");
Inventory.addItemToInv("Wood");
Inventory.addItemToInv("Stick");
Player.exp += rand.nextInt(3);
challenges.choppedDownTrees += 1;
}
}
for(int i=0;i