跳转到主内容

离屏渲染

概览

离屏渲染允许你以位图或共享 GPU 纹理的形式获取一个 BrowserWindow 的内容,这样它就能在任意位置渲染,比如在一个 3D 场景内的纹理上。 Electron中的离屏渲染使用与 Chromium Embedded Framework 项目类似的方法。

注意

  • 有两种渲染模式可以使用(见下),只有未渲染区域传递到 绘图 事件才能提高效率。
  • 您可以停止/继续渲染并设置帧速率。
  • webPreferences.offscreen.useSharedTexturefalse 时,最大帧率是 240,因为更大的值只会带来性能损失而不会有任何好处。
  • 当网页上没有发生任何情况时,不会生成帧。
  • 一个离屏窗口总是以无边框窗口的样式创建的。

渲染模式

GPU加速

GPU加速渲染意味着使用GPU用于合成。 这个模式的优点是支持 WebGL 和 3D CSS 动画。 取决于 webPreferences.offscreen.useSharedTexture 设置,有两种不同的方法。

  1. 使用 GPU 共享纹理

    webPreferences.offscreen.useSharedTexture 设置为 true 的情况下使用。

    这是一项需要将一个原生 Node 模块与你自己的代码配合使用的高级特性。 帧直接以 GPU 纹理格式进行复制,因为不存在 CPU-GPU 内存复制开销,因此这种模式非常快,你可以直接将这个共享纹理导入到你自己的渲染程序里。 你可以在这里获取更多详情。

  2. 使用 CPU 共享内存位图

    webPreferences.offscreen.useSharedTexture 设置为 false 的情况下使用(默认行为)。

    以性能为代价,使用 NativeImage API 访问纹理。 帧必须从 GPU 复制到 CPU 位图,这需要更多的系统资源,因此这种模式比软件输出设备模式更慢。 但它支持 GPU 相关功能。

软件输出设备

这种模式使用软件输出设备在 CPU 中渲染,因此帧生成速度比 GPU 加速的共享内存位图模式更快。

要启用这种模式,必须调用 app.disableHardwareAcceleration() API 禁用 GPU 加速。

示例

const { app, BrowserWindow } = require('electron/main')
const fs = require('node:fs')
const path = require('node:path')

app.disableHardwareAcceleration()

function createWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
offscreen: true
}
})

win.loadURL('https://github.com')
win.webContents.on('paint', (event, dirty, image) => {
fs.writeFileSync('ex.png', image.toPNG())
})
win.webContents.setFrameRate(60)
console.log(`The screenshot has been successfully saved to ${path.join(process.cwd(), 'ex.png')}`)
}

app.whenReady().then(() => {
createWindow()

app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow()
}
})
})

app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})

在运行Electron应用后,进入你的应用的工作目录,你会在里面找到渲染的图片。