WebAssembly 遷移指南

(P)NaCl 淘汰公告

由於越來越多瀏覽器支援 WebAssembly,因此我們打算將 並計劃移除對 WebAssembly 的支援 PNaCl 在 2019 年第 4 季推出 (Chrome 應用程式除外)。我們認為,圍繞 WebAssembly 的蓬勃生態系統更適合新舊高效能網頁應用程式,而 PNaCl 的使用率也已低到足以淘汰。

自 Chrome 76 起,開放網路上的 PNaCl 已移至原點測試後方,這是網頁開發人員註冊並取得預設未啟用的功能的機制。這通常是新提案的功能,但在本例中,這是已淘汰的功能。開發人員可以透過來源試用控制台註冊 並接收符記,您可以將該符記嵌入網頁中,這樣使用者無需使用旗標即可啟用功能。 (詳情請參閱連結的指南)。試用預計至 Chrome 78 為止 (大約至 2019 年 12 月為止)。 這項異動不適用於 Chrome 應用程式或擴充功能中的 NaCl 或 PNaCl,以及「enable-nacl」 chrome://flags 中的旗標也可以用來在本機啟用 PNaCl 進行測試 (此標記會保留該標記目前用來在任何頁面啟用非 PNaCl「原生」NCl 的功能)。

我們也於近期宣布,將在 2018 年第 1 季停用 ChromeOS 以外的 Chrome 應用程式

工具鍊遷移

以大多數的 (P)NaCl 用途來說,我們建議您將 從 NaCl SDK 改用 Emscripten。 遷移作業可能相當簡單明瞭 如果應用程式可攜至 Linux,請使用 SDL 或 POSIX API。 雖然無法直接支援 NaCl / Ppper API, 因此我們嘗試列出 Web API 對等項目 如需更複雜的移植案例,請透過 native-client-discuss@googlegroups.com 與我們聯絡。

API 遷移

我們在此概略說明 (P)NaCl 公開的每個 API 的 Web Platform 替代方案狀態。此外,這個表格列出 Emscripten 的資料庫或選項 提供最接近的替代品

我們預計在 2017 年為 WebAssembly 新增共用記憶體執行緒支援功能,因為執行緒對於 (P)NaCl 最有趣的用途而言至關重要。假設即將支援執行緒的遷移項目 。如果應用程式的流量控制嚴重仰賴封鎖功能 API 時,您可能也會需要支援執行緒,以便輕鬆進行攜碼轉移。

雖然我們力求在這個表格中提供準確的資訊, 沒有懷疑的錯誤或遺漏。 如果您遇到問題,請透過 native-client-discuss@googlegroups.com 與我們聯絡

PPAPI

PPB_Audio

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
建立 x SDL (部分) GAP (部分) - AudioWorkletNode ROUGHLY 同等 AudioWorkletSpec 已完成,但 AudioDeviceClient 或許更適合這個 API。社群仍在指定 AudioDeviceClient。工作區塊可能與此 API 不完全相同。
GetCurrentConfig SDL 音訊情境*。(取得設定傳遞)
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 位元 int。 PPAPI 理論上支援多種取樣大小。實際上,它僅支援 16 位元樣本。不幸的是,開發人員要求使用 16 位元樣本大小,以節省記憶體用量。下一版 Web Audio 規格將實作 16 位元取樣支援功能。您可以使用與 Firefox 類似的方式實作 AudioBuffer 最佳化,方法是針對來自 decodeAudioData 的音訊使用 16 位元緩衝區
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
建立 Stereo16Bit 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 可視為相當完整的替代方案。開發人員工具來源對應可用於偵錯轉譯後的 JavaScript,並以原始來源語言進行偵錯。

PPB_Core

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
getTime utime 新的 Date().getTime()
getTimeTicks utime new 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 類型。您無法使用原生檔案系統 API 判斷檔案系統類型、建立時間和上次存取時間。
輕觸 FS (部分) FileSystemDirectoryHandle.getFile("name", {create: true})
閱讀資料 FS (部分) Blob.slice().arrayBuffer()
寫入 FS (部分) FileSystemWriter.write()
SetLength FS (部分) FileSystemWriter.truncate()
清除 GAP (部分) GAP (部分) - 呼叫 FileSystemWrite.close() 時會刷新檔案 這與設計相關的設計在於,由於原生 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 (部分) GAP (部分) - 使用 Native File System API 時,可以從參照使用 FileSystemHandle.resolve(FileSystemHandle) 找出檔案的相對路徑 無法判斷檔案的絕對路徑,使用者必須授予存取包含檔案的目錄的權限。
GetParent FS (部分) GAP (部分) - 使用 Native File System API 時,可以從參照使用 FileSystemHandle.resolve(FileSystemHandle) 找出檔案的相對路徑 使用者必須授予存取檔案所在目錄的權限。
MakeDirectory FS (部分) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
輕觸 FS (部分) FileSystemDirectoryHandle.getFile("name", {create: true}) 透過書面方式可以調整修改時間。
刪除 FS (部分) FileSystemDirectoryHandle.removeEntry() 與 PPAPI 不同,目錄不必為空。
重新命名 FS (部分) GAP (部分) - 透過原生 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 物件會顯示與 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 (部分) - 繪圖程式碼結尾會一律有隱含清除。不太可能 並做出相應的變更不過,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 (部分) - 繪圖程式碼結尾會一律有隱含清除。不太可能 並做出相應的變更不過,OffscreenCanvasImageBitmapRenderingContext 的組合可提供類似的功能。

PPB_ImageData

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
GetNativeImageDataFormat SDL ImageData 要求 RGBA 順序
IsImageDataFormatSupported SDL ImageData 規定 RGBA 順序
建立 SDL CanvasRenderingContext2d.createImageData
說明 SDL ImageData 從未有步幅
地圖 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 type 處理常式的功能。 NaCl 應用程式可以註冊來處理特定 MIME 類型,並擁有整份文件。
DidCreate 不適用 <Element>[key] 一般 DOM 存取權可讓您篩選標籤屬性
DidDestroy 不適用 不適用 未針對 NaCl 觸發
DidChangeView 不適用 元素「resize」事件
DidChangeFocus 不適用 元素「聚焦」、「焦點」、「焦點」活動
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 畫布擷取 畫布擷取功能可讓你透過程式輔助方式導入影片影格。
設定 GAP applyConstraints()、getUserMedia() GAP (部分) - 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 不適用 大多是無關緊要的,worker 會取得隱含的事件迴圈。
GetCurrent 不適用 大多數情況下,工作站都有隱含的事件迴圈。
AttachToCurrentThread 不適用 大多是無關緊要的,worker 會取得隱含的事件迴圈。
不適用 大多數情況下,工作站都有隱含的事件迴圈。
PostWork 不適用 大多是無關緊要的,worker 會取得隱含的事件迴圈。
PostQuit 不適用 大多是無關緊要的,worker 會取得隱含的事件迴圈。

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 填入 部分開發人員希望能夠以這個方式提示,或者希望能夠在畫布中以內嵌方式攔截及顯示輸入法編輯器事件 / 輸出內容。
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 讀取並上傳檔案,但比較像是 AttachDataToBody

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 陣列[i]
Set embind 陣列 [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 &lt;Object&gt;[i]
Set embind <Object>[i] = x
刪除 embind delete <Object>[i]
HasKey embind <Object> 中的 x
GetKeys embind for (<Object> 中的 k) {} 沒有對等的常值,但可以建構。

PPB_VideoDecoder

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
建立 GAP GAP - 使用 VideoDecoder() 以提議的 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 處理,並使用 VideoDecoder() 初始化參數 (VideoDecoderInitParameters) https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Decode GAP GAP - 使用 ReadableStream.pipeThrough(VideoDecoder) 時,透過提議的 WebCodecs API 進行處理 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 - 會使用 VideoEncoder() 處理建議的 WebCodecs API
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 - 會使用 ReadableStream.pipeThrough(VideoEncoder) 使用建議的 WebCodecs API 處理。這樣可直接將可讀串流中的資料編碼,而不必在編碼前擷取單一影格來填入資料。
編碼 GAP GAP - 使用 ReadableStream.pipeThrough(VideoEncoder) 時,透過提議的 WebCodecs API 進行處理
GetBitstreamBuffer GAP GAP - 會透過建議的 WebCodecs API 處理。目前的設計將自動通過傳輸的編碼位元串流緩衝區。 WebCodecs API 目前假設位元串流緩衝區可以複製而非集區,因此不需要回收。
RecycleBitstreamBuffer GAP GAP - 將使用提議的 WebCodecs API 處理。目前設計會自動回收緩衝區,以便繼續進行編碼程序。 由於效能影響較小,這項做法日後不太可能有所變動。
RequestEncodingParametersChange GAP GAP - 將由提案的 Web Codecs API 處理。某些參數可立即變更,有些參數則需要先終止編碼器。
關閉 GAP GAP - 使用 VideoEncoder.Close(),以提議的 WebCodecs API 處理

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 <元素>.scrollTop/<元素>.scrollLeft

PPB_WebSocket

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
建立 GAP WebSocket.WebSocket
連結 GAP WebSocket.WebSocket(網址, ...) WebSocket 開啟活動
關閉 GAP WebSocket.close
ReceiveMessage GAP WebSocket 的「訊息」活動 WebSocket 的「錯誤」活動 WebSocket 的「close」活動
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 不適用 &lt;Element&gt;[key] 一般 DOM 存取權可讓您篩選標籤屬性
DidDestroy 不適用 不適用 未針對 NaCl 觸發
DidChangeView 不適用 元素「resize」事件
DidChangeFocus 不適用 元素「聚焦」、「焦點」、「焦點」活動
HandleDocumentLoad 不適用 GAP - 無法註冊為 MIME 類型處理常式 透過應用程式提供的 NaCl 模組 + 資訊清單項目可以進行設定,處理特定的 MIME 類型。

PPP_MessageHandler

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
HandleMessage embind MessagePort「message」事件 Window「message」事件
HandleBlockingMessage 不適用 GAP - 沒有直接對等項目 您也可以使用 Atomics.wait 在主執行緒外執行類似的同步處理作業。這項功能是為了支援同步外掛程式 API 的模擬。

PPP_Messaging

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
HandleMessage embind MessagePort「message」事件 Window「message」事件

PPP_MouseLock

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
MouseLockLost SDL 元素「pointerlockchange」和「pointerlockerror」事件

IRT

PPB_Audio

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
建立 x SDL (部分) GAP (部分) - AudioWorkletNode ROUGHLY 同等 AudioWorkletSpec 已完成,但 AudioDeviceClient 或許更適合這個 API。社群仍在指定 AudioDeviceClient。工作區塊可能與此 API 不完全相同。
GetCurrentConfig SDL 音訊情境*。(取得設定傳遞)
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 位元 int。 PPAPI 理論上支援多種取樣大小。實際上,它僅支援 16 位元樣本。不幸的是,開發人員要求使用 16 位元樣本大小,以節省記憶體用量。下一版 Web Audio 規格將實作 16 位元取樣支援功能。您可以使用與 Firefox 類似的方式實作 AudioBuffer 最佳化,方法是針對來自 decodeAudioData 的音訊使用 16 位元緩衝區
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
建立 Stereo16Bit 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 可視為相當完整的替代方案。開發人員工具來源對應可用於偵錯轉譯後的 JavaScript,並以原始來源語言進行偵錯。

PPB_Core

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
getTime utime 新的 Date().getTime()
getTimeTicks utime new 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 類型。您無法使用原生檔案系統 API 判斷檔案系統類型、建立時間和上次存取時間。
輕觸 FS (部分) FileSystemDirectoryHandle.getFile("name", {create: true})
閱讀資料 FS (部分) Blob.slice().arrayBuffer()
寫入 FS (部分) FileSystemWriter.write()
SetLength FS (部分) FileSystemWriter.truncate()
清除 GAP (部分) GAP (部分) - 呼叫 FileSystemWrite.close() 時會刷新檔案 這與設計相關的設計在於,由於原生 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 (部分) GAP (部分) - 使用 Native File System API 時,可以從參照使用 FileSystemHandle.resolve(FileSystemHandle) 找出檔案的相對路徑 無法判斷檔案的絕對路徑,使用者必須授予存取包含檔案的目錄的權限。
GetParent FS (部分) GAP (部分) - 使用 Native File System API 時,可以從參照使用 FileSystemHandle.resolve(FileSystemHandle) 找出檔案的相對路徑 使用者必須授予存取檔案所在目錄的權限。
MakeDirectory FS (部分) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
輕觸 FS (部分) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true}) 透過書面方式可以調整修改時間。
刪除 FS (部分) FileSystemDirectoryHandle.removeEntry() 與 PPAPI 不同,目錄不必為空。
重新命名 FS (部分) GAP (部分) - 透過原生 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 物件會顯示與 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 (部分) - 繪圖程式碼結尾處一律會隱含刷新,這項情況不太可能改變。不過,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 (部分) - 繪圖程式碼結尾處一律會隱含刷新,這項情況不太可能改變。不過,OffscreenCanvasImageBitmapRenderingContext 的組合可提供類似的功能。

PPB_ImageData

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
GetNativeImageDataFormat SDL ImageData 要求 RGBA 順序
IsImageDataFormatSupported SDL ImageData 規定 RGBA 順序
建立 SDL CanvasRenderingContext2d.createImageData
說明 SDL ImageData 從未有步幅
地圖 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 type 處理常式的功能。 NaCl 應用程式可以註冊來處理特定 MIME 類型,並擁有整份文件。
DidCreate 不適用 &lt;Element&gt;[key] 一般 DOM 存取權可讓您篩選標籤屬性
DidDestroy 不適用 不適用 未針對 NaCl 觸發
DidChangeView 不適用 元素「resize」事件
DidChangeFocus 不適用 元素「聚焦」、「焦點」、「焦點」活動
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 畫布擷取 畫布擷取功能可讓你透過程式輔助方式導入影片影格。
設定 GAP applyConstraints()、getUserMedia() GAP (部分) - 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 不適用 大多是無關緊要的,worker 會取得隱含的事件迴圈。
GetCurrent 不適用 大多數情況下,工作站都有隱含的事件迴圈。
AttachToCurrentThread 不適用 大多是無關緊要的,worker 會取得隱含的事件迴圈。
不適用 大多數情況下,工作站都有隱含的事件迴圈。
PostWork 不適用 大多是無關緊要的,worker 會取得隱含的事件迴圈。
PostQuit 不適用 大多是無關緊要的,worker 會取得隱含的事件迴圈。

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 填入 部分開發人員希望能夠以這個方式提示,或者希望能夠在畫布中以內嵌方式攔截及顯示輸入法編輯器事件 / 輸出內容。
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 讀取並上傳檔案,但比較像是 AttachDataToBody

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 陣列[i]
Set embind 陣列 [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 &lt;Object&gt;[i]
Set embind <Object>[i] = x
刪除 embind delete <Object>[i]
HasKey embind <Object> 中的 x
GetKeys embind for (<Object> 中的 k) {} 沒有對等的常值,但可以建構。

PPB_VideoDecoder

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
建立 GAP GAP - 使用 VideoDecoder() 以提議的 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 處理,並使用 VideoDecoder() 初始化參數 (VideoDecoderInitParameters) https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Decode GAP GAP - 使用 ReadableStream.pipeThrough(VideoDecoder) 時,透過提議的 WebCodecs API 進行處理 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 - 會使用 VideoEncoder() 處理建議的 WebCodecs API
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 - 會使用 ReadableStream.pipeThrough(VideoEncoder) 使用建議的 WebCodecs API 處理。這樣可直接將可讀串流中的資料編碼,而不必在編碼前擷取單一影格來填入資料。
編碼 GAP GAP - 使用 ReadableStream.pipeThrough(VideoEncoder) 時,透過提議的 WebCodecs API 進行處理
GetBitstreamBuffer GAP GAP - 會透過建議的 WebCodecs API 處理。目前的設計將自動通過傳輸的編碼位元串流緩衝區。 WebCodecs API 目前假設位元串流緩衝區可以複製而非集區,因此不需要回收。
RecycleBitstreamBuffer GAP GAP - 將使用提議的 WebCodecs API 處理。目前設計會自動回收緩衝區,以便繼續進行編碼程序。 由於效能影響較小,這項做法日後不太可能有所變動。
RequestEncodingParametersChange GAP GAP - 將由提案的 Web Codecs API 處理。某些參數可立即變更,有些參數則需要先終止編碼器。
關閉 GAP GAP - 使用 VideoEncoder.Close(),以提議的 WebCodecs API 處理

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 <元素>.scrollTop/<元素>.scrollLeft

PPB_WebSocket

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
建立 GAP WebSocket.WebSocket
連結 GAP WebSocket.WebSocket(網址, ...) WebSocket 開啟活動
關閉 GAP WebSocket.close
ReceiveMessage GAP WebSocket 的「訊息」活動 WebSocket 的「錯誤」活動 WebSocket 的「close」活動
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 不適用 &lt;Element&gt;[key] 一般 DOM 存取權可讓您篩選標籤屬性
DidDestroy 不適用 不適用 未針對 NaCl 觸發
DidChangeView 不適用 元素「resize」事件
DidChangeFocus 不適用 元素「聚焦」、「焦點」、「焦點」活動
HandleDocumentLoad 不適用 GAP - 無法註冊為 MIME 類型處理常式 透過應用程式提供的 NaCl 模組 + 資訊清單項目可以進行設定,處理特定的 MIME 類型。

PPP_MessageHandler

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
HandleMessage embind MessagePort「message」事件 Window「message」事件
HandleBlockingMessage 不適用 GAP - 沒有直接對等項目 您也可以使用 Atomics.wait 在主執行緒外執行類似的同步處理作業。這項功能是為了支援同步外掛程式 API 的模擬。

PPP_Messaging

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
HandleMessage embind MessagePort「message」事件 Window「message」事件

PPP_MouseLock

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
MouseLockLost SDL 元素「pointerlockchange」和「pointerlockerror」事件

PPAPI (應用程式)

PPB_HostResolver

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
建立 x GAP GAP (部分) - 沒有直接對等項目
解決 x GAP 部分差距 - 沒有直接等同項目
GetCanonicalName x GAP 部分差距 - 沒有直接等同項目
GetNetAddressCount x GAP GAP (部分) - 沒有直接對等項目
GetNetAddress x GAP GAP (部分) - 沒有直接對等項目

PPB_NetAddress

PPAPI 方法 假設執行緒 Emscripten 網路 API 限制
CreateFromIPv4Address x GAP GAP (部分) - 沒有直接對等項目
CreateFromIPv6Address x GAP 部分差距 - 沒有直接等同項目
GetFamily x GAP GAP (部分) - 沒有直接對等項目
DescribeAsString x GAP GAP (部分) - 沒有直接對等項目
DescribeAsIPv4Address x GAP 部分差距 - 沒有直接等同項目
DescribeAsIPv6Address x 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、Streams、Service Worker、Cache API
從 網頁應用程式的本機執行個體 / 連線至網頁應用程式的本機執行個體 WebRTC
即時通訊 WebSocket*
即時音訊/視訊通訊 WebRTC
協同合作 WebSocket*
即時報表 多人遊戲 WebTransport** (除非是 P2P,在這種情況下使用 WebRTC (或透過 RTCIceTransport 的 WebTransport)
即時報表 互動式串流 WebTransport**
通訊中 舊版伺服器 Proxy 伺服器或中介軟體,用於進行通訊協定轉換。提供意見給 bit.ly/network-api-gaps

*:未來也採用 WebTransport

**:如要瞭解支援情形,請參閱 chromestatus