BaseGameActivity.runOnUpdateThread() 与 Entity.registerUpdateHandler()

2024-04-01

如果我执行有什么区别Runnable with runOnUpdateThread()或者我将更新处理程序注册到实体中并用它执行代码?

我想删除一个Sprite从场景Sprite.detachSelf()。在这种情况下,教程说必须在更新线程中调用此方法BaseGameActivity.runOnUpdateThread()。但是通过这个解决方案,我必须将活动对象传递给每个想要使用的对象runOnUpdateThread()。嗯...我不喜欢它。

我的问题是如果我创建一个RunnableHandler实体中的对象并将其注册到registerUpdateHandler()并将新的 Runnable 添加到RunnableHandler,这个解与runOnUpdateThread()功能。这是Runnable在更新线程中执行?

/* MySprite is attached to a Scene object */
public class MySprite extends Sprite {
   private final RunnableHandler UPDATE_HANDLER = new RunnableHandler();

   public MySprite() {
       registerUpdateHandler(UPDATE_HANDLER);
   }

   /* called when the sprite has to be removed from scene */
   public void removeMyself() {
       Runnable r = new Runnable() {
           public void run() {
               detachSelf();
           }
       };
       UPDATE_HANDLER.postRunnable(r);
   }
}

我问这个是因为使用标准解决方案一切正常。但通过更新处理程序解决方案,我得到了这个异常:

致命异常:UpdateThread java.lang.IndexOutOfBoundsException:无效索引 19,大小为 19 在java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 在 java.util.ArrayList.get(ArrayList.java:308) 在 org.andengine.entity.Entity.onManagedUpdate(Entity.java:1402) 在 org.andengine.entity.scene.Scene.onManagedUpdate(Scene.java:284) 在 org.andengine.entity.Entity.onUpdate(Entity.java:1167) 在 org.andengine.engine.Engine.onUpdateScene(Engine.java:591) 在 org.andengine.engine.Engine.onUpdate(Engine.java:586) 在 org.andengine.engine.Engine.onTickUpdate(Engine.java:548) 在 org.andengine.engine.Engine$UpdateThread.run(Engine.java:820)

它通常在调用附加/分离函数时出现not在更新线程中。我对吗? 预先感谢您的帮助。


查看源代码中Entity https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L1400理论上发生的情况是:

  1. 显示的行选取实体计数 = 19(来自日志)
  2. 其中一个entity.get(i).onUpdate() 调用removeMyself()
  3. detachSelf 的可运行程序已排队。
  4. 下一个entity.get(i).onUpdate()将导致UpdateHandler通过以下方式运行onUpdate https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L1165(更新处理程序在 onManagedUpdate 中运行)
  5. the 分离自我 https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L705从父列表(调用者)中删除子项(其中条目计数仍为 19,但 mChildren/entities 的长度现在为 18)

只是查看代码的理论......我认为开始获得答案的一个好点是查看循环Entity https://github.com/nicolasgramlich/AndEngine/blob/GLES2/src/org/andengine/entity/Entity.java#L1400并查看“实体”在循环期间是否被修改。 (注意:“最终实体”只是防止重新分配变量,而不是修改列表)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BaseGameActivity.runOnUpdateThread() 与 Entity.registerUpdateHandler() 的相关文章

随机推荐