首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Box2dLights:当配置灯+ ConeLight不起作用时的致命错误

Box2dLights:当配置灯+ ConeLight不起作用时的致命错误
EN

Stack Overflow用户
提问于 2016-12-30 18:20:02
回答 2查看 149关注 0票数 0

谢谢你顺道过来。

我对Box2DLights有两个问题。

第一个问题没那么重要,第二个问题,

#1 :处理灯

我有多个PointLights,跟在一个射瓶后面。所以每个射瓶都有一个ArrayList,里面有它所需要的所有PointLights。当射门击中一个物体时,所有的灯都应该被处理掉。显然这是个问题。

代码语言:javascript
复制
if(hit){
      deleted = true;
      for(int i = 0; i<myLight.size();i++){
         myLight.get(i).dispose();
       }
}

这会导致致命的外泄。

Java检测到一个致命错误: EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffc6fc59f58,pid=6944,tid=6676 JRE版本: Java(TM) SE Runtime Environment (8.0_45-b15) (build 1.8.0_45-b15) Java : Java HotSpot(TM) 64位服务器VM (25.45-b02混合模式windows-A 64压缩oops)有问题的帧:C ntdll.dll+0x39f58写核心转储失败。默认情况下,在Windows的客户端版本上不启用微型转储

问题是,我猜,一个被释放的对象在某种程度上不能被ArrayList引用。问题是如何更好地做到这一点。

#2 : ConeLight撞毁了我的JavaTm (?)

在我的游戏中添加ConeLight时

代码语言:javascript
复制
playerLight = new ConeLight(this,100,Color.WHITE,100,1920f/2f,1080f/2f,0,60);

//used "this" because I called this method in a class that extends RayHandler

我的游戏只是冻结在主菜单中时,按“播放”,MainMenu屏幕刚刚冻结,一个小窗口显示:

Java(TM) SE二进制文件不再起作用了

然而,PointLight却工作得很好。老实说,我不知道这是我的错还是窃听器。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-15 13:59:45

我终于解决了。这是一个相当愚蠢的错误:

由于我并不真的需要一个World对象,但是RayHandler构造函数确实需要,所以我创建了一个World,给了它一个ray处理程序,然后将它处理掉。愚蠢,我知道。所以而不是

代码语言:javascript
复制
    public void create(){
       ....
       World world = new World(new Vector2(0,0),false);
       rayHandler = new RayHandler(world);
       world.dispose;
    }

您需要将world.dispose移动到dispose方法,并使world成为一个字段。

代码语言:javascript
复制
public void create(){
       ....
       world = new World(new Vector2(0,0),false);
       rayHandler = new RayHandler(world);

    }
...
public void dispose(){
      ...
      rayHandler.dispose;
      world.dispose();
}
票数 0
EN

Stack Overflow用户

发布于 2016-12-31 19:29:55

回答你的问题#1 -在处理灯光之前,您应该从rayHandler中删除它。否则,rayHandler将尝试处理已释放的光,这似乎是您正在遭受的崩溃。

代码语言:javascript
复制
myLight.get(i).remove();

而不是

代码语言:javascript
复制
myLight.get(i).dispose();

这里的第二点是,您可能不应该创建和处理每次灯。由于性能原因(轻型实例化相当重),您可以更好地使用池。有了池,您可以使用remove(false) ()和add()方法来完成这个任务。

关于问题#2 -我不认为ConeLight构造器参数有任何问题,使用ConeLight的测试也不会重现您的崩溃。因此,问题可能出现在扩展类中(或不存在)。我建议您更精确地调试和定位问题所在。

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

https://stackoverflow.com/questions/41400822

复制
相关文章

相似问题

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