每次尝试使用cocos的新功能 都会有惊喜

不是主域弹出弹窗显示加载中,然后刷新子域的内容嘛?弹窗效果也要子域做,主域代码都复用不了啊

这里应该考虑开发者使用和理解过程的一般情况,来降低新人的开发成本,减少弯路(直觉是第一老师):

  1. 主域有弹窗功能(可能包含动效)那么顺理成章的开发者会先复用这个弹窗(如果你没动效果,那就没这个坑)
  2. 子域的第一个学习成本是将子域理解成是一张图片(无论cocos和微信都是这么解释的)
  3. 将一张图片(子域),放在我的带动画的弹窗中(这个是合理的,不需要理解成本)
  4. 剩下的就是渲染正确(包括显示和触摸,这个应该引擎解决)

按照 jare 你的这个解释,那就变成了这个过程:

  1. 主域只支持 active = true 这种情况,不能将子域这个“图片”放在任何动画node中,否则会出现触摸区域异常(无法点击和拖动)
  2. 你认为动画缩放的效果都应该放在子域中,但是子域推荐减小模块体积和功能,甚至新版推荐使用 doTjs xml 这种方式开发。但使用这个方式做一个弹窗缩放动画,无疑是高成本。而且这些效果需要和主域的效果统一。
  3. 子域想做的事儿,应该只有一个:渲染和主域对应节点尺寸始终保持一致的图片(包括显示区域和触摸区域)

@jare 翻了一下源码,解释一下 SubContextView 为啥有毛病,有两种 hack 方式可以解决这个问题,看图说话:

不知道 @_PP 大佬是不是你改的这个,目的思路是为啥改成私有,原来解决上面的问题都是手动调用这个方法的。能问下么:

主域做缩放的话,子域每一帧都要 resize 整个 buffer 吗?不 resize 的话,就会因为拉伸导致模糊

不需要吧,子域是固定大小。主域只是缩放容器,就比如子域是一个 200x400 的图片。主域里把这个图片的节点node A挂在一个 node P 下面,动画只缩放 P 的 scale,子域所在的 node A 的相对缩放始终是 (1,1),没有进行拉伸,子域的分辨率也始终是不变的

那就会糊了,当然你会觉得无所谓…… 毕竟只是一个动效。其实对于正常公司来说,主域和子域要弹窗做动效,主域和子域都有方案能做到,都能复用。或许对某些“极简”的子域来说做动画是很难实现的,这种情况下主域确实有优势。我对现有子域的实现不太熟悉,就不干涉研发同学的方案了。当我没说过吧。