Cocos Creator ScrollView 性能优化之 UISuperScrollView 开箱即用

问题一 是因为每帧创建的数量不止一个 刷新是每帧刷新一次 不能做到创建一个就马上刷新 这属于正常显现

跳转到指定位置的话目前没这个功能 如果自己改的话不建议直接修改y轴 建议通过计算item在整个列表的百分比 然后使用scrollview.scrollTo…方法来跳转

问题一:“一帧一个”只是我一个试验条件,我的想表达的是,当需要分成多帧创建时候,会明显看到不是每帧刷新一次而是: item 确实分帧创建,但是都是以初始状态出现,直到最后一个 item 创建完成,所有 item 才一起刷新,所以观察 item 会明显看到从初始状态到刷新的过程

而这种情况在“一帧一个”的条件下特别明显,如果每帧刷新一次,理论上来说是看不到 item 的初始状态的。demo:scrollview.zip (254.0 KB)

问题二:我第一反应就是用 ScrollView.scrollTo ,但是试验后发现,scrollTo 最多只能滚动到虚拟列表真正存在 item 的首尾位置,然后就停下了

问题一 我明白了 抽空我优化一下
问题二 滚动到指定item位置这个我后续会加上

感谢。
顺便请教个问题,在 UISuperLayout.exeGenerator 这个分帧执行方法中,我看是用消耗的毫秒数来跟传入的参数作比较,这样无法保证每帧执行次数吧?这是故意这样写的吗。
因为我见过的分帧执行都是用计数的方法,以保证每帧执行次数固定

问题一我已经提交 你重新拉一下

分帧创建方法有很多种 你也可以改写一下

滚动條显示似乎不正确

因为固定了content的尺寸所以滚动条计算就不对了 你可以继承后重写计算那一块 使用getReallySize 来代替原来的 getContentSize

战术性插眼

layout.scrollToFooter() 有个问题,如下操作:

  1. 打开示例的 Grid 正序排列
  2. 点击 +1,然后 +100
  3. 点击 ↓ 滚动到底部

预期效果:(也就是手动划到底部的效果,101 % 4 = 1

实际效果:

1赞

另外对于 item 的复用,在 layout.asyncCreateItem() 中:

  • 情况一:已有 item 且够用,则删除多余并返回,然后刷新全部 item
  • 情况二:没有 item,则分帧创建,每次创建马上刷新 item 自身,分帧结束后刷新全部 item
  • 情况三:已有 item 且不够用,则分帧创建所缺的数量,逻辑同情况二

问题来了,情况三创建新 item 之前,并没有对旧 item 先刷新。
所以如果调用 layer.total() 前后复用的 item 对应的内容不同,就会明显看到:
旧内容保持不变,新内容开始加入,
直到新内容加载完毕,旧内容才更新。

我目前是在分帧开始之前刷新旧 item 来解决

    /** 分帧创建item */
    private async asyncCreateItem(value: number) {
        this._gener?.return("")//取消上一次的分帧任务(如果任务正在执行)
        // 有多余的item 需要删除 不处理
        if (this.node.childrenCount > value) return this.removeChilds(value)
        // 已经固定item总数 不处理
        if (this._maxPrefabTotal > 0 && this._maxPrefabTotal == this.node.childrenCount) return
        for (let i = 0; i < this._children.length; i++) {
            const child = this._children[i];
            this.notifyRefreshItem(child)
        }
        // 开始分帧创建item
        ......
    }
2赞

对 你在这里刷新没有什么问题 只是同一个item可能会刷新多次 如果对显示有高要求的话这么做没问题的

嗯 这个问题我知道 感觉影响不是很大 不保持滑动的效果只是为了减少一些逻辑复杂度

效果还可以,mark

如果只是滚动到底部,并只在底部范围内滚动,就不会有什么问题。
但是这时如果用户手动划到顶部,在顶部数据进入渲染区间的时候,就会有不自然的切换了
2021-02-06-15-15-0400_00_01--00_00_21

1赞

@icipiqkm 您好,滚动到指定Item位置的功能有了吗,项目现在需要用…

1赞

mark!

mark!

这个看上去很酷,mark一下。

Mark!!! :+1:

请问drawcall方面的数据怎么样