Skip to content

[Skyline] 结合wine使用的想法 #138

Open
@msojocs

Description

@msojocs

任务

  • 确认skyline页面时http server提供的
  • 能否直接使用nodejs(win)调用模块?(不能,必须用nwjs的环境)
  • 确认http server的port如何传输给skyline module
  • 整理渲染流程
  • 开发SharedMemory模块
  • 开发websocket服务端(Wine/Windows)
  • 开发websocket客户端(Linux)
  • Wine与Linux共享内存互访。(关键)
  • 完善交互逻辑
  • 优化交互速度
  • worklet支持(https://github.com/software-mansion/react-native-reanimated)
  • 动画支持(目前没报错,但是体验有问题)

说明

前言

前置信息:#88

Skyline在开发工具中是一个node module,结合SharedMemory使用。

通过进一步分析,发现在开发工具中,本质还是去使用webview加载页面:

Image

分析

04-02 17:30

目前猜测,开发工具调用module后,module创建了一个http webserver;

展示页面访问http页面渲染,重新编译等操作是通过js层直接交互的。


04-02 20:50

使用Linux环境打开Skyline项目,相关地址有生成且默认页面与Windows环境一致;

然后,Linux才出现模块报错。

说明,此HTTP Server是开发者工具创建的;在此Server中,调用了Skyline等模块,与此前猜测不一致。

Image

从此图可知 require 是在页面的 index.js 中执行的;

所以HTTP Server不动最好,对页面的 require 的行为进行代理。


04-02 22:36

初步分析得出的渲染逻辑:

  1. 创建共享内存区域A
  2. Canvas使用WebGL读取内存区域A渲染图像到模拟器区域(无限渲染)
  3. Skyline将源码渲染成图像写入内存区域A
  4. 用户操作界面,通过API通知Skyline
  5. Skyline执行对应操作生成新图像写入内存区域

04-03 17:50

根据渲染逻辑可以确定,SharedMemory模块用于处理共享,逻辑相对简单,先试着实现一个;

实现后,就可以移植到Linux。

  1. 在wine中启动skyline,启动rpc服务器;
  2. Linux端启动rpc客户端。
  3. wine与Linux共享内存互访。

Image

垃圾模块,一调用createWindow就崩溃。


04-07 23:00

createWindow崩溃已解决;(new global.SkylineShell(window)

基础客户/服务端通信开发出初版。

用初版跑的时候,一调用notifyAppLaunch就一直崩溃😫

不知道是不是window, global引起的。。。

待测试,一开始就window = global看会不会崩溃。

04-08 10:00

加个500ms延迟,notifyAppLaunch不崩溃了。

新问题:

搜索报错关键字,找不到。。。怪

Image

在奇怪得地方找到了:

Image


04-08 16:00

拦截SkylineGlobal,有一些额外操作。

Image

04-15 10:00

目前已经实现部分功能,能正常加载 address-book 示例。

支持基础交互。

worklet暂不支持。


04-22 10:00

debugger 发现一处写法有问题,导致 worklet 动画不生效。


04-22 16:00

审查元素时,发现有大量matches调用,导致响应异常的慢。

Image

看起来是在比较类名,应该可以加本地缓存解决;但是,6是什么意思?
Image

6是StyleScope,看来也需要缓存
Image


04-26 22:00

Wine -> sharedMemory(windows) -> shardMemory(linux) -> webview

共享内存工作正常,但是Wine似乎没有把图像数据写入内存区域。

Image


04-30 14:00

抱着试试看的想法,在虚拟机跑了一下,竟然可以;看来是WSL的问题。

Image

想法

在wine中启动一个skyline server(无UI),额外编写一个RPC服务器,在Linux层加入RPC客户端;

把“重新编译”这些操作通过RPC进行交互。

这个wine server可以跑在宿主或者docker环境中。

结语

wine最好是能用,效率不谈(

待验证。。。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions