-
Notifications
You must be signed in to change notification settings - Fork 34
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
自定义backend遇到的一些困惑 #198
Comments
我设想的是service层在backend的方法例如 appendchild,replacechild等方法中发送消息到view层,view层利用原生的appendchild等方式实现 |
这个方向是可行的,但是不能直接将 shadow 协议的后端操作对应到原生方法上。 |
我没尝试过这么做,不过根据经验可以有两个猜测。
|
嗯,好的,我先学习一下 |
嗯,消息合并之类的操作已经做过了。后面的dom树变更优化我再想下 还有我看glass-easel要在10月1号完成 MiniProgram 环境下的 webview 后端,这个任务是指将service和view拆分到两个webview去渲染吗?是跟我上面提的事儿类似吗 |
@Tidyzq 抱歉,没有完全看懂这段代码,和我理解的有点儿不太一样,有几个小疑惑希望能帮忙解答一下:
|
milestone 的 deadline 会根据实际情况调整,并不准确。 glass-easel 的 milestone 通常是项目自身的目标,和正式 landing 到 MiniProgram 环境也不是一回事。 milestone v1.0 的主要目标是接口全面稳定。 |
@Tidyzq 我直接引用了https://github.com/Tidyzq/glass-easel/blob/wip-shadow-sync/glass-easel-shadow-sync/src/backend.ts里面的代码,并把channel替换成了electron的ipc通信,发现还是存在上面的问题:
wxml:
在点击的时候响应很慢,这个消耗貌似不在通信,我看service从接收到点击事件到最后一次的时间间隔都有将近2s的时间,具体可见下图: github-backend.bak.mp4上图中右侧为service即glass-easel backend运行的webview,在点击时,我会先清空数组,然后再赋值300项,并动态渲染元素,可以看到在backend侧间隔时间就要接近2s,所以是不是我的用法有问题? 我本意是想要用glass-easel用来模拟小程序的整体架构,在electron中,backend运行在service的webview中,另一个view的webview接收service传递的消息,现在发现渲染性能并不能满足需求,是我的打开方式有问题吗? 我理解通过glass-easel可以将逻辑处理和渲染层renderer分开,这样我就可以在service中处理逻辑,view中接收service的消息进行渲染,可目前看效果不能达到预期,我这样的设计思路和glass-easel的架构思路相符吗? @LastLeaf @Tidyzq 有时间还请指导一下 |
从视频上看你没有做通讯合并操作,耗时花费在了单次操作的通讯消耗。你可以尝试每个微任务合并通讯。 // 参考 https://github.com/Tidyzq/glass-easel/blob/wip-shadow-sync/glass-easel-shadow-sync/tests/base/env.ts。
const createBridge = () => {
let _cb: ((...args: any[]) => void) | null = null
const subscribe = (cb: (...args: any[]) => void) => {
_cb = cb
}
let queue = []
const publish = (args: readonly any[]): void => {
// 每个微任务合并
queue.push(args)
if (queue.length === 1) {
Promise.resolve().then(() => {
queue.forEach(args => _cb?.(args))
queue = []
})
}
}
return { subscribe, publish }
}
const bridgeToView = createBridge()
const bridgeToData = createBridge()
const messageChannelDataSide = MessageChannelDataSide(
bridgeToView.publish,
bridgeToData.subscribe,
getLinearIdGenerator,
)
const messageChannelViewSide = MessageChannelViewSide(
bridgeToData.publish,
bridgeToView.subscribe,
syncController,
getLinearIdGenerator,
) |
嗯,我再尝试下,这个应该也跟我开着devtool + console有关。不过有一点还是不太了解,用户点击事件到service接收响应再到setData目前不都是框架本身处理的吗?我怎么根据setData去做合并呢?我现在了解到的还是在自定义的context中的相关api里实现自定义逻辑 |
我想做的事情大概是这样:在electron中自定义backend,模式为shadowroot,其中两个webview,service webview运行glass-easel,view webview通过接收service webview的消息进行对dom节点进行绘制,两个webview间通过ipc通信。 在实施过程中,发现如果有1000个循环节点的发,要发送14000多次消息,渲染延迟1-2s。我理解是不是某些service的动作不需要通信消耗,这块有什么好建议吗?感觉现在通信消耗大大的延缓了界面的绘制与响应。
或者这个方向可行吗
The text was updated successfully, but these errors were encountered: