WebAssembly-Migrationsleitfaden

Ankündigungen zur Einstellung von (P)NaCl

Angesichts der Entwicklung von browserübergreifendem WebAssembly-Support möchten wir uns darauf konzentrieren, für WebAssembly entwickelt. Wir planen, die Unterstützung für PNaCl im 4. Quartal 2019 (außer Chrome-Apps) Wir sind der Meinung, dass das dynamische WebAssembly-Ökosystem es besser für neue und bestehende leistungsstarke Web-Apps geeignet macht und dass die Nutzung von PNaCl so gering ist, dass eine Einstellung gerechtfertigt ist.

Ab Chrome 76 ist PNaCl im offenen Web nur noch über einen Ursprungstest verfügbar. Webentwickler können sich damit registrieren und Zugriff auf eine Funktion erhalten, die standardmäßig nicht aktiviert ist. In der Regel handelt es sich hierbei um eine neu vorgeschlagene Funktion, die in diesem Fall jedoch nicht mehr unterstützt wird. Entwickler können sich in der Origin Trial Console registrieren und ein Token erhalten, das in eine Seite eingebettet werden kann. Dadurch wird die Funktion aktiviert, ohne dass der Nutzer ein Flag verwenden muss. Weitere Informationen finden Sie in der verlinkten Anleitung. Der Testzeitraum läuft ungefähr bis Dezember 2019 und läuft bis Chrome 78. Diese Änderung soll sich nicht auf NaCl oder PNaCl in Chrome-Apps oder ‑Erweiterungen auswirken. Mit dem Flag „enable-nacl“ unter chrome://flags kann PNaCl auch lokal für Tests aktiviert werden. Dieses Flag behält auch seine aktuelle Funktion bei, mit der „native“ NaCl ohne PNaCl auf jeder Seite aktiviert wird.

Außerdem haben wir kürzlich angekündigt, dass Chrome-Apps außerhalb von ChromeOS.

Toolchain-Migration

Für die meisten (P)NaCl-Anwendungsfälle empfehlen wir die Umstellung vom NaCl SDK auf Emscripten. Die Migration ist wahrscheinlich relativ einfach. falls Ihre Anwendung zu Linux portierbar ist, verwendet SDL- oder POSIX-APIs. Eine direkte Unterstützung für NaCl-/Pepper-APIs ist nicht verfügbar. Wir haben jedoch versucht, Web API-Äquivalente aufzulisten. Bei schwierigeren Migrationsfällen wenden Sie sich bitte unter native-client-discuss@googlegroups.com an uns.

API-Migration

Hier finden Sie den Status der Webplattform-Ersatzoptionen für jede der APIs, die (P)NaCl verwenden. Außerdem enthält die Tabelle die Bibliothek oder die Option in Emscripten. das den nächsten Ersatz bietet.

Wir gehen davon aus, dass wir WebAssembly 2017 die Unterstützung für Threads mit gemeinsam genutztem Arbeitsspeicher hinzufügen werden, da Threads für die interessantesten Anwendungsfälle von (P)NaCl entscheidend sind. Migrationselemente, die davon ausgehen, dass zukünftige Threads unterstützt werden, sind unten gekennzeichnet. Wenn die Ablaufsteuerung Ihrer Anwendung stark auf blockierende APIs angewiesen ist, ist möglicherweise auch die Unterstützung von Threads für eine einfache Portierung erforderlich.

Wir haben zwar versucht, die Daten in dieser Tabelle möglichst genau gibt es keine Zweifel an Fehlern oder Auslassungen. Wenn Sie Probleme feststellen, wenden Sie sich bitte unter native-client-discuss@googlegroups.com an uns.

PPAPI

PPB_Audio

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen x SDL (teilweise) GAP (teilweise) – ungefährer AudioWorkletNode-Äquivalent Die AudioWorkletSpec ist fertig, aber AudioDeviceClient ist für diese API möglicherweise besser geeignet. Der AudioDeviceClient wird noch von der Community angegeben. Das Worklet ist möglicherweise nicht der ungefähre Equivalent für diese API.
GetCurrentConfig SDL AudioContext.* (gibt übergebene Einstellungen zurück)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetTimestamp SDL AudioBufferSourceNode.start (Parameter) Sie werden jedes Mal übergeben, anstatt an den Puffer angehängt zu werden.
SetTimestamp SDL AudioBufferSourceNode.start (Parameter)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP: WebAudio verwendet nur 32-Bit-Float, PPAPI 16-Bit-Int. PPAPI unterstützt theoretisch mehrere Stichprobengrößen. In der Praxis werden nur 16-Bit-Samples unterstützt. Leider haben Entwickler 16-Bit-Stichprobengrößen angefordert, um Speichernutzung zu sparen. Die nächste Version der Web Audio-Spezifikation wird die Unterstützung für 16-Bit-Samples implementieren. Eine Optimierung für AudioBuffer könnte ähnlich wie bei Firefox implementiert werden, indem ein 16-Bit-Puffer für Audioelemente verwendet wird, die von decodeAudioData stammen.
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
CreateStereo16Bit GAP GAP - Nur 32-Bit-Float-Samples werden unterstützt In der nächsten Version der Web Audio-Spezifikation werden 16-Bit-Samples unterstützt.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (aus dem Standardkonstrukt) Eine AudioContext hat standardmäßig die bevorzugte Abtastrate, die der tatsächlichen Abtastrate des Hardware-Audiogeräts entspricht.
RecommendSampleFrameCount GAP Lücke – wird mit dem geplanten AudioDeviceClient behandelt Beim Zulassen einer benutzerdefinierten Größe gibt es ein offenes Problem, das aber noch definiert wird. Dies lässt sich am besten mit AudioDeviceClient handhaben, da er Ihnen die entsprechende Größe für die jeweilige Hardware mitteilen kann.

PPB_Console

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Log Utime console.log/warn/error/...
LogWithSource GAP GAP Die Console API gilt als ausreichender Ersatz, es sei denn, Entwickler haben bestimmte Anwendungsfälle für die von LogWithSource bereitgestellten Funktionen. Mithilfe von Quellzuordnungen in den Entwicklertools können Sie transpilierten JavaScript-Code in der ursprünglichen Quellsprache debuggen.

PPB_Core

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
getTime Utime new Date().getTime()
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== undefiniert
CallOnMainThread GAP Worker.postMessage + Atomics.wait Eine entsprechende Synchronisierung kann erstellt werden.

PPB_FileIO

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen FV (teilweise) window.chooseFileSystemEntries() „Erstellen“ und „Öffnen“ werden unterschiedlich verwendet, haben aber dieselbe Bedeutung.
Öffnen FS (teilweise) window.chooseFileSystemEntries()
Abfrage FS (teilweise) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified Lücke (teilweise) – Mit „Blob.type“ kann auch der MIME-Typ geprüft werden. Der Dateisystemtyp, die Erstellungszeit und die letzte Zugriffszeit können mit der Native File System API nicht ermittelt werden.
Berührung FV (teilweise) FileSystemDirectoryHandle.getFile("name", {create: true})
Lesen FV (teilweise) Blob.slice().arrayBuffer()
Schreiben FV (teilweise) FileSystemWriter.write()
SetLength FS (teilweise) FileSystemWriter.truncate()
Leeren GAP (teilweise) Lücke (teilweise) – Dateien werden geleert, wenn FileSystemWrite.close() aufgerufen wird Dies ist beabsichtigt, da die Dateien der Native File System API dem Betriebssystem zugänglich gemacht werden. Daher muss eine Safe Browsing-Prüfung durchgeführt werden, bevor dem Betriebssystem Daten angezeigt werden.
Schließen FS (teilweise) FileSystemWriter.close() Bricht ausstehende Vorgänge nicht ab, löscht aber alle bisher auf das Laufwerk geschriebenen Daten.
ReadToArray GAP Blob.slice().arrayBuffer() oder Blob.arrayBuffer() Ermöglicht mehrere Lesevorgänge für Unterbereiche gleichzeitig.

PPB_FileRef

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen FS (teilweise) FileSystemDirectoryHandle.getFile("name", {create: true})
GetFileSystemType FS (teilweise) FileSystem.type
GetName FV (teilweise) File.name
GetPath FS (teilweise) Lücke (teilweise) – Mit der Native File System API kann der relative Pfad einer Datei anhand einer Referenz auf ein Verzeichnis, das die Datei enthält, mit FileSystemHandle.resolve(FileSystemHandle) ermittelt werden. Der absolute Pfad einer Datei kann nicht ermittelt werden und der Nutzer muss die Berechtigung für den Zugriff auf das Verzeichnis mit der Datei erteilen.
GetParent FS (teilweise) GAP (teilweise) - Mit der Native File System API kann der relative Pfad einer Datei mithilfe von FileSystemHandle.resolve(FileSystemHandle) aus einem Verweis auf ein Verzeichnis ermittelt werden, das die Datei enthält. Der Nutzer muss Zugriff auf das Verzeichnis mit der Datei gewähren.
MakeDirectory FS (teilweise) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Berührung FV (teilweise) FileSystemDirectoryHandle.getFile("name", {create: true}) Die Änderungszeit kann durch Schreiben verschoben werden.
Löschen FV (teilweise) FileSystemDirectoryHandle.removeEntry() Im Gegensatz zur PPAPI müssen Verzeichnisse nicht leer sein.
Umbenennen FS (teilweise) GAP (teilweise) - Mit der Native File System API kann die Datei mit dem neuen Namen geschrieben werden, indem eine Kombination aus FileSystemFileHandle.getFile() für den neuen Namen und FileSystemFileHandle.createWriter().write() mit dem Inhalt der alten Datei verwendet wird. Verwenden Sie dann FileSystemDirectoryHandle.removeEntry(), um die alte Datei zu löschen. In der Native File System API gibt es keine direkte API, für die dies in einem Schritt erledigt wird.
Abfrage GAP (teilweise) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (teilweise): Blob.type kann auch zur Überprüfung des MIME-Typs verwendet werden. Der Dateisystemtyp, die Erstellungszeit und die letzte Zugriffszeit können mit der Native File System API nicht ermittelt werden.
ReadDirectoryEntries FV (teilweise) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen FV (teilweise) window.requestFileSystem JS API ermöglicht beides in einem Schritt
Öffnen GAP window.requestFileSystem JS API führt beides in einem Schritt aus
GetType GAP FileSystem.type

PPB_Fullscreen

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Beispiel SDL Gamepad.* Das Gamepad-Objekt stellt einen Zeitstempel in Bezug auf „navigationStart“ bereit. Es wird aktualisiert, wenn Daten von der Hardware empfangen werden: https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL Canvas.getContext('2d')
Beschreiben SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Scrollen GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage Lücke (teilweise) – Kann implementiert werden, indem die Leinwand mit einem Versatz mit drawImage auf sich selbst gezeichnet und dann der Rest ausgefüllt wird.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Leeren GAP Keine direkte Entsprechung GAP (teilweise) - Es gibt immer einen impliziten Leerung am Ende des Zeichencodes. Das ist unwahrscheinlich ändern können. Die Kombination aus OffscreenCanvas und ImageBitmapRenderingContext ähnliche Funktionen.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 Lücke (teilweise) – WebGL 2.0 und die OpenGL ES 3.0-API von Emscripten unterstützen benutzerdefinierte Multisample-Framebuffer, in denen alle über PPAPI konfigurierbaren Parameter festgelegt werden können.
Erstellen 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 Keine direkte Entsprechung Lücke (teilweise) – Am Ende des Zeichencodes erfolgt immer eine implizite Flush-Operation. Das wird sich wahrscheinlich nicht ändern. Die Kombination aus OffscreenCanvas und ImageBitmapRenderingContext ähnliche Funktionen.

PPB_ImageData

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetNativeImageDataFormat SDL ImageData erfordert die RGBA-Reihenfolge
IsImageDataFormatSupported SDL ImageData erfordert die RGBA-Reihenfolge
Erstellen SDL CanvasRenderingContext2d.createImageData
Beschreiben SDL ImageData hat nie einen Schritt.
Karte SDL ImageData.data
Zuordnung aufheben SDL ImageData.data

PPB_InputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
RequestInputEvents SDL Keine direkte Entsprechung Das Fehlen dieser Funktion ist wahrscheinlich weniger relevant, da JS / Wasm im Hauptthread ausgeführt wird und Ereignisse kostengünstiger filtern kann, ohne einen prozessübergreifenden Umlauf zu verursachen.
RequestFilteringInputEvents SDL Maus* Taste* Rad* Touch* Komposition* Ereignisse
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Nachkommen der Ereignisklasse
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL „dblclick“ und „mousedown“
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP - deltaMode enthält diese Informationen, aber unvollständig. Die Implementierung einer WheelEvent.deltaMode API wird unter https://github.com/w3c/uievents/issues/181#issuecomment-537811017 diskutiert.
GetScrollByPage GAP GAP - deltaMode enthält diese Informationen, aber unvollständig. Es gibt eine Diskussion zur Implementierung einer WheelEvent.deltaMode API: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.Einzug (um dies selbst zu ermitteln)

PPB_IMEInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - Kein direktes Äquivalent Diese Daten können potenziell aus CompositionEvent.data abgerufen werden.
GetSegmentOffset GAP GAP - Kein direktes Äquivalent
GetTargetSegment GAP GAP - Kein direktes Äquivalent
GetSelection GAP Lücke – kein direktes Äquivalent

PPB_Instance

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
BindGraphics SDL Canvas.getContext (angegeben, da die Bindung automatisch erfolgt).
IsFullFrame GAP GAP - Kein Äquivalent zu MIME-Typ-Handlern. NaCl-Apps können so registriert werden, dass sie einen bestimmten MIME-Typ verarbeiten und Eigentümer des gesamten Dokuments sind.
DidCreate <Element>[key] Mit allgemeinem DOM-Zugriff können Sie Tag-Attribute abrufen
DidDestroy Nicht für NaCl ausgelöst
DidChangeView Ereignis „Element 'resize'“
DidChangeFocus Element-Ereignisse „focus“, „focusin“ und „focusout“
HandleDocumentLoad GAP - No way to register as a mime type handler NaCl-Module über Apps und ein Manifesteintrag können für bestimmte MIME-Typen eingerichtet werden.

PPB_MediaStreamAudioTrack

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Konfigurieren GAP getUserMedia() Die Einschränkungen von getUserMedia() können die Konfigurationswerte für MediaStreamTrack liefern.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP – kein Äquivalent
RecycleBuffer GAP GAP - Kein Äquivalent
Schließen GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP Leinwandaufnahme Mit Canvas Capture können Videoframes programmatisch eingefügt werden.
Konfigurieren GAP applyConstraints(), getUserMedia() Lücke (teilweise) – Die Anzahl der Konfigurationen, die in der Web API verfügbar sind, kann von der PPAPI abweichen.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP Lücke – kein Äquivalent zu PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES MediaStream kann nicht vorab geladen werden und wird daher nie gepuffert: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP Lücke – kein Äquivalent zu PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP - Kein Äquivalent
RecycleFrame GAP GAP - Kein Äquivalent
Schließen GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP – kein Äquivalent
PutFrame GAP GAP - Kein Äquivalent

PPB_MessageLoop

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen Im Grunde genommen unerheblich, da Worker eine implizite Ereignisschleife erhalten.
GetForMainThread Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.
GetCurrent Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.
AttachToCurrentThread Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.
Ausführen Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.
PostWork Im Grunde genommen unerheblich, da Worker eine implizite Ereignisschleife erhalten.
PostQuit Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.

PPB_Messaging

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
PostMessage Window.postMessage
RegisterMessageHandler window.addEventListener
UnregisterMessageHandler Window.removeEventListener

PPB_MouseCursor

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
SetCursor SDL Element.style.cursor Es werden dieselben Standardcursor unterstützt. Benutzerdefinierte Cursor können mit url(..) erstellt werden. Dynamische benutzerdefinierte Cursor können mit Daten-URIs verwendet werden. CSS3 unterstützt die Angabe des Hotspots.

PPB_MouseLock

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Verschiedene Methoden OpenGLES Funktionalität von WebGL 1.0 ähnlich.
x OffscreenCanvas

PPB_TextInputController

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
SetTextInputType GAP GAP – Potenziell durch die Input Method Editor API ausgefüllt Einige Entwickler möchten entweder auf diese Weise Hinweise geben oder vorzugsweise IME-Ereignisse/-Ausgaben inline in einem Canvas abfangen und anzeigen.
UpdateCaretPosition GAP GAP – Potenziell durch die Input Method Editor API ausgefüllt https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP – Potenziell durch die Input Method Editor API ausgefüllt https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP – Potenziell durch die Input Method Editor API ausgefüllt https://www.w3.org/TR/ime-api/

PPB_URLLoader

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen embind new XMLHttpRequest()
Öffnen embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP - Kein XMLHTTPRequest-Äquivalent
GetUploadProgress embind XMLHttpRequest-Ereignis „progress“
GAP FetchObserver Noch nicht spezifiziert oder implementiert; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind XMLHttpRequest-Ereignis „progress“
GAP FetchObserver Noch nicht spezifiziert oder implementiert; https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Antwort abrufen.*
ReadResponseBody embind XMLHttpRequest.response
embind Text.* (Antwort ist ein Text)
FinishStreamingToFile embind GAP - Kein direktes Äquivalent XMLHttpRequest und Fetch gehen davon aus, dass das Streaming in den Arbeitsspeicher und nicht direkt in einen Speicher erfolgt.
Schließen embind XMLHttpRequest.abort
GAP Fetch API: AbortSignal und AbortController

PPB_URLRequestInfo

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen embind XMLHttpRequest
embind Abrufanfrage
SetProperty GAP GAP - Kein direktes Äquivalent für XMLHttpRequest XMLHttpRequest bietet keine direkten Möglichkeiten, um Begrenzungen auf Anfragen basierend auf Weiterleitungen zu beschränken, in eine Datei zu streamen oder eine Verweis-URL oder Richtlinie für Anmeldedaten festzulegen.
embind Anfrage.*
AppendDataToBody embind XMLHttpRequest.send GAP - Beide müssen den ganzen Körper haben, nicht nur einen Teil.
embind fetch(.., options:body)
AppendFileToBody GAP fetch()-Upload-Streaming https://www.chromestatus.com/features/5274139738767360
<form> Sie können auch mit FileReader lesen und hochladen, aber das entspricht eher AppendDataToBody

PPB_URLResponseInfo

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetProperty embind XMLHttpRequest.getAllResponseHeaders und andere
embind Antwort abrufen.*
GetBodyAsFileRef embind Fetch Response (Body) .blob() Es wird davon ausgegangen, dass die Speicherschicht die Übertragung optimiert.

PPB_Var

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource
VarToResource

PPB_VarArray

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Get embind Matrix[i]
Fertig embind Array[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen embind new ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Karte GAP GAP - Kein direktes Äquivalent Asm.js-/Wasm-Module können Regionen eines ArrayBuffers nur ihrem einzelnen linearen Speicher-Heap zuordnen. Die zukünftige Zuordnung mehrerer Erinnerungen oder die Zuordnung von Arbeitsspeicherdaten könnten dies verbessern.
Zuordnung aufheben GAP GAP - Kein direktes Äquivalent

PPB_VarDictionary

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen embind {}
Get embind <Object>[i]
Fertig embind <Objekt>[i] = x
Löschen embind <Object>[i] löschen
HasKey embind x in <Object>
GetKeys embind für (k in <Object>) {} Keine wörtliche Entsprechung, kann aber erstellt werden.

PPB_VideoDecoder

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP Lücke – wird mit der vorgeschlagenen WebCodecs API mit VideoDecoder() verarbeitet https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Initialisieren GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mithilfe der Initialisierungsparameter von VideoDecoder() (VideoDecoderInitParameters) verarbeitet. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Decode GAP GAP – Wird mit der vorgeschlagenen WebCodecs API unter Verwendung von ReadableStream.pipeThrough(VideoDecoder) verarbeitet. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
GetPicture GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mit ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable) verarbeitet https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
RecyclePicture GAP Lücke – wird mit der vorgeschlagenen WebCodecs API behandelt. Beim aktuellen Design werden die Bilder automatisch recycelt und die Decodierung wird fortgesetzt. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Leeren GAP Lücke – wird mit der vorgeschlagenen WebCodecs API behandelt. Die API wird als Flush() aufgerufen. Es wird jedoch noch diskutiert, wie sie in Bezug auf Dekodierungsaufrufe sequenziert wird. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Zurücksetzen GAP GAP: Wird mit dem vorgeschlagenen WebCodecs-API verarbeitet, indem die VideoDecoder-Instanz zerstört und eine neue erstellt wird. Das ist nicht so effizient wie eine spezielle Zurücksetzungsmethode, aber die Semantik für eine Reset() API wird noch diskutiert. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mit VideoEncoder() verarbeitet
GetSupportedProfiles GAP GAP (teilweise) – navigator.mediaCapabilities.encodingInfo() Die unterstützten Profile müssen einzeln aktiviert werden.
Initialisieren GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mit den Initialisierungsparametern von VideoEncoder() verarbeitet
GetFramesRequired GAP GAP – kein Äquivalent Es ist unwahrscheinlich, dass der von der Web Codecs API intern verwendete Frame-Pool freigegeben wird.
GetFrameCodedSize GAP GAP – kein Äquivalent Es ist unwahrscheinlich, dass der Frame-Pool, der intern von der Web Codecs API verwendet wird, freigegeben wird.
GetVideoFrame GAP GAP: Wird mit dem vorgeschlagenen WebCodecs-API über ReadableStream.pipeThrough(VideoEncoder) verarbeitet. Dadurch werden die Daten direkt im lesbaren Stream codiert, anstatt vor der Codierung einen einzelnen Frame zu erfassen, der mit Daten gefüllt wird.
Codieren GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mit ReadableStream.pipeThrough(VideoEncoder) verarbeitet
GetBitstreamBuffer GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt. Das aktuelle Design durchläuft automatisch den codierten Bitstream-Zwischenspeicher, durch den geleitet wird. Das WebCodecs-API geht derzeit davon aus, dass der Bitstream-Zwischenspeicher kopiert und nicht in einem Pool zusammengefasst werden kann. Daher muss er nicht wiederverwendet werden.
RecycleBitstreamBuffer GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt. Beim aktuellen Design wird der Puffer automatisch wiederverwendet, um den Codierungsprozess fortzusetzen. Da die Auswirkungen auf die Leistung kleiner sind, wird sich das in Zukunft voraussichtlich nicht ändern.
RequestEncodingParametersChange GAP GAP – Wird von der vorgeschlagenen Web Codecs API verarbeitet. Bestimmte Parameter können spontan geändert werden, bei anderen muss der Encoder deaktiviert werden.
Schließen GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API über VideoEncoder.Close() verarbeitet

PPB_VideoFrame

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetTimestamp GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API verarbeitet.
SetTimestamp GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt.
GetFormat GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API verarbeitet.
GetSize GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt.
GetDataBuffer GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt.
GetDataBufferSize GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt.

PPB_View

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Bezieht sich auf das Dokument und nicht nur auf ein einzelnes Element.
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-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP WebSocket.WebSocket
Verbinden GAP WebSocket.WebSocket(URL, ...) WebSocket "offen" Ereignis
Schließen GAP WebSocket.close
ReceiveMessage GAP WebSocket-Ereignis „message“ WebSocket-Ereignis „error“ WebSocket-Ereignis „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-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Graphics3DContextLost SDL Canvas-Ereignis „webglcontextlost“

PPP_InputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
HandleInputEvent SDL Element.addEventListener

PPP_Instance

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
DidCreate &lt;Element&gt;[key] Mit allgemeinem DOM-Zugriff können Sie Tag-Attribute abrufen
DidDestroy Nicht für NaCl ausgelöst
DidChangeView Ereignis „Element 'resize'“
DidChangeFocus Element-Ereignisse „focus“, „focusin“ und „focusout“
HandleDocumentLoad GAP - Keine Möglichkeit zur Registrierung als MIME-Typ-Handler NaCl-Module können über Apps und einen Manifesteintrag so eingerichtet werden, dass sie bestimmte MIME-Typen verarbeiten.

PPP_MessageHandler

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
HandleMessage embind MessagePort-Ereignis „message“ Window-Ereignis „message“
HandleBlockingMessage GAP - Kein direktes Äquivalent Eine ähnliche Synchronisierung kann mit Atomics.wait außerhalb des Hauptthreads erfolgen. Dies wurde hinzugefügt, um die Emulation synchroner Plug-in-APIs zu unterstützen.

PPP_Messaging

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
HandleMessage embind MessagePort „message“ Ereignis Fenster "Nachricht" Ereignis

PPP_MouseLock

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
MouseLockLost SDL Element „pointerlockchange“, „pointerlockerror“ Veranstaltungen

IRT

PPB_Audio

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen x SDL (teilweise) GAP (teilweise) – ungefährer AudioWorkletNode-Äquivalent Die AudioWorkletSpec ist fertig, aber AudioDeviceClient ist für diese API möglicherweise besser geeignet. Der AudioDeviceClient wird noch von der Community angegeben. Das Worklet ist möglicherweise nicht der ungefähre Equivalent für diese API.
GetCurrentConfig SDL AudioContext.* (gibt übergebene Einstellungen zurück)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetTimestamp SDL AudioBufferSourceNode.start (Parameter) Sie werden jedes Mal übergeben, anstatt an den Puffer angehängt zu werden.
SetTimestamp SDL AudioBufferSourceNode.start (Parameter)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP: WebAudio verwendet nur 32-Bit-Float, PPAPI 16-Bit-Int. PPAPI unterstützt theoretisch mehrere Stichprobengrößen. In der Praxis werden nur 16-Bit-Samples unterstützt. Leider haben Entwickler 16-Bit-Stichprobengrößen angefordert, um Speichernutzung zu sparen. Die nächste Version der Web Audio-Spezifikation wird die Unterstützung für 16-Bit-Samples implementieren. Eine Optimierung für AudioBuffer könnte ähnlich wie bei Firefox implementiert werden, indem ein 16-Bit-Puffer für Audioelemente verwendet wird, die von decodeAudioData stammen.
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
CreateStereo16Bit GAP GAP - Nur 32-Bit-Float-Samples werden unterstützt In der nächsten Version der Web Audio-Spezifikation werden 16-Bit-Samples unterstützt.
GetSampleRate SDL AudioContext.sampleRate
GetSampleFrameCount SDL AudioBuffer.length
RecommendSampleRate SDL AudioContext.sampleRate (aus dem Standardkonstrukt) Eine AudioContext hat standardmäßig die bevorzugte Abtastrate, die der tatsächlichen Abtastrate des Hardware-Audiogeräts entspricht.
RecommendSampleFrameCount GAP Lücke – wird mit dem geplanten AudioDeviceClient behandelt Beim Zulassen einer benutzerdefinierten Größe gibt es ein offenes Problem, das aber noch definiert wird. Dies lässt sich am besten mit AudioDeviceClient handhaben, da er Ihnen die entsprechende Größe für die jeweilige Hardware mitteilen kann.

PPB_Console

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Log Utime console.log/warn/error/...
LogWithSource GAP GAP Die Console API gilt als ausreichender Ersatz, es sei denn, Entwickler haben bestimmte Anwendungsfälle für die von LogWithSource bereitgestellten Funktionen. Mithilfe von Quellzuordnungen in den Entwicklertools können Sie transpilierten JavaScript-Code in der ursprünglichen Quellsprache debuggen.

PPB_Core

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
getTime Utime new Date().getTime()
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== undefiniert
CallOnMainThread GAP Worker.postMessage + Atomics.wait Eine entsprechende Synchronisierung kann erstellt werden.

PPB_FileIO

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen FV (teilweise) window.chooseFileSystemEntries() „Erstellen“ und „Öffnen“ werden unterschiedlich verwendet, haben aber dieselbe Bedeutung.
Öffnen FS (teilweise) window.chooseFileSystemEntries()
Abfrage FS (teilweise) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified Lücke (teilweise) – Mit „Blob.type“ kann auch der MIME-Typ geprüft werden. Der Dateisystemtyp, die Erstellungszeit und die letzte Zugriffszeit können mit der Native File System API nicht ermittelt werden.
Berührung FV (teilweise) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true})
Lesen FV (teilweise) Blob.slice().arrayBuffer()
Schreiben FV (teilweise) FileSystemWriter.write()
SetLength FS (teilweise) FileSystemWriter.truncate()
Leeren GAP (teilweise) Lücke (teilweise) – Dateien werden geleert, wenn FileSystemWrite.close() aufgerufen wird Dies ist beabsichtigt, da die Dateien der Native File System API dem Betriebssystem zugänglich gemacht werden. Daher muss eine Safe Browsing-Prüfung durchgeführt werden, bevor dem Betriebssystem Daten angezeigt werden.
Schließen FS (teilweise) FileSystemWriter.close() Bricht ausstehende Vorgänge nicht ab, löscht aber alle bisher auf das Laufwerk geschriebenen Daten.
ReadToArray GAP Blob.slice().arrayBuffer() oder Blob.arrayBuffer() Ermöglicht mehrere Lesevorgänge für Unterbereiche gleichzeitig.

PPB_FileRef

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen FS (teilweise) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true})
GetFileSystemType FS (teilweise) FileSystem.type
GetName FV (teilweise) File.name
GetPath FS (teilweise) Lücke (teilweise) – Mit der Native File System API kann der relative Pfad einer Datei anhand einer Referenz auf ein Verzeichnis, das die Datei enthält, mit FileSystemHandle.resolve(FileSystemHandle) ermittelt werden. Der absolute Pfad einer Datei kann nicht ermittelt werden und der Nutzer muss die Berechtigung für den Zugriff auf das Verzeichnis mit der Datei erteilen.
GetParent FS (teilweise) GAP (teilweise) - Mit der Native File System API kann der relative Pfad einer Datei mithilfe von FileSystemHandle.resolve(FileSystemHandle) aus einem Verweis auf ein Verzeichnis ermittelt werden, das die Datei enthält. Der Nutzer muss Zugriff auf das Verzeichnis mit der Datei gewähren.
MakeDirectory FS (teilweise) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
Berührung FV (teilweise) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true}) Die Änderungszeit kann durch Schreiben verschoben werden.
Löschen FV (teilweise) FileSystemDirectoryHandle.removeEntry() Im Gegensatz zur PPAPI müssen Verzeichnisse nicht leer sein.
Umbenennen FS (teilweise) GAP (teilweise) - Mit der Native File System API kann die Datei mit dem neuen Namen geschrieben werden, indem eine Kombination aus FileSystemFileHandle.getFile() für den neuen Namen und FileSystemFileHandle.createWriter().write() mit dem Inhalt der alten Datei verwendet wird. Verwenden Sie dann FileSystemDirectoryHandle.removeEntry(), um die alte Datei zu löschen. In der Native File System API gibt es keine direkte API, für die dies in einem Schritt erledigt wird.
Abfrage GAP (teilweise) Blob.size, FileSystemHandle.getFile(), FileSystemHandle.getDirectory(), File.lastModified GAP (teilweise): Blob.type kann auch zur Überprüfung des MIME-Typs verwendet werden. Der Dateisystemtyp, die Erstellungszeit und die letzte Zugriffszeit können mit der Native File System API nicht ermittelt werden.
ReadDirectoryEntries FV (teilweise) FileSystemDirectoryHandle.getEntries()

PPB_FileSystem

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen FV (teilweise) window.requestFileSystem JS API ermöglicht beides in einem Schritt
Öffnen GAP window.requestFileSystem JS API führt beides in einem Schritt aus
GetType GAP FileSystem.type

PPB_Fullscreen

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
IsFullScreen html5.h Document.fullscreenEnabled
SetFullscreen html5.h Document.requestFullscreen
GetScreenSize html5.h Document.exitFullscreen

PPB_Gamepad

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Beispiel SDL Gamepad.* Das Gamepad-Objekt stellt einen Zeitstempel in Bezug auf „navigationStart“ bereit. Es wird aktualisiert, wenn Daten von der Hardware empfangen werden: https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL Canvas.getContext('2d')
Beschreiben SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
Scrollen GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage Lücke (teilweise) – Kann implementiert werden, indem die Leinwand mit einem Versatz mit drawImage auf sich selbst gezeichnet und dann der Rest ausgefüllt wird.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
Leeren GAP Keine direkte Entsprechung GAP (teilweise) - Es gibt immer einen impliziten Leerung am Ende des Zeichencodes. Das ist unwahrscheinlich ändern können. Die Kombination aus OffscreenCanvas und ImageBitmapRenderingContext ähnliche Funktionen.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 Lücke (teilweise) – WebGL 2.0 und die OpenGL ES 3.0-API von Emscripten unterstützen benutzerdefinierte Multisample-Framebuffer, in denen alle über PPAPI konfigurierbaren Parameter festgelegt werden können.
Erstellen 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 Keine direkte Entsprechung GAP (teilweise) - Es gibt immer einen impliziten Leerung am Ende des Zeichencodes. Das ist unwahrscheinlich ändern können. Die Kombination aus OffscreenCanvas und ImageBitmapRenderingContext bietet jedoch ähnliche Funktionen.

PPB_ImageData

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetNativeImageDataFormat SDL ImageData erfordert die RGBA-Reihenfolge
IsImageDataFormatSupported SDL ImageData erfordert die RGBA-Reihenfolge
Erstellen SDL CanvasRenderingContext2d.createImageData
Beschreiben SDL ImageData hat nie einen Schritt.
Karte SDL ImageData.data
Zuordnung aufheben SDL ImageData.data

PPB_InputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
RequestInputEvents SDL Keine direkte Entsprechung Das Fehlen dieser Funktion ist wahrscheinlich weniger relevant, da JS / Wasm im Hauptthread ausgeführt wird und Ereignisse kostengünstiger filtern kann, ohne einen prozessübergreifenden Umlauf zu verursachen.
RequestFilteringInputEvents SDL Maus* Taste* Rad* Touch* Komposition* Ereignisse
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL Nachkommen der Ereignisklasse
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL „dblclick“ und „mousedown“
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP - deltaMode enthält diese Informationen, aber unvollständig. Die Implementierung einer WheelEvent.deltaMode API wird unter https://github.com/w3c/uievents/issues/181#issuecomment-537811017 diskutiert.
GetScrollByPage GAP GAP - deltaMode enthält diese Informationen, aber unvollständig. Es gibt eine Diskussion zur Implementierung einer WheelEvent.deltaMode API: https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.Einzug (um dies selbst zu ermitteln)

PPB_IMEInputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - Kein direktes Äquivalent Diese Daten können potenziell aus CompositionEvent.data abgerufen werden.
GetSegmentOffset GAP GAP - Kein direktes Äquivalent
GetTargetSegment GAP GAP - Kein direktes Äquivalent
GetSelection GAP Lücke – kein direktes Äquivalent

PPB_Instance

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
BindGraphics SDL Canvas.getContext (angegeben, da die Bindung automatisch erfolgt).
IsFullFrame GAP GAP - Kein Äquivalent zu MIME-Typ-Handlern. NaCl-Apps können so registriert werden, dass sie einen bestimmten MIME-Typ verarbeiten und Eigentümer des gesamten Dokuments sind.
DidCreate &lt;Element&gt;[key] Mit allgemeinem DOM-Zugriff können Sie Tag-Attribute abrufen
DidDestroy Nicht für NaCl ausgelöst
DidChangeView Ereignis „Element 'resize'“
DidChangeFocus Element-Ereignisse „focus“, „focusin“ und „focusout“
HandleDocumentLoad GAP - No way to register as a mime type handler NaCl-Module über Apps und ein Manifesteintrag können für bestimmte MIME-Typen eingerichtet werden.

PPB_MediaStreamAudioTrack

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Konfigurieren GAP getUserMedia() Die Einschränkungen von getUserMedia() können die Konfigurationswerte für MediaStreamTrack liefern.
GetAttrib GAP MediaStreamTrack.getSettings()
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetBuffer GAP GAP – kein Äquivalent
RecycleBuffer GAP GAP - Kein Äquivalent
Schließen GAP MediaStreamTrack.stop()

PPB_MediaStreamVideoTrack

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP Leinwandaufnahme Mit Canvas Capture können Videoframes programmatisch eingefügt werden.
Konfigurieren GAP applyConstraints(), getUserMedia() Lücke (teilweise) – Die Anzahl der Konfigurationen, die in der Web API verfügbar sind, kann von der PPAPI abweichen.
GetAttrib GAP MediaStreamSettings.width
GAP MediaStreamSettings.height
GAP Lücke – kein Äquivalent zu PP_MEDIASTREAMVIDEOTRACK_ATTRIB_BUFFERED_FRAMES MediaStream kann nicht vorab geladen werden und wird daher nie gepuffert: https://www.w3.org/TR/mediacapture-streams/#mediastreams-in-media-elements
GAP Lücke – kein Äquivalent zu PP_MEDIASTREAMVIDEOTRACK_ATTRIB_FORMAT
GetId GAP MediaStreamTrack.id
HasEnded GAP MediaStreamTrack.readyState
GetFrame GAP GAP - Kein Äquivalent
RecycleFrame GAP GAP - Kein Äquivalent
Schließen GAP MediaStreamTrack.stop()
GetEmptyFrame GAP GAP – kein Äquivalent
PutFrame GAP GAP - Kein Äquivalent

PPB_MessageLoop

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen Im Grunde genommen unerheblich, da Worker eine implizite Ereignisschleife erhalten.
GetForMainThread Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.
GetCurrent Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.
AttachToCurrentThread Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.
Ausführen Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.
PostWork Im Grunde genommen unerheblich, da Worker eine implizite Ereignisschleife erhalten.
PostQuit Überwiegend irrelevant. Worker erhalten eine implizite Ereignisschleife.

PPB_Messaging

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
PostMessage Window.postMessage
RegisterMessageHandler window.addEventListener
UnregisterMessageHandler Window.removeEventListener

PPB_MouseCursor

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
SetCursor SDL Element.style.cursor Es werden dieselben Standardcursor unterstützt. Benutzerdefinierte Cursor können mit url(..) erstellt werden. Dynamische benutzerdefinierte Cursor können mit Daten-URIs verwendet werden. CSS3 unterstützt die Angabe des Hotspots.

PPB_MouseLock

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Verschiedene Methoden OpenGLES Funktionalität von WebGL 1.0 ähnlich.
x OffscreenCanvas

PPB_TextInputController

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
SetTextInputType GAP GAP – Potenziell durch die Input Method Editor API ausgefüllt Einige Entwickler möchten entweder auf diese Weise Hinweise geben oder vorzugsweise IME-Ereignisse/-Ausgaben inline in einem Canvas abfangen und anzeigen.
UpdateCaretPosition GAP GAP – Potenziell durch die Input Method Editor API ausgefüllt https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP – Potenziell durch die Input Method Editor API ausgefüllt https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP – Potenziell durch die Input Method Editor API ausgefüllt https://www.w3.org/TR/ime-api/

PPB_URLLoader

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen embind new XMLHttpRequest()
Öffnen embind XMLHttpRequest.open
FollowRedirect embind Request.redirect
GAP GAP - Kein XMLHTTPRequest-Äquivalent
GetUploadProgress embind XMLHttpRequest-Ereignis „progress“
GAP FetchObserver Noch nicht spezifiziert oder implementiert; https://github.com/whatwg/fetch/issues/607
GetDownloadProgress embind XMLHttpRequest-Ereignis „progress“
GAP FetchObserver Noch nicht spezifiziert oder implementiert; https://github.com/whatwg/fetch/issues/607
GetResponseInfo embind XMLHttpRequest.getAllResponseHeaders
embind Antwort abrufen.*
ReadResponseBody embind XMLHttpRequest.response
embind Text.* (Antwort ist ein Text)
FinishStreamingToFile embind GAP - Kein direktes Äquivalent XMLHttpRequest und Fetch gehen davon aus, dass das Streaming in den Arbeitsspeicher und nicht direkt in einen Speicher erfolgt.
Schließen embind XMLHttpRequest.abort
GAP Fetch API: AbortSignal und AbortController

PPB_URLRequestInfo

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen embind XMLHttpRequest
embind Abrufanfrage
SetProperty GAP GAP - Kein direktes Äquivalent für XMLHttpRequest XMLHttpRequest bietet keine direkten Möglichkeiten, um Begrenzungen auf Anfragen basierend auf Weiterleitungen zu beschränken, in eine Datei zu streamen oder eine Verweis-URL oder Richtlinie für Anmeldedaten festzulegen.
embind Anfrage.*
AppendDataToBody embind XMLHttpRequest.send GAP - Beide müssen den ganzen Körper haben, nicht nur einen Teil.
embind fetch(.., options:body)
AppendFileToBody GAP fetch()-Upload-Streaming https://www.chromestatus.com/features/5274139738767360
&lt;form&gt; Sie können auch mit FileReader lesen und hochladen, aber das entspricht eher AppendDataToBody

PPB_URLResponseInfo

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetProperty embind XMLHttpRequest.getAllResponseHeaders und andere
embind Antwort abrufen.*
GetBodyAsFileRef embind Fetch Response (Body) .blob() Es wird davon ausgegangen, dass die Speicherschicht die Übertragung optimiert.

PPB_Var

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource
VarToResource

PPB_VarArray

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Get embind Matrix[i]
Fertig embind Array[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen embind new ArrayBuffer(n)
ByteLength embind ArrayBuffer.byteLength
Karte GAP GAP - Kein direktes Äquivalent Asm.js-/Wasm-Module können Regionen eines ArrayBuffers nur ihrem einzelnen linearen Speicher-Heap zuordnen. Die zukünftige Zuordnung mehrerer Erinnerungen oder die Zuordnung von Arbeitsspeicherdaten könnten dies verbessern.
Zuordnung aufheben GAP GAP - Kein direktes Äquivalent

PPB_VarDictionary

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen embind {}
Get embind &lt;Object&gt;[i]
Fertig embind <Objekt>[i] = x
Löschen embind <Object>[i] löschen
HasKey embind x in <Object>
GetKeys embind für (k in <Object>) {} Keine wörtliche Entsprechung, kann aber erstellt werden.

PPB_VideoDecoder

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP Lücke – wird mit der vorgeschlagenen WebCodecs API mit VideoDecoder() verarbeitet https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Initialisieren GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mithilfe der Initialisierungsparameter von VideoDecoder() (VideoDecoderInitParameters) verarbeitet. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Decode GAP GAP – Wird mit der vorgeschlagenen WebCodecs API unter Verwendung von ReadableStream.pipeThrough(VideoDecoder) verarbeitet. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
GetPicture GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mit ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable) verarbeitet https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
RecyclePicture GAP Lücke – wird mit der vorgeschlagenen WebCodecs API behandelt. Beim aktuellen Design werden die Bilder automatisch recycelt und die Decodierung wird fortgesetzt. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Leeren GAP Lücke – wird mit der vorgeschlagenen WebCodecs API behandelt. Die API wird als Flush() aufgerufen. Es wird jedoch noch diskutiert, wie sie in Bezug auf Dekodierungsaufrufe sequenziert wird. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming
Zurücksetzen GAP GAP: Wird mit dem vorgeschlagenen WebCodecs-API verarbeitet, indem die VideoDecoder-Instanz zerstört und eine neue erstellt wird. Das ist nicht so effizient wie eine spezielle Zurücksetzungsmethode, aber die Semantik für eine Reset() API wird noch diskutiert. https://github.com/WICG/web-codecs/blob/master/explainer.md#example-of-decode-for-low-latency-live-streaming-or-cloud-gaming

PPB_VideoEncoder

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mit VideoEncoder() verarbeitet
GetSupportedProfiles GAP GAP (teilweise) – navigator.mediaCapabilities.encodingInfo() Die unterstützten Profile müssen einzeln aktiviert werden.
Initialisieren GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mit den Initialisierungsparametern von VideoEncoder() verarbeitet
GetFramesRequired GAP GAP – kein Äquivalent Es ist unwahrscheinlich, dass der von der Web Codecs API intern verwendete Frame-Pool freigegeben wird.
GetFrameCodedSize GAP GAP – kein Äquivalent Es ist unwahrscheinlich, dass der Frame-Pool, der intern von der Web Codecs API verwendet wird, freigegeben wird.
GetVideoFrame GAP GAP: Wird mit dem vorgeschlagenen WebCodecs-API über ReadableStream.pipeThrough(VideoEncoder) verarbeitet. Dadurch werden die Daten direkt im lesbaren Stream codiert, anstatt vor der Codierung einen einzelnen Frame zu erfassen, der mit Daten gefüllt wird.
Codieren GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API mit ReadableStream.pipeThrough(VideoEncoder) verarbeitet
GetBitstreamBuffer GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt. Das aktuelle Design durchläuft automatisch den codierten Bitstream-Zwischenspeicher, durch den geleitet wird. Das WebCodecs-API geht derzeit davon aus, dass der Bitstream-Zwischenspeicher kopiert und nicht in einem Pool zusammengefasst werden kann. Daher muss er nicht wiederverwendet werden.
RecycleBitstreamBuffer GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt. Beim aktuellen Design wird der Puffer automatisch wiederverwendet, um den Codierungsprozess fortzusetzen. Da die Auswirkungen auf die Leistung kleiner sind, wird sich das in Zukunft voraussichtlich nicht ändern.
RequestEncodingParametersChange GAP GAP – Wird von der vorgeschlagenen Web Codecs API verarbeitet. Bestimmte Parameter können spontan geändert werden, bei anderen muss der Encoder deaktiviert werden.
Schließen GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API über VideoEncoder.Close() verarbeitet

PPB_VideoFrame

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetTimestamp GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API verarbeitet.
SetTimestamp GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt.
GetFormat GAP Lücke – Wird mit der vorgeschlagenen WebCodecs API verarbeitet.
GetSize GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt.
GetDataBuffer GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt.
GetDataBufferSize GAP GAP – Wird mit dem vorgeschlagenen WebCodecs-API gehandhabt.

PPB_View

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetRect embind Element.getBoundingClientRect
IsFullscreen embind Document.fullScreenEnabled Bezieht sich auf das Dokument und nicht nur auf ein einzelnes Element.
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-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen GAP WebSocket.WebSocket
Verbinden GAP WebSocket.WebSocket(URL, ...) WebSocket "offen" Ereignis
Schließen GAP WebSocket.close
ReceiveMessage GAP WebSocket-Ereignis „message“ WebSocket-Ereignis „error“ WebSocket-Ereignis „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-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Graphics3DContextLost SDL Canvas-Ereignis „webglcontextlost“

PPP_InputEvent

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
HandleInputEvent SDL Element.addEventListener

PPP_Instance

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
DidCreate &lt;Element&gt;[key] Mit allgemeinem DOM-Zugriff können Sie Tag-Attribute abrufen
DidDestroy Nicht für NaCl ausgelöst
DidChangeView Ereignis „Element 'resize'“
DidChangeFocus Element-Ereignisse „focus“, „focusin“ und „focusout“
HandleDocumentLoad GAP - Keine Möglichkeit zur Registrierung als MIME-Typ-Handler NaCl-Module können über Apps und einen Manifesteintrag so eingerichtet werden, dass sie bestimmte MIME-Typen verarbeiten.

PPP_MessageHandler

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
HandleMessage embind MessagePort-Ereignis „message“ Window-Ereignis „message“
HandleBlockingMessage GAP - Kein direktes Äquivalent Eine ähnliche Synchronisierung kann mit Atomics.wait außerhalb des Hauptthreads erfolgen. Dies wurde hinzugefügt, um die Emulation synchroner Plug-in-APIs zu unterstützen.

PPP_Messaging

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
HandleMessage embind MessagePort „message“ Ereignis Fenster "Nachricht" Ereignis

PPP_MouseLock

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
MouseLockLost SDL Element „pointerlockchange“, „pointerlockerror“ Veranstaltungen

PPAPI (Apps)

PPB_HostResolver

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen x GAP GAP (teilweise) - kein direktes Äquivalent
Klären x GAP Lücke (teilweise) – keine direkte Entsprechung
GetCanonicalName x GAP GAP (teilweise) - kein direktes Äquivalent
GetNetAddressCount x GAP Lücke (teilweise) – keine direkte Entsprechung
GetNetAddress x GAP GAP (teilweise) - kein direktes Äquivalent

PPB_NetAddress

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
CreateFromIPv4Address x GAP GAP (teilweise) - kein direktes Äquivalent
CreateFromIPv6Address x GAP GAP (teilweise) - kein direktes Äquivalent
GetFamily x GAP Lücke (teilweise) – keine direkte Entsprechung
DescribeAsString x GAP GAP (teilweise) - kein direktes Äquivalent
DescribeAsIPv4Address x GAP Lücke (teilweise) – keine direkte Entsprechung
DescribeAsIPv6Address x GAP Lücke (teilweise) – keine direkte Entsprechung

PPB_NetworkList

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetCount x GAP GAP - Kein direktes Äquivalent
GetName x GAP GAP - Kein direktes Äquivalent
GetType x GAP Lücke – keine direkte Entsprechung
GetState x GAP Lücke – keine direkte Entsprechung
GetIpAddress x GAP Lücke – keine direkte Entsprechung
GetDisplayName x GAP Lücke – kein direktes Äquivalent
GetMTU x GAP GAP - Kein direktes Äquivalent

PPB_NetworkMonitor

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
Erstellen x GAP GAP - Kein direktes Äquivalent
UpdateNetworkList x GAP Lücke – kein direktes Äquivalent

PPB_NetworkProxy

PPAPI-Methode Geht von Threads aus Emscripten Web API Beschränkungen
GetProxyForURL x GAP Lücke – keine direkte Entsprechung

PPB_TCPSocket und PPB_UDPSocket

Es gibt keine direkte 1:1-Zuordnung für die Migration. Stattdessen haben wir unten einige Nutzerszenarien und den empfohlenen Migrationspfad beschrieben.

Anwendungsfall Empfehlungen
Bildschirmfreigabe getDisplayMedia und WebRTC ( Demo)
Wird aus einem lokaler Server, um die Bandbreitennutzung zu minimieren XHR, Fetch, Streams, Service Worker, Cache APIs
Wird aus einem Lokale Instanz einer Webanwendung / Herstellen einer Verbindung zu einer lokalen Instanz einer Webanwendung WebRTC
Chat WebSocket*
Echtzeit-Audio-/Videokommunikation WebRTC
Zusammenarbeit WebSocket*
Echtzeit Multiplayer-Spiele WebTransport** es sei denn, P2P ist in diesem Fall WebRTC (oder WebTransport über RTCIceTransport)
Interaktives Streaming in Echtzeit WebTransport**
Kommunikation mit altem Server Proxyserver oder Middleware zur Protokollkonvertierung Feedback zu bit.ly/network-api-gaps

*: Oder WebTransport in Zukunft

**: Verfügbarkeit nach chromestatus ansehen