GrimoireGL / GrimoireJS

A WebGL framework for Web development.
https://grimoire.gl
MIT License
350 stars 24 forks source link

調査クエスト: GomlNode#remove() がおかしい #569

Open ahy4 opened 6 years ago

ahy4 commented 6 years ago

と思う。気になったので少しだけ検証はした。

実際に消えてほしいNodeとは別のものが消える。removeChildも同様。

メモ: https://grimoirejs.slack.com/archives/C04CQQR6D/p1524666122000852

定義:

  public remove(): void {
    this.children.forEach((c) => {
      c.remove();
    });
    this._sendMessageForced("$$dispose");
    this.removeAllListeners();
    delete GrimoireInterface.nodeDictionary[this.id];
    if (this._parent) {
      this._parent.detachChild(this);
    } else {
      this.setMounted(false);
      if (this.element.parentNode) {
        this.element.parentNode.removeChild(this.element);
      }
    }
    this._deleted = true;
  }
  public removeChild(child: GomlNode): void {
    const node = this.detachChild(child);
    if (node) {
      node.remove();
    }
  }

背景

http://jsdo.it/ahyahya4/eT05

これをつくったけど、消えるべきでないコインが消えてびっくりした。

registerComponetの$update内のthis.node.remove()が該当箇所で、代わりにscene.removeChild(this.node)も試したけど同じ挙動をした。

そもそも俺がremoveChildの使い方を間違えてるってことはある?

ほんじゃあどうするか

いいだしっぺの法則ありますか?

ahy4 commented 6 years ago

https://github.com/GrimoireGL/GrimoireJS/blob/master/test/Node/GomlNodeTest.ts https://github.com/GrimoireGL/GrimoireJS/blob/master/test/Node/GomlNode2Test.ts

このへんでtestは用意されてるっぽいんだけど、回数に関しては1度ずつなので最低限しか保証されてないぽい

上のサンプルだと何回もやっているので、それが原因かもしれない。

そもそも毎回そのバグが発生しているのかどうか目視で確認できない

kyasbal commented 6 years ago

あとで見とく

cx20 commented 6 years ago

事象としては、別のノードが消えるというより、別のノードに紐づいたメッシュ?が表示されなくなっている、という気がします。 image

Inspector では mesh が存在し enabled にもなっているにも関わらず、表示されないケースがある模様。 https://github.com/GrimoireGL/grimoirejs-fundamental/blob/master/src/Components/MeshRendererComponent.ts#L124 ↑ この条件に通らないケースが発生している?