Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

插入结点时对CascadeColor和cascadeOpacity的优化 #640

Closed
wants to merge 2 commits into from
Closed

插入结点时对CascadeColor和cascadeOpacity的优化 #640

wants to merge 2 commits into from

Conversation

colinsusie
Copy link
Contributor

主要优化两个地点:

  1. 当插入子结点时,判断当前结点的cascadeOpacity是否小于255,如果等于255,其实对子结点的opacity不会有影响,因此不用调用updateCascadeOpacity。CascadeColor也一样。
  2. 只需要调用新插入的子结点的updateCascadeOpacity的就行了,不用调自己,否则当自己的子结点越多,这个代价也越大,而且对原有的子结点是做无用功。

@pandamicro
Copy link
Contributor

假设一种情况,child 原来在节点树的另一个节点下,原来的父节点 parentA 的 opacity 为 128,child 受其影响 displayColor 为半透明。此时将 child 从节点树移除,添加到另一个父节点 parentB 下,而 parentB 的 opacity 为 255。此时 updateCascadeOpacity 还是需要调用的,用来更新到正确的透明度。

@WenhaiLin
Copy link
Contributor

@pandamicro @colinsusie 优化的是只需要对新插入的节点调用相关update方法,不需要对其他原本的子节点update。

@WenhaiLin
Copy link
Contributor

@colinsusie 小于255的判断应该去掉

@pandamicro
Copy link
Contributor

优化的是只需要对新插入的节点调用相关update方法,不需要对其他原本的子节点update。

这个新插入的节点也可能是从节点树上取下来的吧?

p.s. 你们一个团队?

@WenhaiLin
Copy link
Contributor

@pandamicro 不是一个团队,我是上来打酱油的,O(∩_∩)O哈哈~
不管是从哪里来的节点,添加进来的新节点update就好,无须对本来的其他子节点update。
@colinsusie 他的修改需要去掉小于255的判断

    if (_cascadeColorEnabled)
    {
	  child->updateCascadeColor();
    }

    if (_cascadeOpacityEnabled)
    {
	  child->updateCascadeOpacity();
    }

@pandamicro
Copy link
Contributor

我是上来打酱油的,O(∩_∩)O哈哈~

这种酱油可以多打一打 哈哈

不过我还是没看懂你的说法,你发的这段不带 255 判断的代码,就是原始代码啊

@toddlxt
Copy link

toddlxt commented May 22, 2017

路过,问一下:可否在node构造的时候加一个标记是否为新node的flag,初始为true,addChild之后设为false。这样如果子节点的flag为true,且父节点的颜色或透明度为255,就不用update子节点了。因为大多数情况下都是addChild一个新节点且父节点都是255。
更准确一些,可以设一个hasUpdatedCascadeColor和一个hasUpdatedCascadeOpacity,初始为false,updateCascadeColor或updateCascadeOpacity的时候设置为true。addChild的时候,如果hasUpdatedCascadeOpacity == true或父节点的opacity<255,再child->updateCascadeOpacity()。

@toddlxt
Copy link

toddlxt commented May 22, 2017

@pandamicro 原始代码没有child->

@colinsusie
Copy link
Contributor Author

@pandamicro 判断255这个确实是没预料到从另一个父结点摘下的情况,后面的修改是增加了child->,而原来是直接调用自己的。你对比一下原来的代码

@colinsusie
Copy link
Contributor Author

colinsusie commented May 22, 2017

@pandamicro 我删除对255的判断了,确实有点激进,你再看看。这次的修改只增加child->

因为对parent的其他child确实是没必要去更新的, 这个修改之后,增加1000个child,可以减少一倍的时间。

89efa26

@pandamicro
Copy link
Contributor

嗯嗯,我现在理解了,谢谢各位~

@colinsusie 麻烦用 rebase 把你的 commit 信息修改为英文,谢谢

@pandamicro pandamicro requested a review from minggo May 22, 2017 03:39
@colinsusie
Copy link
Contributor Author

@pandamicro 不大会用GIT的,整了半天没搞通,要不下次用,或者你们能帮改一下,或者你们自己用改一下代码也可以,抱歉。

@pandamicro
Copy link
Contributor

我下午帮你搞一下

@pandamicro
Copy link
Contributor

pandamicro commented May 22, 2017

提交了一个新的 PR,等 1.5 小版本时更新

gdtdftdqtd pushed a commit to gdtdftdqtd/cocos2d-x-lite that referenced this pull request May 23, 2017
@zhuoxh
Copy link

zhuoxh commented Jul 19, 2017

@WenhaiLin 分析的很对,赞!

@pandamicro pandamicro mentioned this pull request Jul 19, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants