Skip to content

采取延迟同步可行性研究 #28

Open
@jabbany

Description

@jabbany

有关属性更新目前效率相对低。比如 elem.x = 100, elem.y = 100, elem.rotation = 90 实际上会执行三次 postMessage操作每次更新一个属性。

本Issue将研究如果每次更改参数,并不立即发送 message而是在每次 enterFrame操作触发后在一批发送更新,或许可能提高弹幕的运行效率,同时因为所有的操作都会被缓存,同时连续 obj.x = 100, obj.x = 200 将可以合并成一个属性更新记录。

有关缺点:

  • 延时性:虽然enterFrame是理论刷新率,但是毕竟还是和实时不一样,而且在现实中很可能低于系统实际支持的传输效率(默认为24fps),这可能导致有一些属性更新产生微小但可能可察觉的延时。提高enterFrame到 60fps 或许会解决延时问题,但是将导致很多动画触发太快而悲剧。
  • enterFrame总线繁忙:这样归类之后,每次enterFrame发送的信息包就变大了,而且所有DO的enterFrame是一起触发的,那么有可能导致总线堵塞,产生更新卡顿。(但是因为函数都是异步的又是nonblocking,应该不会卡)
    -一次PostMessage很大,据说Firefox有bug(未确认,可能已修)

有关优点:

  • 减少接口消息频率
  • 能优化/合并操作
  • 帧率是真的帧率了
  • 方便迅速地自动适应平台特征:(在移动平台等渲染速度慢的平台上,可以在外部动态测更新率,然后同步到沙箱内,这样沙箱里面的事件发送率降低,相当于可以强制 drop frame,更好的平和的支持移动平台。

实现:
实现并不难,只要挂接DisplayObject的全局的 callMethod 和 updateProperty,增加一个操作queue(updateProperty的基于一个哈希,callMethod则可以使用List),然后挂在到 enterFrame的末端发送事件,如果没有更新不发送。在客户端监听特殊的时间然后重新异步派发到各个影子Object实例

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions