运行时说明
内容运行在 JavaScriptCore 里,不是浏览器。类型声明(API 参考)依据引擎源代码整理,只包含真实可用的 API。要点:
- 没有 DOM 和 Node.js:没有
document、window,网络见网络,localStorage和文件见存储和文件,声音见音频。运行时的模块是 CommonJS 的require();要用import请放进src/由 SDK 打包(见项目和构建)。 DesktopEngine.system.cpuUsage()/memoryUsage()提供 CPU 和内存用量,需要system-info权限,没有时抛出错误。
画布
- Canvas 支持 2D、WebGL 1 和 WebGL 2(
getContext('webgl2'),基于 ANGLE 的 OpenGL ES 3.0)。texImage3D/texSubImage3D也接受图片、ImageData和画布,各层在源图中自上而下排列(层间距由UNPACK_IMAGE_HEIGHT决定,默认等于 height)。Apple 芯片的 Mac 提供WEBGL_compressed_texture_astc。 - 和浏览器一样,WebGL 2 上下文不是
instanceof WebGLRenderingContext,要判断版本请用instanceof WebGL2RenderingContext。 - Canvas 用 Metal 渲染,显卡不支持 Metal 的老 Mac 上所有
getContext都返回 null、CanvasImage加载失败,要检查返回值。 - 画布默认带透明通道(与 Web 一致),小组件和桌面伙伴的窗口是透明的,没画到的地方能看到桌面。
- 画布的绘图缓冲区(
width×height)会拉伸到样式的大小,默认平滑缩放。像素画可以用小的缓冲区、按 1:1 绘制,再设样式imageRendering: 'pixelated'放大成清晰的方块(内置的像素猫就是这样画的);'crisp-edges'缩小时也不做平滑。 - 画布跟随显示器的缩放比例,见显示器和缩放。
- GPU 给一帧的工作最多几秒。画布超过这个时间(一次绘制量极大、着色器长时间循环)时,macOS 会重置 GPU,整个屏幕会卡住片刻。为了不让这种情况再次发生,这个画布的上下文会就此丢失:画布触发
webglcontextlost(2D 是contextlost),保留最后显示的画面,之后不再绘制;上下文的isContextLost()返回 true。每帧的 GPU 工作要尽量少,大画布尤其如此。shadowBlur很大的阴影会在较低分辨率下模糊,看起来没有区别。 - WebGL 的缓冲、纹理、着色器程序在调用
gl.deleteXxx()或画布销毁时释放;JS 里不再引用它们不会删除它们(它们可能还绑定着)。不停创建资源的程序要自己delete。
还没有的
- 签名、上传审核和在线内容库:目前通过导入 .zip 或文件夹分发。
files、now-playing、window-positions权限对应的 API。- 读取系统的音频输出(音乐可视化)、IndexedDB。
- 运行时原生支持 ES 模块(目前通过
src/打包解决)。
需要的功能可以在 GitHub 上提出。
