WebAssembly 이전 가이드

(P)NaCl 지원 중단 공지사항

크로스 브라우저 WebAssembly 지원의 가속도를 감안하여 앞으로는 WebAssembly에 네이티브 코드 작업을 집중하고 2019년 4분기에 PNaCl 지원을 중단할 계획입니다(Chrome 앱 제외). Google은 역동적인 WebAssembly 생태계 신규 및 기존의 고성능 기기에 더 적합 PNaCl 사용량이 지원 중단을 당할 만큼 충분히 적지 않다는 사실을 확인합니다.

Chrome 76부터 공개 웹의 PNaCl은 웹 개발자가 기본적으로 사용 설정되지 않은 기능을 등록하고 액세스할 수 있는 메커니즘인 오리진 트라이얼 뒤로 이동했습니다. 일반적으로 새로 제안된 기능이지만 이 경우에는 지원 중단되는 기능입니다. 개발자는 오리진 트라이얼 콘솔에 등록할 수 있습니다. 페이지에 삽입할 수 있는 토큰을 받고 사용자가 플래그를 사용할 필요 없이 기능을 사용하도록 설정합니다. (자세한 내용은 링크된 가이드를 참고하세요.) 무료 체험은 Chrome 78까지, 즉 2019년 12월까지 진행될 예정입니다. 이 변경사항은 Chrome 앱 또는 확장 프로그램의 NaCl 또는 PNaCl에 영향을 미치지 않으며, chrome://flags의 'enable-nacl' 플래그를 사용하여 테스트를 위해 로컬에서 PNaCl을 사용 설정할 수도 있습니다(이 플래그는 모든 페이지에서 PNaCl이 아닌 '네이티브' NaCl을 사용 설정하는 현재 기능도 유지함).

또한 최근 ChromeOS 외부의 Chrome 앱이 2018년 1분기에 지원 중단된다고 발표했습니다.

툴체인 이전

대부분의 (P)NaCl 사용 사례에서는 NaCl SDK에서 Emscripten으로 변경합니다. 애플리케이션이 Linux로 이식 가능하거나 SDL 또는 POSIX API를 사용하는 경우 이전이 비교적 간단합니다. NaCl/Pepper API를 직접 지원할 수는 없지만 웹 API 등가 항목을 나열해 보았습니다. 더 어려운 포팅 사례의 경우 native-client-discuss@googlegroups.com으로 문의하세요.

API 이전

다음은 (P)NaCl에 노출된 각 API의 웹 플랫폼 대체 API의 상태를 요약한 것입니다. 또한 이 표에는 가장 가까운 대체 항목을 제공하는 Emscripten의 라이브러리 또는 옵션이 나와 있습니다.

2017년에 WebAssembly에 공유 메모리 스레드 지원을 추가할 것으로 예상합니다. 스레드가 (P)NaCl의 가장 흥미로운 용도를 매칭하는 데 매우 중요하기 때문에 있습니다. 향후 스레드 지원을 가정하는 이전 항목은 아래에 표시되어 있습니다. 애플리케이션의 흐름 제어가 차단 API에 크게 의존하는 경우 편리한 포팅을 위해 스레드 지원이 필요할 수도 있습니다.

이 표에서 정확한 데이터를 얻기 위해 노력했으나 명백한 오류나 누락이 없습니다 이러한 문제가 발생하면 native-client-discuss@googlegroups.com

PPAPI

PPB_Audio

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 x SDL(부분) GAP(부분적) - AudioWorkletNode와 대략적으로 동일 AudioWorkletSpec은 완료되었지만 이 API에는 AudioDeviceClient가 더 적합할 수 있습니다. 커뮤니티에서 아직 AudioDeviceClient를 지정하고 있습니다. Worklet은 이 API에 상응하는 대략적인 도구가 아닐 수 있습니다.
GetCurrentConfig SDL AudioContext.* (전달된 설정을 다시 가져옵니다.)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetTimestamp SDL AudioBufferSourceNode.start(매개변수) 버퍼에 연결되는 대신 매번 전달됩니다.
SetTimestamp SDL AudioBufferSourceNode.start(매개변수)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP - WebAudio는 32비트 부동 소수점만 사용하고 PPAPI는 16비트 int를 사용합니다. PPAPI는 이론적으로 여러 샘플링 크기를 지원합니다. 실제로는 16비트 샘플만 지원합니다. 안타깝게도 개발자들은 메모리 사용량을 줄이기 위해 16비트 샘플 크기를 요청했습니다. Web Audio 사양의 다음 버전에서는 16비트 샘플 지원을 구현합니다. decodeAudioData에서 가져온 오디오에 16비트 버퍼를 사용하여 Firefox와 유사하게 AudioBuffer 최적화를 구현할 수 있습니다.
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
CreateStereo16Bit GAP GAP - 32비트 부동 소수점 샘플만 지원됨 Web Audio 사양의 다음 버전에서는 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는 충분히 완벽한 대체 API로 간주됩니다. DevTools 소스 맵은 원래 소스 언어로 트랜스파일된 JavaScript를 디버그하는 데 사용할 수 있습니다.

PPB_Core

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
getTime utime new Date().getTime()
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== 정의되지 않음
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()가 호출되면 파일이 플러시됨 이는 네이티브 파일 시스템 API 파일이 OS에 노출되므로 데이터가 OS에 표시되기 전에 세이프 브라우징 검사를 실행해야 하기 때문에 의도적으로 설계된 것입니다.
닫기 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(부분적) - 네이티브 파일 시스템 API를 사용하면 FileSystemHandle.resolve(FileSystemHandle)를 사용하여 파일이 포함된 디렉터리의 참조에서 파일의 상대 경로를 확인할 수 있습니다. 파일의 절대 경로를 확인할 수 없으며 사용자는 파일이 포함된 디렉터리에 액세스할 수 있는 권한을 부여해야 합니다.
GetParent FS (일부) GAP(부분적) - 네이티브 파일 시스템 API를 사용하면 FileSystemHandle.resolve(FileSystemHandle)를 사용하여 파일이 포함된 디렉터리의 참조에서 파일의 상대 경로를 확인할 수 있습니다. 사용자가 파일이 포함된 디렉터리에 액세스할 수 있는 권한을 부여해야 합니다.
MakeDirectory FS(부분) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
터치 FS (일부) FileSystemDirectoryHandle.getFile("name", {create: true}) 수정 시간은 글을 쓰면 부풀릴 수 있습니다.
삭제 FS(부분) FileSystemDirectoryHandle.removeEntry() PPAPI와 달리 디렉터리는 비어 있을 필요가 없습니다.
이름 바꾸기 FS(부분) GAP(부분적) - 네이티브 파일 시스템 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 게임패드.* 게임패드 객체는 NavigationStart와 관련된 타임스탬프를 노출합니다. 다음 페이지에서 하드웨어로부터 데이터가 수신되면 업데이트됩니다. https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL Canvas.getContext('2d')
설명 SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
스크롤 GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP(부분) - drawImage를 사용하여 캔버스를 자체에 오프셋으로 그린 다음 나머지를 채우는 방식으로 구현할 수 있습니다.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
플러시 GAP 직접 상응하는 항목 없음 GAP (일부) - 그리기 코드의 끝에는 항상 암시적 플러시가 있습니다. 가능성 낮음 변경할 수 있습니다 그러나 OffscreenCanvas ImageBitmapRenderingContext 의 조합은 유사한 기능을 제공합니다.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (일부) - WebGL 2.0 및 Emscripten의 OpenGL ES 3.0 노출은 PPAPI를 통해 구성할 수 있는 모든 매개변수를 설정할 수 있는 사용자 정의 다중 샘플링 프레임 버퍼를 지원합니다.
만들기 SDL Canvas.getContext
GetAttribs SDL WebGLRenderingContext.getContextAttributes
SetAttribs SDL Canvas.getContext(.., OPTIONS)
GetError SDL WebGLRenderingContext.getError
ResizeBuffers SDL Canvas.width = w; Canvas.height = h;
SwapBuffers GAP 직접 상응하는 항목 없음 GAP (일부) - 그리기 코드의 끝에는 항상 암시적 플러시가 있습니다. 가능성 낮음 변경할 수 있습니다 그러나 OffscreenCanvas ImageBitmapRenderingContext 의 조합은 유사한 기능을 제공합니다.

PPB_ImageData

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetNativeImageDataFormat SDL ImageData는 RGBA 순서를 요구합니다.
IsImageDataFormatSupported SDL ImageData는 RGBA 순서를 요구합니다.
만들기 SDL CanvasRenderingContext2d.createImageData
설명 SDL ImageData에는 항상 stride가 없습니다.
지도 SDL ImageData.data
매핑 해제 SDL ImageData.data

PPB_InputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
RequestInputEvents SDL 직접 상응하는 항목 없음 JS/Wasm이 기본 스레드에서 실행되고 교차 프로세스 왕복을 일으키지 않고도 이벤트를 더 저렴하게 필터링할 수 있으므로 이 기능의 누락은 그다지 관련성이 없습니다.
RequestFilteringInputEvents SDL 마우스* 키* 휠* 터치* 구성* 이벤트
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL 이벤트 클래스 자손
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL 'dblclick'과 'mousedown' 이벤트 비교
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP - deltaMode에는 이 정보가 포함되어 있지만 불완전합니다. WheelEvent.deltaMode API 구현에 관한 논의가 있습니다. https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP - deltaMode에는 이 정보가 포함되어 있지만 불완전합니다. 다음 링크에서 WheelEvent.deltaMode API 구현에 관해 논의해 보세요. https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (직접 확인)

PPB_IMEInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - 직접 상응하는 항목 없음 이 데이터는 CompositionEvent.data에서 가져올 수 있습니다.
GetSegmentOffset GAP GAP - 직접 상응하는 항목 없음
GetTargetSegment GAP GAP - 직접 상응하는 항목 없음
GetSelection GAP GAP - 직접 상응하는 항목 없음

PPB_Instance

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
BindGraphics SDL Canvas.getContext(결합이 자동이므로 무의미함).
IsFullFrame GAP GAP - MIME 유형 핸들러에 상응하는 항목이 없습니다. NaCl 앱은 특정 MIME 유형을 처리하고 전체 문서를 소유하도록 등록할 수 있습니다.
DidCreate 해당 사항 없음 <Element>[key] 일반 DOM 액세스를 사용하면 태그 속성을 가져올 수 있습니다.
DidDestroy 해당 사항 없음 해당 사항 없음 NaCl에 대해 트리거되지 않음
DidChangeView 해당 사항 없음 요소 '크기 조정' 이벤트
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 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.
GetCurrent 해당 사항 없음 대부분은 중요하지 않으며 작업자는 암시적 이벤트 루프를 가져옵니다.
AttachToCurrentThread 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.
실행 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.
PostWork 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.
PostQuit 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.

PPB_Messaging

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
PostMessage 해당 사항 없음 Window.postMessage
RegisterMessageHandler 해당 사항 없음 Window.addEventListener
UnregisterMessageHandler 해당 사항 없음 Window.removeEventListener

PPB_MouseCursor

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
SetCursor SDL Element.style.cursor 동일한 스톡 커서 집합이 지원됩니다. url(..)을 사용하여 커스텀 커서를 수행할 수 있습니다. 동적 맞춤 커서는 데이터 URI를 사용하여 수행할 수 있습니다. CSS3에서는 핫스팟 지정을 지원합니다.

PPB_MouseLock

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
여러 가지 방법 OpenGLES 기능 면에서 WebGL 1.0에 가깝습니다.
x OffscreenCanvas

PPB_TextInputController

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
SetTextInputType GAP GAP - 입력 방식 편집기 API로 채울 수 있음 일부 개발자는 이러한 방식으로 힌트를 주거나 캔버스 내에서 IME 이벤트/출력을 가로채고 인라인으로 표시하는 기능을 선호합니다.
UpdateCaretPosition GAP GAP - Input Method Editor API에 의해 채워졌을 수 있음 https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP - Input Method Editor API에 의해 채워졌을 수 있음 https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP - Input Method Editor 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 Fetch Response*
ReadResponseBody embind XMLHttpRequest.response
embind Body.* (응답은 본문입니다.)
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 import(.., options:body)
AppendFileToBody GAP import() 업로드 스트리밍 https://www.chromestatus.com/features/5274139738767360
해당 사항 없음 <form> FileReader로 읽고 업로드할 수도 있지만 AppendDataToBody와 비슷합니다.

PPB_URLResponseInfo

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetProperty embind XMLHttpRequest.getAllResponseHeaders + 기타
embind Fetch Response*
GetBodyAsFileRef embind 응답 가져오기(본문) .blob() 스토리지 레이어가 전송을 최적화한다고 가정합니다.

PPB_Var

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource 해당 사항 없음 해당 사항 없음
VarToResource 해당 사항 없음 해당 사항 없음

PPB_VarArray

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
가져오기 embind Array[i]
이제 embind 배열[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 embind new 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]
이제 embind <객체>[i] = x
삭제 embind <Object>[i] 삭제
HasKey embind <Object>의 x
GetKeys embind for (k in <Object>) {} 문자 그대로 상응하는 것은 없지만 빌드할 수 있습니다.

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 - VideoDecoder() 초기화 매개변수(VideoDecoderInitParameters)를 사용하는 제안된 WebCodecs API로 처리됩니다. 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 - ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable)을 사용하여 제안된 WebCodecs API로 처리됩니다. 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()로 호출되지만 디코딩 호출과 관련하여 API의 시퀀스가 어떻게 지정될지는 아직 논의 중입니다. 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로 처리됩니다. 전용 재설정 메서드만큼 효율적이지는 않지만, 재설정() 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 - VideoEncoder() 초기화 매개변수를 사용하여 제안된 WebCodecs API로 처리됩니다.
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 <Element>.scrollTop/<Element>.scrollLeft

PPB_WebSocket

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 GAP WebSocket.WebSocket
연결 GAP WebSocket.WebSocket(url, ...) WebSocket 'open' 이벤트
닫기 GAP WebSocket.close
ReceiveMessage GAP WebSocket '메시지' 이벤트 WebSocket '오류' 이벤트 WebSocket '닫기' 이벤트
SendMessage GAP WebSocket.send
GetBufferedAmount GAP WebSocket.bufferedAmount
GetCloseCode GAP CloseEvent.code
GetCloseReason GAP CloseEvent.reason
GetCloseWasClean GAP CloseEvent.wasClean
GetExtensions GAP WebSocket.extensions
GetProtocol GAP WebSocket.protocol
GetReadyState GAP WebSocket.readyState
GetURL GAP WebSocket.url

PPP_Graphics3D

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
그래픽 3DContext 손실 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 해당 사항 없음 요소 '크기 조정' 이벤트
DidChangeFocus 해당 사항 없음 요소 '포커스', '포커스인', '포커스아웃' 이벤트
HandleDocumentLoad 해당 사항 없음 GAP - MIME 유형 핸들러로 등록할 수 없음 앱과 매니페스트 항목을 통한 NaCl 모듈을 설정하여 특정 MIME 유형을 처리할 수 있습니다.

PPP_MessageHandler

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
HandleMessage embind MessagePort '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와 대략적으로 동일 AudioWorkletSpec은 완료되었지만 이 API에는 AudioDeviceClient가 더 적합할 수 있습니다. 커뮤니티에서 아직 AudioDeviceClient를 지정하고 있습니다. Worklet은 이 API에 상응하는 대략적인 도구가 아닐 수 있습니다.
GetCurrentConfig SDL AudioContext.* (전달된 설정을 다시 가져옵니다.)
StartPlayback SDL AudioBufferSourceNode.start
StopPlayback SDL AudioBufferSourceNode.stop

PPB_AudioBuffer

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetTimestamp SDL AudioBufferSourceNode.start(매개변수) 버퍼에 연결되는 대신 매번 전달됩니다.
SetTimestamp SDL AudioBufferSourceNode.start(매개변수)
GetSampleRate SDL AudioBuffer.sampleRate
GetSampleSize GAP GAP - WebAudio는 32비트 부동 소수점만 사용하고 PPAPI는 16비트 int를 사용합니다. PPAPI는 이론적으로 여러 샘플링 크기를 지원합니다. 실제로는 16비트 샘플만 지원합니다. 안타깝게도 개발자들은 메모리 사용량을 줄이기 위해 16비트 샘플 크기를 요청했습니다. Web Audio 사양의 다음 버전에서는 16비트 샘플 지원을 구현합니다. decodeAudioData에서 가져온 오디오에 16비트 버퍼를 사용하여 Firefox와 유사하게 AudioBuffer 최적화를 구현할 수 있습니다.
GetNumberOfChannels SDL AudioBuffer.numberOfChannels
GetDataBuffer SDL AudioBuffer.getChannelData
GetBufferSize SDL AudioBuffer.length

PPB_AudioConfig

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
CreateStereo16Bit GAP GAP - 32비트 부동 소수점 샘플만 지원됨 Web Audio 사양의 다음 버전에서는 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는 충분히 완벽한 대체 API로 간주됩니다. DevTools 소스 맵은 원래 소스 언어로 트랜스파일된 JavaScript를 디버그하는 데 사용할 수 있습니다.

PPB_Core

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
getTime utime new Date().getTime()
getTimeTicks utime new Date().getTime()
IsMainThread GAP window.document !== 정의되지 않음
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()가 호출되면 파일이 플러시됨 이는 네이티브 파일 시스템 API 파일이 OS에 노출되므로 데이터가 OS에 표시되기 전에 세이프 브라우징 검사를 실행해야 하기 때문에 의도적으로 설계된 것입니다.
닫기 FS (일부) FileSystemWriter.close() 대기 중인 작업을 취소하지 않지만 지금까지 쓴 모든 데이터를 디스크에 플러시합니다.
ReadToArray GAP Blob.slice().arrayBuffer() 또는 Blob.arrayBuffer() 여러 하위 범위 읽기를 동시에 허용합니다.

PPB_FileRef

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 FS(부분) FileSystemDirectoryHandle.getFile(&quot;name&quot;, {create: true})
GetFileSystemType FS(부분) FileSystem.type
GetName FS(부분) File.name
GetPath FS(부분) GAP(부분적) - 네이티브 파일 시스템 API를 사용하면 FileSystemHandle.resolve(FileSystemHandle)를 사용하여 파일이 포함된 디렉터리의 참조에서 파일의 상대 경로를 확인할 수 있습니다. 파일의 절대 경로를 확인할 수 없으며 사용자는 파일이 포함된 디렉터리에 액세스할 수 있는 권한을 부여해야 합니다.
GetParent FS (일부) GAP(부분적) - 네이티브 파일 시스템 API를 사용하면 FileSystemHandle.resolve(FileSystemHandle)를 사용하여 파일이 포함된 디렉터리의 참조에서 파일의 상대 경로를 확인할 수 있습니다. 사용자가 파일이 포함된 디렉터리에 액세스할 수 있는 권한을 부여해야 합니다.
MakeDirectory FS(부분) FileSystemHandle.getDirectory(..., {createIfNotExists: true})
터치 FS (일부) FileSystemDirectoryHandle.getFile("name", {create: true}) 수정 시간은 글을 쓰면 부풀릴 수 있습니다.
삭제 FS(부분) FileSystemDirectoryHandle.removeEntry() PPAPI와 달리 디렉터리는 비어 있을 필요가 없습니다.
이름 바꾸기 FS(부분) GAP(부분적) - 네이티브 파일 시스템 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 게임패드.* 게임패드 객체는 NavigationStart와 관련된 타임스탬프를 노출합니다. 다음 페이지에서 하드웨어로부터 데이터가 수신되면 업데이트됩니다. https://www.w3.org/TR/gamepad/#gamepad-interface

PPB_Graphics2D

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL Canvas.getContext('2d')
설명 SDL Canvas.clientWidth + Canvas.clientHeight
PaintImageData SDL CanvasRenderingContext2D.putImageData
스크롤 GAP CanvasRenderingContext2D.scrollIntoView, CanvasRenderingContext2D.drawImage GAP(부분) - drawImage를 사용하여 캔버스를 자체에 오프셋으로 그린 다음 나머지를 채우는 방식으로 구현할 수 있습니다.
ReplaceContents SDL CanvasRenderingContext2D.drawImage
플러시 GAP 직접 상응하는 항목 없음 GAP(부분) - 항상 그리기 코드 끝에 암시적 플러시가 있습니다. 이는 변경되지 않을 가능성이 큽니다. 그러나 OffscreenCanvas ImageBitmapRenderingContext 의 조합은 유사한 기능을 제공합니다.
SetScale SDL CanvasRenderingContext2D.scale
GetScale SDL CanvasRenderingContext2D.currentTransform
SetLayerTransform SDL CanvasRenderingContext2D.setTransform CanvasRenderingContext2D.scale CanvasRenderingContext2D.translate

PPB_Graphics3D

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetAttribMaxValue OpenGL ES 3.0 WebGL 2.0 GAP (일부) - WebGL 2.0 및 Emscripten의 OpenGL ES 3.0 노출은 PPAPI를 통해 구성할 수 있는 모든 매개변수를 설정할 수 있는 사용자 정의 다중 샘플링 프레임 버퍼를 지원합니다.
만들기 SDL Canvas.getContext
GetAttribs SDL WebGLRenderingContext.getContextAttributes
SetAttribs SDL Canvas.getContext(.., OPTIONS)
GetError SDL WebGLRenderingContext.getError
ResizeBuffers SDL Canvas.width = w; Canvas.height = h;
SwapBuffers GAP 직접 상응하는 항목 없음 GAP (일부) - 그리기 코드의 끝에는 항상 암시적 플러시가 있습니다. 가능성 낮음 변경할 수 있습니다 그러나 OffscreenCanvas ImageBitmapRenderingContext 의 조합은 유사한 기능을 제공합니다.

PPB_ImageData

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetNativeImageDataFormat SDL ImageData는 RGBA 순서를 요구합니다.
IsImageDataFormatSupported SDL ImageData는 RGBA 순서를 요구합니다.
만들기 SDL CanvasRenderingContext2d.createImageData
설명 SDL ImageData에는 항상 stride가 없습니다.
지도 SDL ImageData.data
매핑 해제 SDL ImageData.data

PPB_InputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
RequestInputEvents SDL 직접 상응하는 항목 없음 JS/Wasm이 기본 스레드에서 실행되고 교차 프로세스 왕복을 일으키지 않고도 이벤트를 더 저렴하게 필터링할 수 있으므로 이 기능의 누락은 그다지 관련성이 없습니다.
RequestFilteringInputEvents SDL 마우스* 키* 휠* 터치* 구성* 이벤트
SDL Element.addEventListener
ClearInputEventRequest SDL Element.removeEventListener
GetType SDL 이벤트 클래스 자손
GetTimeStamp SDL Event.timeStamp
GetModifiers SDL *Event.altKey/shiftKey/metaKey/ctrlKey

PPB_MouseInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL MouseEvent
GetButton SDL MouseEvent.button
GetPosition SDL MouseEvent.client*/page*/offset*
GetClickCount SDL 'dblclick'과 'mousedown' 이벤트 비교
GetMovement SDL MouseEvent.movement*

PPB_WheelInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL WheelEvent
GetDelta SDL WheelEvent.delta*
GetTicks GAP GAP - deltaMode에는 이 정보가 포함되어 있지만 불완전합니다. WheelEvent.deltaMode API 구현에 관한 논의가 있습니다. https://github.com/w3c/uievents/issues/181#issuecomment-537811017
GetScrollByPage GAP GAP - deltaMode에는 이 정보가 포함되어 있지만 불완전합니다. 다음 링크에서 WheelEvent.deltaMode API 구현에 관해 논의해 보세요. https://github.com/w3c/uievents/issues/181#issuecomment-537811017

PPB_KeyboardInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL KeyboardEvent
GetKeyCode SDL KeyboardEvent.keyCode
GetCharacterText SDL KeyboardEvent.key
GetCode SDL KeyboardEvent.code

PPB_TouchInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 SDL TouchEvent
AddTouchPoint SDL TouchEvent.touches.push
GetTouchCount SDL TouchEvent.touches.length
GetTouchByIndex SDL TouchEvent.touches[i]
GetTouchById SDL Touch.indentifer (직접 확인)

PPB_IMEInputEvent

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 GAP CompositionEvent
GetText GAP CompositionEvent.data
GetSegmentNumber GAP GAP - 직접 상응하는 항목 없음 이 데이터는 CompositionEvent.data에서 가져올 수 있습니다.
GetSegmentOffset GAP GAP - 직접 상응하는 항목 없음
GetTargetSegment GAP GAP - 직접 상응하는 항목 없음
GetSelection GAP GAP - 직접 상응하는 항목 없음

PPB_Instance

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
BindGraphics SDL Canvas.getContext(결합이 자동이므로 무의미함).
IsFullFrame GAP GAP - MIME 유형 핸들러에 상응하는 항목이 없습니다. NaCl 앱은 특정 MIME 유형을 처리하고 전체 문서를 소유하도록 등록할 수 있습니다.
DidCreate 해당 사항 없음 &lt;Element&gt;[key] 일반 DOM 액세스를 사용하면 태그 속성을 가져올 수 있습니다.
DidDestroy 해당 사항 없음 해당 사항 없음 NaCl에 대해 트리거되지 않음
DidChangeView 해당 사항 없음 요소 '크기 조정' 이벤트
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 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.
GetCurrent 해당 사항 없음 대부분은 중요하지 않으며 작업자는 암시적 이벤트 루프를 가져옵니다.
AttachToCurrentThread 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.
실행 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.
PostWork 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.
PostQuit 해당 사항 없음 대부분 작업자가 암시적 이벤트 루프를 얻습니다.

PPB_Messaging

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
PostMessage 해당 사항 없음 Window.postMessage
RegisterMessageHandler 해당 사항 없음 Window.addEventListener
UnregisterMessageHandler 해당 사항 없음 Window.removeEventListener

PPB_MouseCursor

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
SetCursor SDL Element.style.cursor 동일한 스톡 커서 집합이 지원됩니다. url(..)을 사용하여 커스텀 커서를 수행할 수 있습니다. 동적 맞춤 커서는 데이터 URI를 사용하여 수행할 수 있습니다. CSS3에서는 핫스팟 지정을 지원합니다.

PPB_MouseLock

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
LockMouse SDL Element.requestPointerLock
UnlockMouse SDL Element.exitPointerLock

PPB_OpenGLES2

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
여러 가지 방법 OpenGLES 기능 면에서 WebGL 1.0에 가깝습니다.
x OffscreenCanvas

PPB_TextInputController

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
SetTextInputType GAP GAP - 입력 방식 편집기 API로 채울 수 있음 일부 개발자는 이러한 방식으로 힌트를 주거나 캔버스 내에서 IME 이벤트/출력을 가로채고 인라인으로 표시하는 기능을 선호합니다.
UpdateCaretPosition GAP GAP - Input Method Editor API에 의해 채워졌을 수 있음 https://www.w3.org/TR/ime-api/
CancelCompositionText GAP GAP - Input Method Editor API에 의해 채워졌을 수 있음 https://www.w3.org/TR/ime-api/
UpdateSurroundingText GAP GAP - Input Method Editor 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 Fetch Response*
ReadResponseBody embind XMLHttpRequest.response
embind Body.* (응답은 본문입니다.)
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 import(.., options:body)
AppendFileToBody GAP import() 업로드 스트리밍 https://www.chromestatus.com/features/5274139738767360
해당 사항 없음 <form> FileReader로 읽고 업로드할 수도 있지만 AppendDataToBody와 비슷합니다.

PPB_URLResponseInfo

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetProperty embind XMLHttpRequest.getAllResponseHeaders + 기타
embind Fetch Response*
GetBodyAsFileRef embind 응답 가져오기(본문) .blob() 스토리지 레이어가 전송을 최적화한다고 가정합니다.

PPB_Var

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
VarFromUtf8 embind TextDecoder.decode
VarToUtf8 embind TextEncoder.encode
VarFromResource 해당 사항 없음 해당 사항 없음
VarToResource 해당 사항 없음 해당 사항 없음

PPB_VarArray

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
가져오기 embind Array[i]
이제 embind 배열[i] = x
GetLength embind Array.length
SetLength embind Array.length = n

PPB_VarArrayBuffer

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 embind new 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]
이제 embind <객체>[i] = x
삭제 embind <Object>[i] 삭제
HasKey embind <Object>의 x
GetKeys embind for (k in <Object>) {} 문자 그대로 상응하는 것은 없지만 빌드할 수 있습니다.

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 - VideoDecoder() 초기화 매개변수(VideoDecoderInitParameters)를 사용하는 제안된 WebCodecs API로 처리됩니다. 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 - ReadableStream.pipeThrough(VideoDecoder).pipeTo(VideoTrackWriter().writable)을 사용하여 제안된 WebCodecs API로 처리됩니다. 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()로 호출되지만 디코딩 호출과 관련하여 API의 시퀀스가 어떻게 지정될지는 아직 논의 중입니다. 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로 처리됩니다. 전용 재설정 메서드만큼 효율적이지는 않지만, 재설정() 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 - VideoEncoder() 초기화 매개변수를 사용하여 제안된 WebCodecs API로 처리됩니다.
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 <Element>.scrollTop/<Element>.scrollLeft

PPB_WebSocket

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 GAP WebSocket.WebSocket
연결 GAP WebSocket.WebSocket(url, ...) WebSocket 'open' 이벤트
닫기 GAP WebSocket.close
ReceiveMessage GAP WebSocket '메시지' 이벤트 WebSocket '오류' 이벤트 WebSocket '닫기' 이벤트
SendMessage GAP WebSocket.send
GetBufferedAmount GAP WebSocket.bufferedAmount
GetCloseCode GAP CloseEvent.code
GetCloseReason GAP CloseEvent.reason
GetCloseWasClean GAP CloseEvent.wasClean
GetExtensions GAP WebSocket.extensions
GetProtocol GAP WebSocket.protocol
GetReadyState GAP WebSocket.readyState
GetURL GAP WebSocket.url

PPP_Graphics3D

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
그래픽 3DContext 손실 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 해당 사항 없음 요소 '크기 조정' 이벤트
DidChangeFocus 해당 사항 없음 요소 '포커스', '포커스인', '포커스아웃' 이벤트
HandleDocumentLoad 해당 사항 없음 GAP - MIME 유형 핸들러로 등록할 수 없음 앱과 매니페스트 항목을 통한 NaCl 모듈을 설정하여 특정 MIME 유형을 처리할 수 있습니다.

PPP_MessageHandler

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
HandleMessage embind MessagePort '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 GAP (일부) - 직접 상응하는 항목 없음
GetCanonicalName x GAP GAP(부분) - 직접 상응하는 항목 없음
GetNetAddressCount x GAP GAP (일부) - 직접 상응하는 항목 없음
GetNetAddress x GAP GAP (일부) - 직접 상응하는 항목 없음

PPB_NetAddress

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
CreateFromIPv4Address x GAP GAP(부분) - 직접 상응하는 항목 없음
CreateFromIPv6Address x GAP GAP (일부) - 직접 상응하는 항목 없음
GetFamily x GAP GAP (일부) - 직접 상응하는 항목 없음
DescribeAsString x GAP GAP (일부) - 직접 상응하는 항목 없음
DescribeAsIPv4Address x GAP GAP (일부) - 직접 상응하는 항목 없음
DescribeAsIPv6Address x GAP GAP (일부) - 직접 상응하는 항목 없음

PPB_NetworkList

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetCount x GAP GAP - 직접 상응하는 항목 없음
GetName x GAP GAP - 직접 상응하는 항목 없음
GetType x GAP GAP - 직접 상응하는 항목 없음
GetState x GAP GAP - 직접 상응하는 항목 없음
GetIpAddress x GAP GAP - 직접 상응하는 항목 없음
GetDisplayName x GAP GAP - 직접 상응하는 항목 없음
GetMTU x GAP GAP - 직접 상응하는 항목 없음

PPB_NetworkMonitor

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
만들기 x GAP GAP - 직접 상응하는 항목 없음
UpdateNetworkList x GAP GAP - 직접 상응하는 항목 없음

PPB_NetworkProxy

PPAPI 메서드 스레드 가정 Emscripten 웹 API 제한사항
GetProxyForURL x GAP GAP - 직접 상응하는 항목 없음

PPB_TCPSocket 및 PPB_UDPSocket

이전을 위한 직접적인 1:1 매핑은 없습니다. 대신 아래에 몇 가지 사용자 시나리오와 권장되는 이전 경로를 설명했습니다.

사용 사례 권장사항
화면 공유 getDisplayMediaWebRTC ( 데모)
대역폭 사용량을 최소화하기 위해 로컬 서버에서 로드 XHR, 가져오기, 스트림, 서비스 워커, 캐시 API
다음에서 로드: 웹 앱의 로컬 인스턴스 / 웹 앱의 로컬 인스턴스에 연결 WebRTC
채팅 WebSocket*
실시간 오디오/동영상 통신 WebRTC
공동작업 WebSocket*
실시간 멀티플레이어 게임 WebTransport** 단, P2P인 경우에는 WebRTC (또는 RTCIceTransport를 통한 WebTransport)
실시간 상호작용 스트리밍 WebTransport**
의사소통 기존 서버 사용 프로토콜을 변환하는 프록시 서버 또는 미들웨어입니다. 피드백 대상 bit.ly/network-api-gaps

*: 향후 WebTransport도 가능

**: 사용 가능 여부는 chromestatus를 참고하세요.