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;不太可能 进行更改。不过,OffscreenCanvasImageBitmapRenderingContext 的组合可提供类似的功能。
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

PPB_InputEvent

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

PPB_MouseInputEvent

PPAPI 方法 假设线程 Emscripten 网络 API 限制
制作 SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL “dblclick”与“mousedown”事件
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

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

PPB_KeyboardInputEvent

PPAPI 方法 假设线程 Emscripten 网络 API 限制
制作 SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

PPAPI 方法 假设线程 Emscripten 网络 API 限制
制作 SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer(请自行确定)

PPB_IMEInputEvent

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 类型。

PPB_MediaStreamAudioTrack

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()

PPB_MediaStreamVideoTrack

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”事件

PPP_InputEvent

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(&quot;name&quot;, {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(&quot;name&quot;, {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

PPB_InputEvent

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

PPB_MouseInputEvent

PPAPI 方法 假设线程 Emscripten 网络 API 限制
制作 SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL “dblclick”与“mousedown”事件
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

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

PPB_KeyboardInputEvent

PPAPI 方法 假设线程 Emscripten 网络 API 限制
制作 SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

PPAPI 方法 假设线程 Emscripten 网络 API 限制
制作 SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer(请自行确定)

PPB_IMEInputEvent

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 类型。

PPB_MediaStreamAudioTrack

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()

PPB_MediaStreamVideoTrack

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”事件

PPP_InputEvent

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 映射。不过,我们在下文中列出了一些用户场景以及建议的迁移路径。

使用场景 建议
屏幕共享 getDisplayMediaWebRTC 演示
从 本地服务器以尽可能减少带宽使用量 XHR、Fetch、Stream、Service Worker、Cache API
从 Web 应用的本地实例加载/连接到 Web 应用的本地实例 WebRTC
聊天 WebSocket*
实时音频/视频通信 WebRTC
协作 WebSocket*
实时报告 多人游戏 WebTransport**(除非是点对点连接,在这种情况下为 WebRTC [或通过 RTCIceTransport 的 WebTransport])
实时互动式在线播放 WebTransport**
与旧版服务器通信 使用代理服务器或中间件进行协议转换。请通过 bit.ly/network-api-gaps 提供反馈

*:未来可能为 WebTransport

**: 请访问 chromestatus,了解可用情况