WebAssembly 迁移指南
    
    
      
    
    
      
      使用集合让一切井井有条
    
    
      
      根据您的偏好保存内容并对其进行分类。
    
  
    
  
      
    
  
  
  
  
  
    
  
  
    
    
    
(P)NaCl 弃用公告
考虑到跨浏览器 WebAssembly 支持乃是大势所趋,我们计划今后主要依靠 WebAssembly 构建原生代码,并计划于 2019 年第 4 季度停用对 PNaCl 的支持(Chrome 应用除外)。我们相信,
围绕 WebAssembly 打造的生态系统,
因此更适合新的和现有的高性能
Web 应用,并且 PNaCl 的使用率足够低,足以保证弃用。
从 Chrome 76 开始,开放网络上的 PNaCl 功能已
源试用,
这是一种机制,供 Web 开发者注册并获取默认情况下未开启的功能。
这通常是建议的新功能,但在本例中是已弃用的功能。
开发者可以在源试用控制台中注册
并接收令牌,该令牌可以嵌入到页面中,并且可以在无需用户使用标记的情况下启用该功能。
(如需了解详情,请参阅链接的指南)。试用计划将持续到 Chrome 78,大约持续到 2019 年 12 月。
此变更不会影响 Chrome 应用或扩展程序中的 NaCl 或 PNaCl 以及“enable-nacl”
chrome://flags 中的标记还可用于在本地启用 PNaCl 以进行测试
(此标记还保留其当前功能,即在任何页面上启用非 PNaCl“原生”NaCl)。
我们最近还宣布了在 2018 年第 1 季度弃用
Chrome 应用
。
对于大多数 (P)NaCl 使用情形,我们建议从 NaCl SDK 迁移到 Emscripten。如果您的应用可移植到 Linux、使用 SDL 或 POSIX API,迁移可能非常简单。虽然无法直接支持 NaCl / Pepper API,
我们已尝试列出 Web API 等效项。
如果您有更具挑战性的携号转网请求,请联系
native-client-discuss@googlegroups.com
API 迁移
我们在此概述了面向 (P)NaCl 公开的每个 API 的 Web 平台替代项的状态。此外,该表格还列出了 Emscripten 中的库或选项
可提供最接近的替代品
我们预计会在 2017 年为 WebAssembly 添加共享内存线程支持,因为线程对于匹配 (P)NaCl 最有趣的用例至关重要。下方会标记假定即将推出的线程支持的迁移项。如果您的应用的流控制在很大程度上依赖于阻塞
API 时,您可能还会发现需要线程支持才能方便地进行移植。
虽然我们一直努力在此表格中提供准确的数据,
并且不存在任何错误或遗漏问题。
如果您遇到此类问题,请发送电子邮件至 native-client-discuss@googlegroups.com 与我们联系
PPAPI
PPB_Audio
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
    x  | 
    SDL(部分) | 
    GAP(部分)- AudioWorkletNode 大致等效 | 
    AudioWorkletSpec 已完成,但 AudioDeviceClient 可能更适合此 API。AudioDeviceClient 仍由社区指定。此 API 可能没有大致等效的工作流。 | 
  
  
    | GetCurrentConfig | 
      | 
    SDL  | 
    AudioContext.* (获取传入的设置) | 
      | 
  
  
    | StartPlayback | 
      | 
    SDL | 
    AudioBufferSourceNode.start | 
      | 
  
  
    | StopPlayback | 
      | 
    SDL | 
    AudioBufferSourceNode.stop | 
      | 
  
PPB_AudioBuffer
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetTimestamp | 
      | 
    SDL | 
    AudioBufferSourceNode.start(参数) | 
    每次传入,而不是附加到缓冲区。 | 
  
  
    | SetTimestamp | 
      | 
    SDL  | 
    AudioBufferSourceNode.start(参数) | 
      | 
  
  
    | GetSampleRate | 
      | 
    SDL  | 
    AudioBuffer.sampleRate | 
      | 
  
  
    | GetSampleSize | 
      | 
    GAP | 
    GAP - WebAudio 仅使用 32 位浮点数,而 PPAPI 使用 16 位整数。 | 
    从理论上讲,PPAPI 支持多种抽样规模。实际上,它仅支持 16 位样本。遗憾的是,开发者请求使用 16 位采样大小以节省内存用量。Web Audio 规范的下一版本将实现对 16 位采样的支持。可以通过对来自 decodeAudioData 的音频使用 16 位缓冲区,实现与 Firefox 类似的 AudioBuffer 优化 | 
  
  
    | GetNumberOfChannels | 
      | 
    SDL  | 
    AudioBuffer.numberOfChannels  | 
      | 
  
  
    | GetDataBuffer | 
      | 
    SDL  | 
    AudioBuffer.getChannelData  | 
      | 
  
  
    | GetBufferSize | 
      | 
    SDL | 
    AudioBuffer.length | 
      | 
  
PPB_AudioConfig
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | CreateStereo16Bit | 
      | 
    GAP | 
    GAP - 仅支持 32 位浮点样本 | 
    下一版网络音频规范将实现对 16 位样本的支持。 | 
  
  
    | GetSampleRate | 
      | 
    SDL | 
    AudioContext.sampleRate  | 
      | 
  
  
    | GetSampleFrameCount | 
      | 
    SDL  | 
    AudioBuffer.length | 
      | 
  
  
    | RecommendSampleRate | 
      | 
    SDL | 
    AudioContext.sampleRate(来自默认构造函数) | 
    默认情况下,AudioContext 的首选采样率与硬件音频设备的实际采样率一致。 | 
  
  
    | RecommendSampleFrameCount  | 
      | 
    GAP | 
    GAP - 将使用计划中的 AudioDeviceClient 进行处理 | 
    我们有一个开放的问题,即允许用户指定大小,但该功能仍在定义中。最好使用 AudioDeviceClient 来处理此问题,因为它可以告诉您给定硬件的适当大小。 | 
  
PPB_Console
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 日志 | 
      | 
    Utime | 
    console.log/warn/error/...  | 
      | 
  
  
    | LogWithSource | 
      | 
    GAP | 
    GAP | 
    除非开发者提出了针对 LogWithSource 提供的功能的特定用例,否则 Console API 被视为足够完整的替代方案。DevTools Source Maps 可用于调试以原始源语言编写的转译 JavaScript。 | 
  
PPB_Core
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | getTime | 
      | 
    Utime | 
    new Date().getTime()  | 
      | 
  
  
    | getTimeTicks | 
      | 
    Utime | 
    新 Date().getTime() | 
      | 
  
  
    | IsMainThread | 
      | 
    GAP | 
    window.document !== undefined  | 
      | 
  
  
    | CallOnMainThread | 
      | 
    GAP | 
    Worker.postMessage + Atomics.wait | 
    可以构建等效的同步。 | 
  
PPB_FileIO
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    FS(部分) | 
    window.chooseFileSystemEntries() | 
    create 和 open 的使用方式不同,但它们的作用相同。 | 
  
  
    | 打开 | 
      | 
    FS(部分) | 
    window.chooseFileSystemEntries() | 
      | 
  
  
    | 查询 | 
      | 
    FS(部分) | 
    Blob.size、FileSystemHandle.getFile()、FileSystemHandle.getDirectory()、File.lastModified | 
    GAP(部分)- Blob.type 也可用于检查 MIME 类型。无法使用 Native File System API 确定文件系统类型、创建时间和上次访问时间。 | 
  
  
    | 触摸  | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.getFile("name", {create: true})  | 
      | 
  
  
    | 读取  | 
      | 
    FS(部分) | 
    Blob.slice().arrayBuffer() | 
      | 
  
  
    | 写入  | 
      | 
    FS(部分) | 
    FileSystemWriter.write() | 
      | 
  
  
    | SetLength | 
      | 
    FS(部分) | 
    FileSystemWriter.truncate() | 
      | 
  
  
    | 吸顶式 | 
      | 
    GAP(部分) | 
    GAP(部分)- 调用 FileSystemWrite.close() 时,系统将刷新文件 | 
    这是特意设计的,因为 Native File System API 文件会向操作系统公开,因此在向操作系统显示数据之前,需要先执行安全浏览检查。 | 
  
  
    | 关闭  | 
      | 
    FS(部分) | 
    FileSystemWriter.close() | 
    不会取消待处理的操作,但会将迄今为止写入的所有数据刷新到磁盘。 | 
  
  
    | ReadToArray  | 
      | 
    GAP | 
    Blob.slice().arrayBuffer() 或 Blob.arrayBuffer() | 
    允许并行执行多个子范围读取。 | 
  
PPB_FileRef
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.getFile("name", {create: true}) | 
      | 
  
  
    | GetFileSystemType | 
      | 
    FS(部分) | 
    FileSystem.type | 
      | 
  
  
    | GetName | 
      | 
    FS(部分) | 
    File.name | 
      | 
  
  
    | GetPath | 
      | 
    FS(部分) | 
    差距(部分)- 使用原生文件系统 API,可以通过使用 FileSystemHandle.resolve(FileSystemHandle) 对包含文件的目录的引用来确定文件的相对路径 | 
    无法确定文件的绝对路径,并且用户必须授予访问包含该文件的目录的权限。 | 
  
  
    | GetParent | 
      | 
    FS(部分) | 
    差距(部分)- 使用原生文件系统 API,可以通过使用 FileSystemHandle.resolve(FileSystemHandle) 对包含文件的目录的引用来确定文件的相对路径 | 
    用户必须授予访问包含相应文件的目录的权限。 | 
  
  
    | MakeDirectory  | 
      | 
    FS(部分) | 
    FileSystemHandle.getDirectory(..., {createIfNotExists: true})  | 
      | 
  
  
    | 触摸  | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.getFile("name", {create: true}) | 
    写入可能会被提升修改时间。 | 
  
  
    | 删除 | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.removeEntry() | 
    与 PPAPI 不同,目录不必为空。 | 
  
  
    | 重命名  | 
      | 
    FS(部分) | 
    GAP(部分)- 使用 Native File System API 时,可以使用新名称 FileSystemFileHandle.getFile() 和 FileSystemFileHandle.createWriter().write() 与旧文件的内容组合来写入文件。然后使用 FileSystemDirectoryHandle.removeEntry() 删除旧文件。 | 
    在原生文件系统 API 中,没有一个直接 API 可以一步完成此工作。 | 
  
  
    | 查询 | 
      | 
    GAP(部分) | 
    Blob.size、FileSystemHandle.getFile()、FileSystemHandle.getDirectory()、File.lastModified | 
    GAP(部分)- Blob.type 还可用于检查 MIME 类型。无法使用原生文件系统 API 确定文件系统类型、创建时间和上次访问时间。 | 
  
  
    | ReadDirectoryEntries | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.getEntries() | 
      | 
  
PPB_FileSystem
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    FS(部分) | 
    window.requestFileSystem  | 
    JS API 只需一步即可搞定 | 
  
  
    | 打开 | 
      | 
    GAP | 
    window.requestFileSystem  | 
    JS API 只需一步即可搞定 | 
  
  
    | GetType | 
      | 
    GAP | 
    FileSystem.type | 
      | 
  
PPB_Fullscreen
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | IsFullScreen | 
      | 
    html5.h | 
    Document.fullscreenEnabled | 
      | 
  
  
    | SetFullscreen | 
      | 
    html5.h | 
    Document.requestFullscreen  | 
      | 
  
  
    | GetScreenSize | 
      | 
    html5.h | 
    Document.exitFullscreen  | 
      | 
  
PPB_Gamepad
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 试阅内容 | 
      | 
    SDL | 
    Gamepad.*  | 
    Gamepad 对象公开相对于 navigationStart 的时间戳。当从硬件收到数据时,该值会更新 https://www.w3.org/TR/gamepad/#gamepad-interface  | 
  
PPB_Graphics2D
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL  | 
    Canvas.getContext('2d') 中的资源 | 
      | 
  
  
    | 描述 | 
      | 
    SDL | 
    Canvas.clientWidth + Canvas.clientHeight | 
      | 
  
  
    | PaintImageData | 
      | 
    SDL  | 
    CanvasRenderingContext2D.putImageData  | 
      | 
  
  
    | 滚动 | 
      | 
    GAP | 
    CanvasRenderingContext2D.scrollIntoView、CanvasRenderingContext2D.drawImage | 
    GAP(部分)- 可通过以下方法实现:使用偏移将画布绘制到其自身上,使用 drawImage,然后填充其余部分。 | 
  
  
    | ReplaceContents | 
      | 
    SDL  | 
    CanvasRenderingContext2D.drawImage | 
      | 
  
  
    | 吸顶式 | 
      | 
    GAP | 
    无直接对等项 | 
    GAP(部分)-
    绘制代码末尾始终存在隐式 flush;不太可能
    进行更改。不过,OffscreenCanvas 和 ImageBitmapRenderingContext 的组合可提供类似的功能。 | 
  
  
    | SetScale | 
      | 
    SDL  | 
    CanvasRenderingContext2D.scale | 
      | 
  
  
    | GetScale | 
      | 
    SDL | 
    CanvasRenderingContext2D.currentTransform | 
      | 
  
  
    | SetLayerTransform | 
      | 
    SDL  | 
    CanvasRenderingContext2D.setTransform
CanvasRenderingContext2D.scale
CanvasRenderingContext2D.translate  | 
      | 
  
PPB_Graphics3D
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetAttribMaxValue | 
      | 
    OpenGL ES 3.0 | 
    WebGL 2.0 | 
    GAP(部分)- WebGL 2.0 和 Emscripten 提供的 OpenGL ES 3.0 支持用户定义的多重采样帧缓冲区,其中所有可通过 PPAPI 配置的参数均可设置。 | 
  
  
    | 制作 | 
      | 
    SDL  | 
    Canvas.getContext | 
      | 
  
  
    | GetAttribs | 
      | 
    SDL | 
    WebGLRenderingContext.getContextAttributes | 
      | 
  
  
    | SetAttribs | 
      | 
    SDL  | 
    Canvas.getContext(.., OPTIONS) | 
      | 
  
  
    | GetError | 
      | 
    SDL | 
    WebGLRenderingContext.getError | 
      | 
  
  
    | ResizeBuffers | 
      | 
    SDL | 
    Canvas.width = w;Canvas.height = h; | 
      | 
  
  
    | SwapBuffers | 
      | 
    GAP | 
    无直接对等项 | 
    GAP(部分)-
    绘制代码末尾始终存在隐式 flush;不太可能
    进行更改。不过,
    
      OffscreenCanvas
    和
    
      ImageBitmapRenderingContext
    提供类似的功能。 | 
  
PPB_ImageData
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetNativeImageDataFormat | 
      | 
    SDL | 
    ImageData 要求 RGBA 顺序 | 
      | 
  
  
    | IsImageDataFormatSupported | 
      | 
    SDL  | 
    ImageData 要求 RGBA 顺序 | 
      | 
  
  
    | 制作 | 
      | 
    SDL | 
    CanvasRenderingContext2d.createImageData  | 
      | 
  
  
    | 描述 | 
      | 
    SDL | 
    ImageData 从不具有 stride | 
      | 
  
  
    | 地图 | 
      | 
    SDL  | 
    ImageData.data | 
      | 
  
  
    | 取消映射 | 
      | 
    SDL  | 
    ImageData.data | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | RequestInputEvents | 
      | 
    SDL  | 
    无直接对等项 | 
    由于 JS / Wasm 在主线程上运行,因此缺少此功能的相关程度较低,并且能够以更便宜的方式过滤事件,而不会产生跨进程往返。 | 
  
  
    | RequestFilteringInputEvents | 
      | 
    SDL  | 
    鼠标* 键* 滚轮* 触摸* 组合* 事件 | 
      | 
  
  
    |   | 
      | 
    SDL | 
    Element.addEventListener | 
      | 
  
  
    | ClearInputEventRequest | 
      | 
    SDL  | 
    Element.removeEventListener  | 
      | 
  
  
    | GetType | 
      | 
    SDL | 
    事件类后代 | 
      | 
  
  
    | GetTimeStamp  | 
      | 
    SDL  | 
    Event.timeStamp | 
      | 
  
  
    | GetModifiers | 
      | 
    SDL  | 
    *Event.altKey/shiftKey/metaKey/ctrlKey  | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL | 
    MouseEvent | 
      | 
  
  
    | GetButton | 
      | 
    SDL  | 
    MouseEvent.button | 
      | 
  
  
    | GetPosition | 
      | 
    SDL | 
    MouseEvent.client*/page*/offset* | 
      | 
  
  
    | GetClickCount | 
      | 
    SDL | 
    “dblclick”与“mousedown”事件 | 
      | 
  
  
    | GetMovement | 
      | 
    SDL | 
    MouseEvent.movement*  | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL | 
    WheelEvent | 
      | 
  
  
    | GetDelta | 
      | 
    SDL | 
    WheelEvent.delta* | 
      | 
  
  
    | GetTicks | 
      | 
    GAP | 
    GAP - deltaMode 种类包含此信息,但并未完全包含。 | 
    以下讨论了如何实现 WheelEvent.deltaMode API:https://github.com/w3c/uievents/issues/181#issuecomment-537811017 | 
  
  
    | GetScrollByPage  | 
      | 
    GAP | 
    GAP - deltaMode 种类包含此信息,但并未完全包含。 | 
    以下讨论了如何实现 WheelEvent.deltaMode API:https://github.com/w3c/uievents/issues/181#issuecomment-537811017 | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL  | 
    KeyboardEvent | 
      | 
  
  
    | GetKeyCode  | 
      | 
    SDL | 
    KeyboardEvent.keyCode | 
      | 
  
  
    | GetCharacterText | 
      | 
    SDL  | 
    KeyboardEvent.key | 
      | 
  
  
    | GetCode | 
      | 
    SDL | 
    KeyboardEvent.code | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL | 
    TouchEvent | 
      | 
  
  
    | AddTouchPoint  | 
      | 
    SDL  | 
    TouchEvent.touches.push  | 
      | 
  
  
    | GetTouchCount | 
      | 
    SDL  | 
    TouchEvent.touches.length  | 
      | 
  
  
    | GetTouchByIndex  | 
      | 
    SDL  | 
    TouchEvent.touches[i] | 
      | 
  
  
    | GetTouchById | 
      | 
    SDL  | 
    Touch.indentifer(请自行确定) | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    CompositionEvent | 
      | 
  
  
    | GetText  | 
      | 
    GAP | 
    CompositionEvent.data  | 
      | 
  
  
    | GetSegmentNumber | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
    这些数据可能会从 CompositionEvent.data 中检索。 | 
  
  
    | GetSegmentOffset  | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetTargetSegment | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetSelection | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
PPB_Instance
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | BindGraphics | 
      | 
    SDL | 
    Canvas.getContext(由于绑定是自动进行的,因此无效)。 | 
      | 
  
  
    | IsFullFrame | 
      | 
    GAP | 
    GAP - 没有等同于 MIME 类型处理程序的功能。 | 
    NaCl 应用可以注册以处理特定 MIME 类型并拥有整个文档。 | 
  
  
    | DidCreate  | 
      | 
    不适用 | 
    <Element>[key]  | 
    借助通用 DOM 访问权限,您可以提取标记属性 | 
  
  
    | DidDestroy | 
      | 
    不适用 | 
    不适用 | 
    不会因 NaCl 而触发 | 
  
  
    | DidChangeView  | 
      | 
    不适用 | 
    元素“resize”事件 | 
      | 
  
  
    | DidChangeFocus | 
      | 
    不适用 | 
    元素“focus”“focusin”“focusout”事件 | 
      | 
  
  
    | HandleDocumentLoad | 
      | 
    不适用 | 
    GAP - 无法注册为 MIME 类型处理程序 | 
    NaCl 模块(通过应用 + 清单条目)可设置为处理特定的 MIME 类型。 | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 配置  | 
      | 
    GAP | 
    getUserMedia() | 
    getUserMedia() 中的约束条件可以提供要在 MediaStreamTrack 中使用的配置值。 | 
  
  
    | GetAttrib | 
      | 
    GAP | 
    MediaStreamTrack.getSettings() | 
      | 
  
  
    | GetId  | 
      | 
    GAP | 
    MediaStreamTrack.id | 
      | 
  
  
    | HasEnded | 
      | 
    GAP | 
    MediaStreamTrack.readyState | 
      | 
  
  
    | GetBuffer | 
      | 
    GAP | 
    GAP - 无对等方法 | 
      | 
  
  
    | RecycleBuffer | 
      | 
    GAP | 
    GAP - 无对等项 | 
      | 
  
  
    | 关闭  | 
      | 
    GAP | 
    MediaStreamTrack.stop() | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    画布截图 | 
    Canvas Capture 支持以编程方式引入视频帧。 | 
  
  
    | 配置  | 
      | 
    GAP | 
    applyConstraints(), getUserMedia() | 
    差距(部分)- Web API 中可用的配置范围可能与 PPAPI 不同。 | 
  
  
    | GetAttrib | 
      | 
    GAP | 
    MediaStreamSettings.width  | 
      | 
  
  
    |   | 
      | 
    GAP | 
    MediaStreamSettings.height  | 
      | 
  
  
    |   | 
      | 
    GAP | 
    GAP - 无与 PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES 对等项 | 
    MediaStream 无法预加载,因此绝不会缓冲:https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements | 
  
  
    |   | 
      | 
    GAP | 
    GAP - 没有等效于 PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT | 
      | 
  
  
    | GetId | 
      | 
    GAP | 
    MediaStreamTrack.id | 
      | 
  
  
    | HasEnded | 
      | 
    GAP | 
    MediaStreamTrack.readyState  | 
      | 
  
  
    | GetFrame | 
      | 
    GAP | 
    GAP - 无等效项 | 
      | 
  
  
    | RecycleFrame | 
      | 
    GAP | 
    GAP - 无对等项 | 
      | 
  
  
    | 关闭  | 
      | 
    GAP | 
    MediaStreamTrack.stop() | 
      | 
  
  
    | GetEmptyFrame | 
      | 
    GAP | 
    GAP - 无等效项 | 
      | 
  
  
    | PutFrame | 
      | 
    GAP | 
    GAP - 无对等方法 | 
      | 
  
PPB_MessageLoop
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
  
    | GetForMainThread | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
  
    | GetCurrent | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
  
    | AttachToCurrentThread | 
      | 
    不适用 | 
    大多数情况下没有问题,工作器会获得隐式事件循环。 | 
      | 
  
  
    | 您可以在  | 
      | 
    不适用 | 
    大多数情况下没有问题,工作器会获得隐式事件循环。 | 
      | 
  
  
    | PostWork | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
  
    | PostQuit | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
PPB_Messaging
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | PostMessage | 
      | 
    不适用 | 
    Window.postMessage | 
      | 
  
  
    | RegisterMessageHandler | 
      | 
    不适用 | 
    Window.addEventListener  | 
      | 
  
  
    | UnregisterMessageHandler | 
      | 
    不适用 | 
    Window.removeEventListener | 
      | 
  
PPB_MouseCursor
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | SetCursor | 
      | 
    SDL | 
    Element.style.cursor  | 
    支持使用同一组常用光标。
可以使用 url(..) 实现自定义光标。
您可以使用数据 URI 实现动态自定义光标。
CSS3 支持指定热点。 | 
  
PPB_MouseLock
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | LockMouse | 
      | 
    SDL | 
    Element.requestPointerLock  | 
      | 
  
  
    | UnlockMouse | 
      | 
    SDL | 
    Element.exitPointerLock  | 
      | 
  
PPB_OpenGLES2
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 多种方法 | 
      | 
    OpenGLES | 
    功能接近 WebGL 1.0。 | 
      | 
  
  
    |   | 
    x  | 
      | 
    OffscreenCanvas | 
      | 
  
PPB_TextInputController
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | SetTextInputType | 
      | 
    GAP | 
    GAP - 可能被 Input Method Editor API 填充 | 
    有些开发者希望能够以这种方式进行提示,或者更喜欢在画布内拦截并显示 IME 事件 / 输出内嵌的功能。 | 
  
  
    | UpdateCaretPosition | 
      | 
    GAP | 
    GAP - 可能由输入法编辑器 API 填充 | 
    https://www.w3.org/TR/ime-api/ | 
  
  
    | CancelCompositionText  | 
      | 
    GAP | 
    GAP - 可能由输入法编辑器 API 填充 | 
    https://www.w3.org/TR/ime-api/  | 
  
  
    | UpdateSurroundingText | 
      | 
    GAP | 
    GAP - 可能由输入法编辑器 API 填充 | 
    https://www.w3.org/TR/ime-api/ | 
  
PPB_URLLoader
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    embind | 
    new XMLHttpRequest();  | 
      | 
  
  
    | 未解决 | 
      | 
    embind  | 
    XMLHttpRequest.open | 
      | 
  
  
    | FollowRedirect | 
      | 
    embind | 
    Request.redirect | 
      | 
  
  
    |   | 
      | 
    GAP | 
    GAP - 无 XMLHTTPRequest 等效项 | 
      | 
  
  
    | GetUploadProgress  | 
      | 
    embind  | 
    XMLHttpRequest “progress”事件 | 
      | 
  
  
    |   | 
      | 
    GAP | 
    FetchObserver | 
    尚未指定或实现;https://github.com/whatwg/fetch/issues/607  | 
  
  
    | GetDownloadProgress | 
      | 
    embind  | 
    XMLHttpRequest “progress”事件 | 
      | 
  
  
    |   | 
      | 
    GAP | 
    FetchObserver | 
    尚未说明或实施;https://github.com/whatwg/fetch/issues/607 | 
  
  
    | GetResponseInfo | 
      | 
    embind | 
    XMLHttpRequest.getAllResponseHeaders | 
      | 
  
  
    |   | 
      | 
    embind | 
    提取响应。* | 
      | 
  
  
    | ReadResponseBody | 
      | 
    embind  | 
    XMLHttpRequest.response | 
      | 
  
  
    |   | 
      | 
    embind  | 
    正文。*(响应是正文) | 
      | 
  
  
    | FinishStreamingToFile | 
      | 
    embind  | 
    GAP - 无直接对等项 | 
    XMLHttpRequest 和 Fetch 都假定流式传输到内存,而不是直接传输到存储空间。 | 
  
  
    | 关闭  | 
      | 
    embind  | 
    XMLHttpRequest.abort | 
      | 
  
  
    |   | 
      | 
    GAP | 
    Fetch API:AbortSignal 和 AbortController | 
      | 
  
PPB_URLRequestInfo
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    embind  | 
    XMLHttpRequest | 
      | 
  
  
    |   | 
      | 
    embind | 
    提取请求 | 
      | 
  
  
    | SetProperty | 
      | 
    GAP | 
    GAP - 没有 XMLHttpRequest 的直接等效项 | 
    XMLHttpRequest 不提供根据请求限制以下重定向、流式传输到文件、设置引荐来源网址或凭据政策的直接方法。 | 
  
  
    |   | 
      | 
    embind  | 
    请求。* | 
      | 
  
  
    | AppendDataToBody  | 
      | 
    embind  | 
    XMLHttpRequest.send  | 
    GAP - 两者都必须有完整的身体,而不是部分。 | 
  
  
    |   | 
      | 
    embind | 
    fetch(.., options:body) | 
      | 
  
  
    | AppendFileToBody | 
      | 
    GAP | 
    fetch() 上传流式传输 | 
    https://www.chromestatus.com/features/5274139738767360 | 
  
  
    |   | 
      | 
    不适用 | 
    <form>  | 
    您也可以使用 FileReader 进行读取和上传,但这更类似于 AppendDataToBody | 
  
PPB_URLResponseInfo
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetProperty | 
      | 
    embind  | 
    XMLHttpRequest.getAllResponseHeaders + 其他 | 
      | 
  
  
    |   | 
      | 
    embind  | 
    提取响应。* | 
      | 
  
  
    | GetBodyAsFileRef  | 
      | 
    embind  | 
    提取响应(正文).blob() | 
    假设存储层会优化传输。 | 
  
PPB_Var
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | VarFromUtf8 | 
      | 
    embind  | 
    TextDecoder.decode | 
      | 
  
  
    | VarToUtf8 | 
      | 
    embind | 
    TextEncoder.encode | 
      | 
  
  
    | VarFromResource | 
      | 
    不适用 | 
    不适用 | 
      | 
  
  
    | VarToResource | 
      | 
    不适用 | 
    不适用 | 
      | 
  
PPB_VarArray
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 立即体验 | 
      | 
    embind | 
    Array[i] | 
      | 
  
  
    | 将 | 
      | 
    embind | 
    Array[i] = x  | 
      | 
  
  
    | GetLength | 
      | 
    embind | 
    Array.length | 
      | 
  
  
    | SetLength | 
      | 
    embind  | 
    Array.length = n | 
      | 
  
PPB_VarArrayBuffer
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    embind  | 
    新的 ArrayBuffer(n) | 
      | 
  
  
    | ByteLength | 
      | 
    embind  | 
    ArrayBuffer.byteLength | 
      | 
  
  
    | 地图 | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
    Asm.js / Wasm 模块无法映射 ArrayBuffer 的单线性内存堆以外的区域。
将来使用多个记忆或内存映射可能会改善这种情况。 | 
  
  
    | 取消映射 | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
PPB_VarDictionary
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    embind | 
    {} | 
      | 
  
  
    | 立即体验 | 
      | 
    embind | 
    <Object>[i]  | 
      | 
  
  
    | 将 | 
      | 
    embind | 
    <对象>[i] = x | 
      | 
  
  
    | 删除 | 
      | 
    embind  | 
    delete <Object>[i]  | 
      | 
  
  
    | HasKey | 
      | 
    embind | 
    <Object> 中的 x | 
      | 
  
  
    | GetKeys | 
      | 
    embind | 
    (<Object> 中的 k){} | 
    没有文字等效项,但可以构建。 | 
  
PPB_VideoDecoder
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 VideoDecoder() 进行处理 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming  | 
  
  
    | 初始化 | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 VideoDecoder() 初始化参数 (VideoDecoderInitParameters) 进行处理 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming | 
  
  
    | 解码 | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 ReadableStream.pipeThrough(VideoDecoder) 进行处理 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming | 
  
  
    | GetPicture | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable) 进行处理 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming  | 
  
  
    | RecyclePicture | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 进行处理。当前设计会自动回收图片,并继续执行解码过程。 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming  | 
  
  
    | 刷新 | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。API 将被命名为 Flush(),但是对于与解码调用相关的如何排序,我们还在讨论。 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming | 
  
  
    | 重置 | 
      | 
    GAP | 
    GAP - 将通过销毁 VideoDecoder 实例并创建新实例来使用建议的 WebCodecs API 进行处理。这不如专用重置方法高效,但 Reset() API 的语义仍在讨论中。 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming | 
  
PPB_VideoEncoder
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 使用 VideoEncoder() 进行处理 | 
      | 
  
  
    | GetSupportedProfiles | 
      | 
    GAP | 
    GAP(部分)- navigator.mediaCapabilities.encodingInfo() | 
    您必须逐个检查支持的配置文件。 | 
  
  
    | 初始化 | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 和 VideoEncoder() 初始化参数进行处理 | 
      | 
  
  
    | GetFramesRequired  | 
      | 
    GAP | 
    GAP - 无对等项 | 
    Web Codecs API 内部使用的帧池不太可能公开。 | 
  
  
    | GetFrameCodedSize  | 
      | 
    GAP | 
    GAP - 无对等项 | 
    Web Codecs API 内部使用的帧池不太可能公开。 | 
  
  
    | GetVideoFrame | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 通过 ReadableStream.pipeThrough(VideoEncoder) 进行处理。这会直接在 Readable 流中编码数据,而不是在编码前抓取单个帧来填充数据。 | 
      | 
  
  
    | 编码 | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 ReadableStream.pipeThrough(VideoEncoder) 进行处理 | 
      | 
  
  
    | GetBitstreamBuffer | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 进行处理。当前设计会自动检查通过管道传输的编码比特流缓冲区。 | 
    WebCodecs API 目前假定可以复制比特流缓冲区,而不是将其加入池,因此无需回收。 | 
  
  
    | RecycleBitstreamBuffer  | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。当前设计将自动回收缓冲区,以保持编码过程的顺利进行。 | 
    将来这一点不太可能改变,因为对性能的影响会更小。 | 
  
  
    | RequestEncodingParametersChange | 
      | 
    GAP | 
    GAP - 将由提议的 Web Codecs API 处理。某些参数可以动态更改,而另一些参数则需要拆解编码器。 | 
      | 
  
  
    | 关闭  | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 通过使用 VideoEncoder.Close() 进行处理 | 
      | 
  
PPB_VideoFrame
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetTimestamp | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | SetTimestamp | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | GetFormat | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | GetSize | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | GetDataBuffer  | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | GetDataBufferSize  | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
PPB_View
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetRect | 
      | 
    embind | 
    Element.getBoundingClientRect | 
      | 
  
  
    | IsFullscreen | 
      | 
    embind  | 
    Document.fullScreenEnabled  | 
    适用于文档,而不仅仅是单个元素。 | 
  
  
    | IsVisible | 
      | 
    embind | 
    IntersectionObserver | 
      | 
  
  
    | IsPageVisible | 
      | 
    embind  | 
    document.visibilityState | 
      | 
  
  
    | GetClipRect | 
      | 
    embind  | 
    IntersectionObserver | 
      | 
  
  
    | GetDeviceScale | 
      | 
    embind  | 
    window.devicePixelRatio | 
      | 
  
  
    | GetCSSScale | 
      | 
    embind  | 
    <Element>.getBoundingClientRect().width / <Element>.offsetWidth | 
      | 
  
  
    | GetScrollOffset  | 
      | 
    embind  | 
    <Element>.scrollTop/<Element>.scrollLeft | 
      | 
  
PPB_WebSocket
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    WebSocket.WebSocket | 
      | 
  
  
    | 关联  | 
      | 
    GAP | 
    WebSocket.WebSocket(url, ...)
WebSocket “open”事件 | 
      | 
  
  
    | 关闭  | 
      | 
    GAP | 
    WebSocket.close | 
      | 
  
  
    | ReceiveMessage | 
      | 
    GAP | 
    WebSocket “message”事件
WebSocket“error”事件
WebSocket“关闭”事件 | 
      | 
  
  
    | SendMessage | 
      | 
    GAP | 
    WebSocket.send | 
      | 
  
  
    | GetBufferedAmount | 
      | 
    GAP | 
    WebSocket.bufferedAmount | 
      | 
  
  
    | GetCloseCode | 
      | 
    GAP | 
    CloseEvent.code | 
      | 
  
  
    | GetCloseReason | 
      | 
    GAP | 
    CloseEvent.reason | 
      | 
  
  
    | GetCloseWasClean  | 
      | 
    GAP | 
    CloseEvent.wasClean  | 
      | 
  
  
    | GetExtensions | 
      | 
    GAP | 
    WebSocket.extensions | 
      | 
  
  
    | GetProtocol | 
      | 
    GAP | 
    WebSocket.protocol | 
      | 
  
  
    | GetReadyState | 
      | 
    GAP | 
    WebSocket.readyState | 
      | 
  
  
    | GetURL | 
      | 
    GAP | 
    WebSocket.url | 
      | 
  
PPP_Graphics3D
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 图形 3D 上下文丢失 | 
      | 
    SDL | 
    画布“webglcontextlost”事件 | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | HandleInputEvent | 
      | 
    SDL  | 
    Element.addEventListener  | 
      | 
  
PPP_Instance
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | DidCreate | 
      | 
    不适用 | 
    <Element>[key]  | 
    借助通用 DOM 访问权限,您可以提取标记属性 | 
  
  
    | DidDestroy | 
      | 
    不适用 | 
    不适用 | 
    不会因 NaCl 而触发 | 
  
  
    | DidChangeView  | 
      | 
    不适用 | 
    元素“resize”事件 | 
      | 
  
  
    | DidChangeFocus | 
      | 
    不适用 | 
    元素“focus”“focusin”“focusout”事件 | 
      | 
  
  
    | HandleDocumentLoad | 
      | 
    不适用 | 
    GAP - 无法注册为 MIME 类型处理程序 | 
    您可以通过应用 + 清单条目设置 NaCl 模块来处理特定 MIME 类型。 | 
  
PPP_MessageHandler
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | HandleMessage | 
      | 
    embind | 
    MessagePort“message”事件
窗口“消息”事件 | 
      | 
  
  
    | HandleBlockingMessage | 
      | 
    不适用 | 
    GAP - 无直接对等项 | 
    类似的同步可以使用 Atomics.wait 在主线程外完成。添加此 API 是为了支持模拟同步插件 API。 | 
  
PPP_Messaging
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | HandleMessage | 
      | 
    embind | 
    MessagePort“message”事件
窗口“消息”事件 | 
      | 
  
PPP_MouseLock
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | MouseLockLost | 
      | 
    SDL  | 
    元素“pointerlockchange”“pointerlockerror”事件 | 
      | 
  
IRT
PPB_Audio
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
    x  | 
    SDL(部分) | 
    GAP(部分)- AudioWorkletNode 大致等效 | 
    AudioWorkletSpec 已完成,但 AudioDeviceClient 可能更适合此 API。AudioDeviceClient 仍由社区指定。此 API 可能没有大致等效的工作流。 | 
  
  
    | GetCurrentConfig | 
      | 
    SDL  | 
    AudioContext.* (获取传入的设置) | 
      | 
  
  
    | StartPlayback | 
      | 
    SDL | 
    AudioBufferSourceNode.start | 
      | 
  
  
    | StopPlayback | 
      | 
    SDL | 
    AudioBufferSourceNode.stop | 
      | 
  
PPB_AudioBuffer
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetTimestamp | 
      | 
    SDL | 
    AudioBufferSourceNode.start(参数) | 
    每次传入,而不是附加到缓冲区。 | 
  
  
    | SetTimestamp | 
      | 
    SDL  | 
    AudioBufferSourceNode.start(参数) | 
      | 
  
  
    | GetSampleRate | 
      | 
    SDL  | 
    AudioBuffer.sampleRate | 
      | 
  
  
    | GetSampleSize | 
      | 
    GAP | 
    GAP - WebAudio 仅使用 32 位浮点数,而 PPAPI 使用 16 位整数。 | 
    从理论上讲,PPAPI 支持多种抽样规模。实际上,它仅支持 16 位样本。遗憾的是,开发者请求使用 16 位采样大小以节省内存用量。Web Audio 规范的下一版本将实现对 16 位采样的支持。可以通过对来自 decodeAudioData 的音频使用 16 位缓冲区,实现与 Firefox 类似的 AudioBuffer 优化 | 
  
  
    | GetNumberOfChannels | 
      | 
    SDL  | 
    AudioBuffer.numberOfChannels  | 
      | 
  
  
    | GetDataBuffer | 
      | 
    SDL  | 
    AudioBuffer.getChannelData  | 
      | 
  
  
    | GetBufferSize | 
      | 
    SDL | 
    AudioBuffer.length | 
      | 
  
PPB_AudioConfig
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | CreateStereo16Bit | 
      | 
    GAP | 
    GAP - 仅支持 32 位浮点样本 | 
    下一版网络音频规范将实现对 16 位样本的支持。 | 
  
  
    | GetSampleRate | 
      | 
    SDL | 
    AudioContext.sampleRate  | 
      | 
  
  
    | GetSampleFrameCount | 
      | 
    SDL  | 
    AudioBuffer.length | 
      | 
  
  
    | RecommendSampleRate | 
      | 
    SDL | 
    AudioContext.sampleRate(来自默认构造函数) | 
    默认情况下,AudioContext 的首选采样率与硬件音频设备的实际采样率一致。 | 
  
  
    | RecommendSampleFrameCount  | 
      | 
    GAP | 
    GAP - 将使用计划中的 AudioDeviceClient 进行处理 | 
    我们有一个开放的问题,即允许用户指定大小,但该功能仍在定义中。最好使用 AudioDeviceClient 来处理此问题,因为它可以告诉您给定硬件的适当大小。 | 
  
PPB_Console
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 日志 | 
      | 
    Utime | 
    console.log/warn/error/...  | 
      | 
  
  
    | LogWithSource | 
      | 
    GAP | 
    GAP | 
    除非开发者提出了针对 LogWithSource 提供的功能的特定用例,否则 Console API 被视为足够完整的替代方案。DevTools Source Maps 可用于调试以原始源语言编写的转译 JavaScript。 | 
  
PPB_Core
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | getTime | 
      | 
    Utime | 
    new Date().getTime()  | 
      | 
  
  
    | getTimeTicks | 
      | 
    Utime | 
    新 Date().getTime() | 
      | 
  
  
    | IsMainThread | 
      | 
    GAP | 
    window.document !== undefined  | 
      | 
  
  
    | CallOnMainThread | 
      | 
    GAP | 
    Worker.postMessage + Atomics.wait | 
    可以构建等效的同步。 | 
  
PPB_FileIO
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    FS(部分) | 
    window.chooseFileSystemEntries() | 
    create 和 open 的使用方式不同,但它们的作用相同。 | 
  
  
    | 打开 | 
      | 
    FS(部分) | 
    window.chooseFileSystemEntries() | 
      | 
  
  
    | 查询 | 
      | 
    FS(部分) | 
    Blob.size、FileSystemHandle.getFile()、FileSystemHandle.getDirectory()、File.lastModified | 
    GAP(部分)- Blob.type 也可用于检查 MIME 类型。无法使用 Native File System API 确定文件系统类型、创建时间和上次访问时间。 | 
  
  
    | 触摸  | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.getFile("name", {create: true})  | 
      | 
  
  
    | 读取  | 
      | 
    FS(部分) | 
    Blob.slice().arrayBuffer() | 
      | 
  
  
    | 写入  | 
      | 
    FS(部分) | 
    FileSystemWriter.write() | 
      | 
  
  
    | SetLength | 
      | 
    FS(部分) | 
    FileSystemWriter.truncate() | 
      | 
  
  
    | 吸顶式 | 
      | 
    GAP(部分) | 
    GAP(部分)- 调用 FileSystemWrite.close() 时,系统将刷新文件 | 
    这是特意设计的,因为 Native File System API 文件会向操作系统公开,因此在向操作系统显示数据之前,需要先执行安全浏览检查。 | 
  
  
    | 关闭  | 
      | 
    FS(部分) | 
    FileSystemWriter.close() | 
    不会取消待处理的操作,但会将迄今为止写入的所有数据刷新到磁盘。 | 
  
  
    | ReadToArray  | 
      | 
    GAP | 
    Blob.slice().arrayBuffer() 或 Blob.arrayBuffer() | 
    允许并行执行多个子范围读取。 | 
  
PPB_FileRef
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.getFile("name", {create: true}) | 
      | 
  
  
    | GetFileSystemType | 
      | 
    FS(部分) | 
    FileSystem.type | 
      | 
  
  
    | GetName | 
      | 
    FS(部分) | 
    File.name | 
      | 
  
  
    | GetPath | 
      | 
    FS(部分) | 
    差距(部分)- 使用原生文件系统 API,可以通过使用 FileSystemHandle.resolve(FileSystemHandle) 对包含文件的目录的引用来确定文件的相对路径 | 
    无法确定文件的绝对路径,并且用户必须授予访问包含该文件的目录的权限。 | 
  
  
    | GetParent | 
      | 
    FS(部分) | 
    差距(部分)- 使用原生文件系统 API,可以通过使用 FileSystemHandle.resolve(FileSystemHandle) 对包含文件的目录的引用来确定文件的相对路径 | 
    用户必须授予访问包含相应文件的目录的权限。 | 
  
  
    | MakeDirectory  | 
      | 
    FS(部分) | 
    FileSystemHandle.getDirectory(..., {createIfNotExists: true})  | 
      | 
  
  
    | 触摸  | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.getFile("name", {create: true}) | 
    写入可能会被提升修改时间。 | 
  
  
    | 删除 | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.removeEntry() | 
    与 PPAPI 不同,目录不必为空。 | 
  
  
    | 重命名  | 
      | 
    FS(部分) | 
    GAP(部分)- 使用 Native File System API 时,可以使用新名称 FileSystemFileHandle.getFile() 和 FileSystemFileHandle.createWriter().write() 与旧文件的内容组合来写入文件。然后使用 FileSystemDirectoryHandle.removeEntry() 删除旧文件。 | 
    在原生文件系统 API 中,没有一个直接 API 可以一步完成此工作。 | 
  
  
    | 查询 | 
      | 
    GAP(部分) | 
    Blob.size、FileSystemHandle.getFile()、FileSystemHandle.getDirectory()、File.lastModified | 
    GAP(部分)- Blob.type 还可用于检查 MIME 类型。无法使用原生文件系统 API 确定文件系统类型、创建时间和上次访问时间。 | 
  
  
    | ReadDirectoryEntries | 
      | 
    FS(部分) | 
    FileSystemDirectoryHandle.getEntries() | 
      | 
  
PPB_FileSystem
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    FS(部分) | 
    window.requestFileSystem  | 
    JS API 只需一步即可搞定 | 
  
  
    | 打开 | 
      | 
    GAP | 
    window.requestFileSystem  | 
    JS API 只需一步即可搞定 | 
  
  
    | GetType | 
      | 
    GAP | 
    FileSystem.type | 
      | 
  
PPB_Fullscreen
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | IsFullScreen | 
      | 
    html5.h | 
    Document.fullscreenEnabled | 
      | 
  
  
    | SetFullscreen | 
      | 
    html5.h | 
    Document.requestFullscreen  | 
      | 
  
  
    | GetScreenSize | 
      | 
    html5.h | 
    Document.exitFullscreen  | 
      | 
  
PPB_Gamepad
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 试阅内容 | 
      | 
    SDL | 
    Gamepad.*  | 
    Gamepad 对象公开相对于 navigationStart 的时间戳。当从硬件收到数据时,该值会更新 https://www.w3.org/TR/gamepad/#gamepad-interface  | 
  
PPB_Graphics2D
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL  | 
    Canvas.getContext('2d') 中的资源 | 
      | 
  
  
    | 描述 | 
      | 
    SDL | 
    Canvas.clientWidth + Canvas.clientHeight | 
      | 
  
  
    | PaintImageData | 
      | 
    SDL  | 
    CanvasRenderingContext2D.putImageData  | 
      | 
  
  
    | 滚动 | 
      | 
    GAP | 
    CanvasRenderingContext2D.scrollIntoView、CanvasRenderingContext2D.drawImage | 
    GAP(部分)- 可通过以下方法实现:使用偏移将画布绘制到其自身上,使用 drawImage,然后填充其余部分。 | 
  
  
    | ReplaceContents | 
      | 
    SDL  | 
    CanvasRenderingContext2D.drawImage | 
      | 
  
  
    | 吸顶式 | 
      | 
    GAP | 
    无直接对等项 | 
    GAP(部分)- 绘制代码的末尾始终会有一个隐式刷新;这种情况不太可能发生变化。不过,
    
      OffscreenCanvas
    和
    
      ImageBitmapRenderingContext
    提供类似的功能。 | 
  
  
    | SetScale | 
      | 
    SDL  | 
    CanvasRenderingContext2D.scale | 
      | 
  
  
    | GetScale | 
      | 
    SDL | 
    CanvasRenderingContext2D.currentTransform | 
      | 
  
  
    | SetLayerTransform | 
      | 
    SDL  | 
    CanvasRenderingContext2D.setTransform
CanvasRenderingContext2D.scale
CanvasRenderingContext2D.translate  | 
      | 
  
PPB_Graphics3D
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetAttribMaxValue | 
      | 
    OpenGL ES 3.0 | 
    WebGL 2.0 | 
    GAP(部分)- WebGL 2.0 和 Emscripten 提供的 OpenGL ES 3.0 支持用户定义的多重采样帧缓冲区,其中所有可通过 PPAPI 配置的参数均可设置。 | 
  
  
    | 制作 | 
      | 
    SDL  | 
    Canvas.getContext | 
      | 
  
  
    | GetAttribs | 
      | 
    SDL | 
    WebGLRenderingContext.getContextAttributes | 
      | 
  
  
    | SetAttribs | 
      | 
    SDL  | 
    Canvas.getContext(.., OPTIONS) | 
      | 
  
  
    | GetError | 
      | 
    SDL | 
    WebGLRenderingContext.getError | 
      | 
  
  
    | ResizeBuffers | 
      | 
    SDL | 
    Canvas.width = w;Canvas.height = h; | 
      | 
  
  
    | SwapBuffers | 
      | 
    GAP | 
    无直接对等项 | 
    GAP(部分)-
    绘制代码末尾始终存在隐式 flush;不太可能
    进行更改。不过,
    
      OffscreenCanvas
    和
    
      ImageBitmapRenderingContext
    提供类似的功能。 | 
  
PPB_ImageData
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetNativeImageDataFormat | 
      | 
    SDL | 
    ImageData 要求 RGBA 顺序 | 
      | 
  
  
    | IsImageDataFormatSupported | 
      | 
    SDL  | 
    ImageData 要求 RGBA 顺序 | 
      | 
  
  
    | 制作 | 
      | 
    SDL | 
    CanvasRenderingContext2d.createImageData  | 
      | 
  
  
    | 描述 | 
      | 
    SDL | 
    ImageData 从不具有 stride | 
      | 
  
  
    | 地图 | 
      | 
    SDL  | 
    ImageData.data | 
      | 
  
  
    | 取消映射 | 
      | 
    SDL  | 
    ImageData.data | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | RequestInputEvents | 
      | 
    SDL  | 
    无直接对等项 | 
    由于 JS / Wasm 在主线程上运行,因此缺少此功能的相关程度较低,并且能够以更便宜的方式过滤事件,而不会产生跨进程往返。 | 
  
  
    | RequestFilteringInputEvents | 
      | 
    SDL  | 
    鼠标* 键* 滚轮* 触摸* 组合* 事件 | 
      | 
  
  
    |   | 
      | 
    SDL | 
    Element.addEventListener | 
      | 
  
  
    | ClearInputEventRequest | 
      | 
    SDL  | 
    Element.removeEventListener  | 
      | 
  
  
    | GetType | 
      | 
    SDL | 
    事件类后代 | 
      | 
  
  
    | GetTimeStamp  | 
      | 
    SDL  | 
    Event.timeStamp | 
      | 
  
  
    | GetModifiers | 
      | 
    SDL  | 
    *Event.altKey/shiftKey/metaKey/ctrlKey  | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL | 
    MouseEvent | 
      | 
  
  
    | GetButton | 
      | 
    SDL  | 
    MouseEvent.button | 
      | 
  
  
    | GetPosition | 
      | 
    SDL | 
    MouseEvent.client*/page*/offset* | 
      | 
  
  
    | GetClickCount | 
      | 
    SDL | 
    “dblclick”与“mousedown”事件 | 
      | 
  
  
    | GetMovement | 
      | 
    SDL | 
    MouseEvent.movement*  | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL | 
    WheelEvent | 
      | 
  
  
    | GetDelta | 
      | 
    SDL | 
    WheelEvent.delta* | 
      | 
  
  
    | GetTicks | 
      | 
    GAP | 
    GAP - deltaMode 种类包含此信息,但并未完全包含。 | 
    以下讨论了如何实现 WheelEvent.deltaMode API:https://github.com/w3c/uievents/issues/181#issuecomment-537811017 | 
  
  
    | GetScrollByPage  | 
      | 
    GAP | 
    GAP - deltaMode 种类包含此信息,但并未完全包含。 | 
    以下讨论了如何实现 WheelEvent.deltaMode API:https://github.com/w3c/uievents/issues/181#issuecomment-537811017 | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL  | 
    KeyboardEvent | 
      | 
  
  
    | GetKeyCode  | 
      | 
    SDL | 
    KeyboardEvent.keyCode | 
      | 
  
  
    | GetCharacterText | 
      | 
    SDL  | 
    KeyboardEvent.key | 
      | 
  
  
    | GetCode | 
      | 
    SDL | 
    KeyboardEvent.code | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    SDL | 
    TouchEvent | 
      | 
  
  
    | AddTouchPoint  | 
      | 
    SDL  | 
    TouchEvent.touches.push  | 
      | 
  
  
    | GetTouchCount | 
      | 
    SDL  | 
    TouchEvent.touches.length  | 
      | 
  
  
    | GetTouchByIndex  | 
      | 
    SDL  | 
    TouchEvent.touches[i] | 
      | 
  
  
    | GetTouchById | 
      | 
    SDL  | 
    Touch.indentifer(请自行确定) | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    CompositionEvent | 
      | 
  
  
    | GetText  | 
      | 
    GAP | 
    CompositionEvent.data  | 
      | 
  
  
    | GetSegmentNumber | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
    这些数据可能会从 CompositionEvent.data 中检索。 | 
  
  
    | GetSegmentOffset  | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetTargetSegment | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetSelection | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
PPB_Instance
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | BindGraphics | 
      | 
    SDL | 
    Canvas.getContext(由于绑定是自动进行的,因此无效)。 | 
      | 
  
  
    | IsFullFrame | 
      | 
    GAP | 
    GAP - 没有等同于 MIME 类型处理程序的功能。 | 
    NaCl 应用可以注册以处理特定 MIME 类型并拥有整个文档。 | 
  
  
    | DidCreate  | 
      | 
    不适用 | 
    <Element>[key]  | 
    借助通用 DOM 访问权限,您可以提取标记属性 | 
  
  
    | DidDestroy | 
      | 
    不适用 | 
    不适用 | 
    不会因 NaCl 而触发 | 
  
  
    | DidChangeView  | 
      | 
    不适用 | 
    元素“resize”事件 | 
      | 
  
  
    | DidChangeFocus | 
      | 
    不适用 | 
    元素“focus”“focusin”“focusout”事件 | 
      | 
  
  
    | HandleDocumentLoad | 
      | 
    不适用 | 
    GAP - 无法注册为 MIME 类型处理程序 | 
    NaCl 模块(通过应用 + 清单条目)可设置为处理特定的 MIME 类型。 | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 配置  | 
      | 
    GAP | 
    getUserMedia() | 
    getUserMedia() 中的约束条件可以提供要在 MediaStreamTrack 中使用的配置值。 | 
  
  
    | GetAttrib | 
      | 
    GAP | 
    MediaStreamTrack.getSettings() | 
      | 
  
  
    | GetId  | 
      | 
    GAP | 
    MediaStreamTrack.id | 
      | 
  
  
    | HasEnded | 
      | 
    GAP | 
    MediaStreamTrack.readyState | 
      | 
  
  
    | GetBuffer | 
      | 
    GAP | 
    GAP - 无对等方法 | 
      | 
  
  
    | RecycleBuffer | 
      | 
    GAP | 
    GAP - 无对等项 | 
      | 
  
  
    | 关闭  | 
      | 
    GAP | 
    MediaStreamTrack.stop() | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    画布截图 | 
    Canvas Capture 支持以编程方式引入视频帧。 | 
  
  
    | 配置  | 
      | 
    GAP | 
    applyConstraints(), getUserMedia() | 
    差距(部分)- Web API 中可用的配置范围可能与 PPAPI 不同。 | 
  
  
    | GetAttrib | 
      | 
    GAP | 
    MediaStreamSettings.width  | 
      | 
  
  
    |   | 
      | 
    GAP | 
    MediaStreamSettings.height  | 
      | 
  
  
    |   | 
      | 
    GAP | 
    GAP - 无与 PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES 对等项 | 
    MediaStream 无法预加载,因此绝不会缓冲:https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements | 
  
  
    |   | 
      | 
    GAP | 
    GAP - 没有等效于 PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT | 
      | 
  
  
    | GetId | 
      | 
    GAP | 
    MediaStreamTrack.id | 
      | 
  
  
    | HasEnded | 
      | 
    GAP | 
    MediaStreamTrack.readyState  | 
      | 
  
  
    | GetFrame | 
      | 
    GAP | 
    GAP - 无等效项 | 
      | 
  
  
    | RecycleFrame | 
      | 
    GAP | 
    GAP - 无对等项 | 
      | 
  
  
    | 关闭  | 
      | 
    GAP | 
    MediaStreamTrack.stop() | 
      | 
  
  
    | GetEmptyFrame | 
      | 
    GAP | 
    GAP - 无等效项 | 
      | 
  
  
    | PutFrame | 
      | 
    GAP | 
    GAP - 无对等方法 | 
      | 
  
PPB_MessageLoop
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
  
    | GetForMainThread | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
  
    | GetCurrent | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
  
    | AttachToCurrentThread | 
      | 
    不适用 | 
    大多数情况下没有问题,工作器会获得隐式事件循环。 | 
      | 
  
  
    | 您可以在  | 
      | 
    不适用 | 
    大多数情况下没有问题,工作器会获得隐式事件循环。 | 
      | 
  
  
    | PostWork | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
  
    | PostQuit | 
      | 
    不适用 | 
    工作器会获得一个隐式事件循环,但这在大多数情况下是无关紧要的。 | 
      | 
  
PPB_Messaging
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | PostMessage | 
      | 
    不适用 | 
    Window.postMessage | 
      | 
  
  
    | RegisterMessageHandler | 
      | 
    不适用 | 
    Window.addEventListener  | 
      | 
  
  
    | UnregisterMessageHandler | 
      | 
    不适用 | 
    Window.removeEventListener | 
      | 
  
PPB_MouseCursor
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | SetCursor | 
      | 
    SDL | 
    Element.style.cursor  | 
    支持使用同一组常用光标。
可以使用 url(..) 实现自定义光标。
您可以使用数据 URI 实现动态自定义光标。
CSS3 支持指定热点。 | 
  
PPB_MouseLock
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | LockMouse | 
      | 
    SDL | 
    Element.requestPointerLock  | 
      | 
  
  
    | UnlockMouse | 
      | 
    SDL | 
    Element.exitPointerLock  | 
      | 
  
PPB_OpenGLES2
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 多种方法 | 
      | 
    OpenGLES | 
    功能接近 WebGL 1.0。 | 
      | 
  
  
    |   | 
    x  | 
      | 
    OffscreenCanvas | 
      | 
  
PPB_TextInputController
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | SetTextInputType | 
      | 
    GAP | 
    GAP - 可能被 Input Method Editor API 填充 | 
    有些开发者希望能够以这种方式进行提示,或者更喜欢在画布内拦截并显示 IME 事件 / 输出内嵌的功能。 | 
  
  
    | UpdateCaretPosition | 
      | 
    GAP | 
    GAP - 可能由输入法编辑器 API 填充 | 
    https://www.w3.org/TR/ime-api/ | 
  
  
    | CancelCompositionText  | 
      | 
    GAP | 
    GAP - 可能由输入法编辑器 API 填充 | 
    https://www.w3.org/TR/ime-api/  | 
  
  
    | UpdateSurroundingText | 
      | 
    GAP | 
    GAP - 可能由输入法编辑器 API 填充 | 
    https://www.w3.org/TR/ime-api/ | 
  
PPB_URLLoader
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    embind | 
    new XMLHttpRequest();  | 
      | 
  
  
    | 未解决 | 
      | 
    embind  | 
    XMLHttpRequest.open | 
      | 
  
  
    | FollowRedirect | 
      | 
    embind | 
    Request.redirect | 
      | 
  
  
    |   | 
      | 
    GAP | 
    GAP - 无 XMLHTTPRequest 等效项 | 
      | 
  
  
    | GetUploadProgress  | 
      | 
    embind  | 
    XMLHttpRequest “progress”事件 | 
      | 
  
  
    |   | 
      | 
    GAP | 
    FetchObserver | 
    尚未指定或实现;https://github.com/whatwg/fetch/issues/607  | 
  
  
    | GetDownloadProgress | 
      | 
    embind  | 
    XMLHttpRequest “progress”事件 | 
      | 
  
  
    |   | 
      | 
    GAP | 
    FetchObserver | 
    尚未说明或实施;https://github.com/whatwg/fetch/issues/607 | 
  
  
    | GetResponseInfo | 
      | 
    embind | 
    XMLHttpRequest.getAllResponseHeaders | 
      | 
  
  
    |   | 
      | 
    embind | 
    提取响应。* | 
      | 
  
  
    | ReadResponseBody | 
      | 
    embind  | 
    XMLHttpRequest.response | 
      | 
  
  
    |   | 
      | 
    embind  | 
    正文。*(响应是正文) | 
      | 
  
  
    | FinishStreamingToFile | 
      | 
    embind  | 
    GAP - 无直接对等项 | 
    XMLHttpRequest 和 Fetch 都假定流式传输到内存,而不是直接传输到存储空间。 | 
  
  
    | 关闭  | 
      | 
    embind  | 
    XMLHttpRequest.abort | 
      | 
  
  
    |   | 
      | 
    GAP | 
    Fetch API:AbortSignal 和 AbortController | 
      | 
  
PPB_URLRequestInfo
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    embind  | 
    XMLHttpRequest | 
      | 
  
  
    |   | 
      | 
    embind | 
    提取请求 | 
      | 
  
  
    | SetProperty | 
      | 
    GAP | 
    GAP - 没有 XMLHttpRequest 的直接等效项 | 
    XMLHttpRequest 不提供根据请求限制以下重定向、流式传输到文件、设置引荐来源网址或凭据政策的直接方法。 | 
  
  
    |   | 
      | 
    embind  | 
    请求。* | 
      | 
  
  
    | AppendDataToBody  | 
      | 
    embind  | 
    XMLHttpRequest.send  | 
    GAP - 两者都必须有完整的身体,而不是部分。 | 
  
  
    |   | 
      | 
    embind | 
    fetch(.., options:body) | 
      | 
  
  
    | AppendFileToBody | 
      | 
    GAP | 
    fetch() 上传流式传输 | 
    https://www.chromestatus.com/features/5274139738767360 | 
  
  
    |   | 
      | 
    不适用 | 
    <form>  | 
    您也可以使用 FileReader 进行读取和上传,但这更类似于 AppendDataToBody | 
  
PPB_URLResponseInfo
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetProperty | 
      | 
    embind  | 
    XMLHttpRequest.getAllResponseHeaders + 其他 | 
      | 
  
  
    |   | 
      | 
    embind  | 
    提取响应。* | 
      | 
  
  
    | GetBodyAsFileRef  | 
      | 
    embind  | 
    提取响应(正文).blob() | 
    假设存储层会优化传输。 | 
  
PPB_Var
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | VarFromUtf8 | 
      | 
    embind  | 
    TextDecoder.decode | 
      | 
  
  
    | VarToUtf8 | 
      | 
    embind | 
    TextEncoder.encode | 
      | 
  
  
    | VarFromResource | 
      | 
    不适用 | 
    不适用 | 
      | 
  
  
    | VarToResource | 
      | 
    不适用 | 
    不适用 | 
      | 
  
PPB_VarArray
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 立即体验 | 
      | 
    embind | 
    Array[i] | 
      | 
  
  
    | 将 | 
      | 
    embind | 
    Array[i] = x  | 
      | 
  
  
    | GetLength | 
      | 
    embind | 
    Array.length | 
      | 
  
  
    | SetLength | 
      | 
    embind  | 
    Array.length = n | 
      | 
  
PPB_VarArrayBuffer
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    embind  | 
    新的 ArrayBuffer(n) | 
      | 
  
  
    | ByteLength | 
      | 
    embind  | 
    ArrayBuffer.byteLength | 
      | 
  
  
    | 地图 | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
    Asm.js / Wasm 模块无法映射 ArrayBuffer 的单线性内存堆以外的区域。
将来使用多个记忆或内存映射可能会改善这种情况。 | 
  
  
    | 取消映射 | 
      | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
PPB_VarDictionary
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    embind | 
    {} | 
      | 
  
  
    | 立即体验 | 
      | 
    embind | 
    <Object>[i]  | 
      | 
  
  
    | 将 | 
      | 
    embind | 
    <对象>[i] = x | 
      | 
  
  
    | 删除 | 
      | 
    embind  | 
    delete <Object>[i]  | 
      | 
  
  
    | HasKey | 
      | 
    embind | 
    <Object> 中的 x | 
      | 
  
  
    | GetKeys | 
      | 
    embind | 
    (<Object> 中的 k){} | 
    没有文字等效项,但可以构建。 | 
  
PPB_VideoDecoder
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 VideoDecoder() 进行处理 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming  | 
  
  
    | 初始化 | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 VideoDecoder() 初始化参数 (VideoDecoderInitParameters) 进行处理 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming | 
  
  
    | 解码 | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 ReadableStream.pipeThrough(VideoDecoder) 进行处理 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming | 
  
  
    | GetPicture | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable) 进行处理 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming  | 
  
  
    | RecyclePicture | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 进行处理。当前设计会自动回收图片,并继续执行解码过程。 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming  | 
  
  
    | 刷新 | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。API 将被命名为 Flush(),但是对于与解码调用相关的如何排序,我们还在讨论。 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming | 
  
  
    | 重置 | 
      | 
    GAP | 
    GAP - 将通过销毁 VideoDecoder 实例并创建新实例来使用建议的 WebCodecs API 进行处理。这不如专用重置方法高效,但 Reset() API 的语义仍在讨论中。 | 
    https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming | 
  
PPB_VideoEncoder
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 使用 VideoEncoder() 进行处理 | 
      | 
  
  
    | GetSupportedProfiles | 
      | 
    GAP | 
    GAP(部分)- navigator.mediaCapabilities.encodingInfo() | 
    您必须逐个检查支持的配置文件。 | 
  
  
    | 初始化 | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 和 VideoEncoder() 初始化参数进行处理 | 
      | 
  
  
    | GetFramesRequired  | 
      | 
    GAP | 
    GAP - 无对等项 | 
    Web Codecs API 内部使用的帧池不太可能公开。 | 
  
  
    | GetFrameCodedSize  | 
      | 
    GAP | 
    GAP - 无对等项 | 
    Web Codecs API 内部使用的帧池不太可能公开。 | 
  
  
    | GetVideoFrame | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 通过 ReadableStream.pipeThrough(VideoEncoder) 进行处理。这会直接在 Readable 流中编码数据,而不是在编码前抓取单个帧来填充数据。 | 
      | 
  
  
    | 编码 | 
      | 
    GAP | 
    GAP - 将通过提议的 WebCodecs API 使用 ReadableStream.pipeThrough(VideoEncoder) 进行处理 | 
      | 
  
  
    | GetBitstreamBuffer | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 进行处理。当前设计会自动检查通过管道传输的编码比特流缓冲区。 | 
    WebCodecs API 目前假定可以复制比特流缓冲区,而不是将其加入池,因此无需回收。 | 
  
  
    | RecycleBitstreamBuffer  | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。当前设计将自动回收缓冲区,以保持编码过程的顺利进行。 | 
    将来这一点不太可能改变,因为对性能的影响会更小。 | 
  
  
    | RequestEncodingParametersChange | 
      | 
    GAP | 
    GAP - 将由提议的 Web Codecs API 处理。某些参数可以动态更改,而另一些参数则需要拆解编码器。 | 
      | 
  
  
    | 关闭  | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 通过使用 VideoEncoder.Close() 进行处理 | 
      | 
  
PPB_VideoFrame
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetTimestamp | 
      | 
    GAP | 
    GAP - 将使用提议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | SetTimestamp | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | GetFormat | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | GetSize | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | GetDataBuffer  | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
  
    | GetDataBufferSize  | 
      | 
    GAP | 
    GAP - 将通过建议的 WebCodecs API 进行处理。 | 
      | 
  
PPB_View
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetRect | 
      | 
    embind | 
    Element.getBoundingClientRect | 
      | 
  
  
    | IsFullscreen | 
      | 
    embind  | 
    Document.fullScreenEnabled  | 
    适用于文档,而不仅仅是单个元素。 | 
  
  
    | IsVisible | 
      | 
    embind | 
    IntersectionObserver | 
      | 
  
  
    | IsPageVisible | 
      | 
    embind  | 
    document.visibilityState | 
      | 
  
  
    | GetClipRect | 
      | 
    embind  | 
    IntersectionObserver | 
      | 
  
  
    | GetDeviceScale | 
      | 
    embind  | 
    window.devicePixelRatio | 
      | 
  
  
    | GetCSSScale | 
      | 
    embind  | 
    <Element>.getBoundingClientRect().width / <Element>.offsetWidth | 
      | 
  
  
    | GetScrollOffset  | 
      | 
    embind  | 
    <Element>.scrollTop/<Element>.scrollLeft | 
      | 
  
PPB_WebSocket
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
      | 
    GAP | 
    WebSocket.WebSocket | 
      | 
  
  
    | 关联  | 
      | 
    GAP | 
    WebSocket.WebSocket(url, ...)
WebSocket “open”事件 | 
      | 
  
  
    | 关闭  | 
      | 
    GAP | 
    WebSocket.close | 
      | 
  
  
    | ReceiveMessage | 
      | 
    GAP | 
    WebSocket “message”事件
WebSocket“error”事件
WebSocket“关闭”事件 | 
      | 
  
  
    | SendMessage | 
      | 
    GAP | 
    WebSocket.send | 
      | 
  
  
    | GetBufferedAmount | 
      | 
    GAP | 
    WebSocket.bufferedAmount | 
      | 
  
  
    | GetCloseCode | 
      | 
    GAP | 
    CloseEvent.code | 
      | 
  
  
    | GetCloseReason | 
      | 
    GAP | 
    CloseEvent.reason | 
      | 
  
  
    | GetCloseWasClean  | 
      | 
    GAP | 
    CloseEvent.wasClean  | 
      | 
  
  
    | GetExtensions | 
      | 
    GAP | 
    WebSocket.extensions | 
      | 
  
  
    | GetProtocol | 
      | 
    GAP | 
    WebSocket.protocol | 
      | 
  
  
    | GetReadyState | 
      | 
    GAP | 
    WebSocket.readyState | 
      | 
  
  
    | GetURL | 
      | 
    GAP | 
    WebSocket.url | 
      | 
  
PPP_Graphics3D
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 图形 3D 上下文丢失 | 
      | 
    SDL | 
    画布“webglcontextlost”事件 | 
      | 
  
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | HandleInputEvent | 
      | 
    SDL  | 
    Element.addEventListener  | 
      | 
  
PPP_Instance
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | DidCreate | 
      | 
    不适用 | 
    <Element>[key]  | 
    借助通用 DOM 访问权限,您可以提取标记属性 | 
  
  
    | DidDestroy | 
      | 
    不适用 | 
    不适用 | 
    不会因 NaCl 而触发 | 
  
  
    | DidChangeView  | 
      | 
    不适用 | 
    元素“resize”事件 | 
      | 
  
  
    | DidChangeFocus | 
      | 
    不适用 | 
    元素“focus”“focusin”“focusout”事件 | 
      | 
  
  
    | HandleDocumentLoad | 
      | 
    不适用 | 
    GAP - 无法注册为 MIME 类型处理程序 | 
    您可以通过应用 + 清单条目设置 NaCl 模块来处理特定 MIME 类型。 | 
  
PPP_MessageHandler
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | HandleMessage | 
      | 
    embind | 
    MessagePort“message”事件
窗口“消息”事件 | 
      | 
  
  
    | HandleBlockingMessage | 
      | 
    不适用 | 
    GAP - 无直接对等项 | 
    类似的同步可以使用 Atomics.wait 在主线程外完成。添加此 API 是为了支持模拟同步插件 API。 | 
  
PPP_Messaging
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | HandleMessage | 
      | 
    embind | 
    MessagePort“message”事件
窗口“消息”事件 | 
      | 
  
PPP_MouseLock
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | MouseLockLost | 
      | 
    SDL  | 
    元素“pointerlockchange”“pointerlockerror”活动 | 
      | 
  
PPAPI(应用)
PPB_HostResolver
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
    x  | 
    GAP | 
    差距(部分)- 无直接对等项 | 
      | 
  
  
    | 解决 | 
    x  | 
    GAP | 
    GAP(部分)- 无直接对等项 | 
      | 
  
  
    | GetCanonicalName | 
    x  | 
    GAP | 
    差距(部分)- 无直接对等项 | 
      | 
  
  
    | GetNetAddressCount | 
    x  | 
    GAP | 
    差距(部分)- 无直接对等项 | 
      | 
  
  
    | GetNetAddress | 
    x  | 
    GAP | 
    差距(部分)- 无直接对等项 | 
      | 
  
PPB_NetAddress
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | CreateFromIPv4Address | 
    x  | 
    GAP | 
    GAP(部分)- 无直接对等项 | 
      | 
  
  
    | CreateFromIPv6Address | 
    x  | 
    GAP | 
    差距(部分)- 无直接对等项 | 
      | 
  
  
    | GetFamily  | 
    x  | 
    GAP | 
    差距(部分)- 无直接对等项 | 
      | 
  
  
    | DescribeAsString | 
    x  | 
    GAP | 
    差距(部分)- 无直接对等项 | 
      | 
  
  
    | DescribeAsIPv4Address | 
    x  | 
    GAP | 
    差距(部分)- 无直接对等项 | 
      | 
  
  
    | DescribeAsIPv6Address  | 
    x  | 
    GAP | 
    GAP(部分)- 无直接对等项 | 
      | 
  
PPB_NetworkList
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetCount | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetName | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetType | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetState | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetIpAddress  | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetDisplayName  | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | GetMTU | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
PPB_NetworkMonitor
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | 制作 | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
  
    | UpdateNetworkList | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
PPB_NetworkProxy
  
    | PPAPI 方法 | 
    假设线程 | 
    Emscripten | 
    网络 API | 
    限制 | 
  
  
    | GetProxyForURL | 
    x  | 
    GAP | 
    GAP - 无直接对等项 | 
      | 
  
PPB_TCPSocket 和 PPB_UDPSocket
没有用于迁移的直接 1 对 1 映射。不过,我们在下文中列出了一些用户场景以及建议的迁移路径。
*:未来可能为 WebTransport
**: 请访问 chromestatus,了解可用情况
  
  
  
 
  
    
    
      
    
    
  
       
    
    
  
  
  如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
  最后更新时间 (UTC):2022-05-27。
  
  
  
    
      [[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["没有我需要的信息","missingTheInformationINeed","thumb-down"],["太复杂/步骤太多","tooComplicatedTooManySteps","thumb-down"],["内容需要更新","outOfDate","thumb-down"],["翻译问题","translationIssue","thumb-down"],["示例/代码问题","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2022-05-27。"],[],[]]