2D 게임 / 앱에 2D Canvas 대신 WebGL을 사용하는 이유가 있습니까?


112

2D 게임 / 앱 에 2D-Canvas 대신 WebGL을 사용하는 데 성능 외에 다른 이유가 있습니까?

즉, 2D-Canvas로는 쉽게 달성 할 수없는 WebGL이 제공하는 2D 기능은 무엇입니까?


5
참고 : 동일한 캔버스에서 2D 및 3D 컨텍스트 API를 사용할 수 없지만 여러 캔버스를 사용하여 결합 할 수 있습니다. WebGL은 2d 캔버스를 텍스처로 사용할 수 있고 2d 캔버스는 WebGL 캔버스를 drawImage의 소스로 사용할 수 있습니다.
Philipp 2014

답변:


83

다른 측면에서이 질문을 살펴보면
개발자가 다른 기술보다 한 기술을 어떻게 선택합니까?

  • 이미 구축 된 시스템에 더 잘 통합됩니다.
  • 사용하기 쉽습니다
  • 가 더 빠르다
  • 더 많은 기능을 가지고 있거나 그들의 필요에 더 잘 맞는
  • 비용
  • 더 많은 플랫폼 독립

따라서 이러한 특성과 관련하여 canvas와 webGL API의 차이점에 대해 설명하겠습니다.


canvas와 webGL은 모두 JavaScript API입니다. 통합 (바인딩)과 관련하여 거의 동일합니다. 둘 다 코딩 속도를 높일 수있는 여러 라이브러리에서 지원됩니다. 다른 라이브러리는 코드를 구성하는 다른 방법을 제공하므로 라이브러리 선택에 따라 드로잉 API가 구조화되는 방식이 결정되지만 여전히 거의 동일합니다 (나머지 코드가 함께 바인딩되는 방식). 라이브러리를 사용하는 경우 코드 작성의 용이성은 라이브러리 자체에 달려 있습니다.

0부터 코드를 작성하면 캔버스 API를 배우고 이해하기가 훨씬 쉽습니다. 최소한의 수학 지식이 필요하며 개발은 빠르고 간단합니다.

WebGL API로 작업하려면 강력한 수학 기술과 렌더링 파이프 라인에 대한 완전한 이해가 필요합니다. 이러한 기술을 가진 사람은 찾기가 더 어렵고 생산 속도가 느리기 때문에 (이러한 코드 기반의 크기와 복잡성으로 인해) 비용이 더 많이 듭니다.

WebGL은 더 빠르고 더 많은 기능을 제공합니다. 그것에 대해 의심의 여지가 없습니다. 렌더링 파이프 라인에 대한 전체 액세스 권한을 제공하는 네이티브 3D API이며 코드 및 효과가 더 빠르게 실행되고 '조정 가능'합니다. webGL에는 실제로 제한이 없습니다.

canvas와 webGL은 모두 html5의 장점입니다. 일반적으로 하나를 지원하는 장치는 다른 하나를 지원합니다.

요약하자면 :

  • 그리기 API 코드와 나머지 (통합) 병합 : 유사
  • 사용의 용이성:
    • (라이브러리 포함) canvas = webGL
    • (처음부터) webGL << 캔버스
  • 속도 : webGL> 캔버스
  • 기능 : webGL> 캔버스
  • 비용 : webGL은 훨씬 더 비쌉니다.
  • 플랫폼 : 매우 유사

도움이 되었기를 바랍니다.

토론을위한 PS Open.


@Abstract, 웹 GL에 대한 좋은 튜토리얼은 어디에 있으며 얼마나 걸리나요?
Pacerier

1
@Pacerier는 그냥 구글링을했고, 처음 몇 번의 히트는 아마 충분할 것입니다. 그러나 일반적으로 webgl 및 그래픽 프로그래밍에 능숙 해지려면 몇 주와 몇 달이 걸리고 정말 잘하려면 몇 년이 걸립니다. API를 배우는 데 필요한 것은 임의의 "라이브러리"가 아닙니다. 그게 전부입니다.
추상 알고리즘

@AbstractAlgorithm, 프로그래밍 캔버스의 마스터라면 웹 GL로 전환하는 데 몇 시간이 걸립니까?
Pacerier

@Pacerier는 개발자에 의존하고 Abstract는 이미 관련 개발자의 수학 기술을 말했습니다. 실제로 만들 수있는 정량화가 없습니다.
scrappedcola

32

가장 큰 장점은 파이프 라인의 프로그래밍 가능성과 성능입니다. 예를 들어, 두 개의 상자를 다른 상자 위에 그리고 하나는 숨겨져 있다고 가정하면 일부 GL 구현에는 숨겨진 상자를 삭제할 수있는 범위가 있습니다.

비교는 여기에 테이블을 빠르게 만드는 방법이 없기 때문에 아래에 비교 테이블 사진을 업로드했습니다. 완전성을 위해 Three.js를 추가했습니다.

표


"일부 GL 구현은 숨겨진 상자를 버릴 수있는 범위가 있지만"JS에서 재정의 된 부분을 감지 할 수 없으므로 필요하지 않은 부분을 다시 그릴 수 없습니까?
Pacerier

16

응용 프로그램 에 대한 경험에서 말하면 그래픽 셰이더는 WebGL에 대한 지원이 필요한 유일한 이유였습니다. 두 프레임 워크를 three.js로 추상화 할 수 있기 때문에 사용 편의성은 나에게 거의 영향을 미치지 않습니다. 셰이더가 필요하지 않다고 가정하면 두 프레임 워크 중 하나를 사용하여 브라우저 / 컴퓨터 지원을 최대화 할 수 있습니다.


16

WebGL은 2D 캔버스가 제공하지 않는 2D 기능은 무엇입니까? 가장 큰 IMHO는 그래픽 하드웨어의 프로그래밍 가능한 조각 셰이더입니다. 예를 들어 WebGL에서 3D 하드웨어의 셰이더에서 Conway의 Game of Life를 구현할 수 있습니다.

http://glslsandbox.com/e#207.3

이런 종류의 2D 디스플레이는 2D 캔버스가있는 GPU가 아닌 CPU에서만 실행됩니다. 모든 계산은 JavaScript로 구현되며 웹 작업자의 도움으로도 GPU만큼 병렬 적이 지 않습니다. 이것은 물론 하나의 예일 뿐이며, 모든 종류의 흥미로운 2D 효과를 셰이더로 구현할 수 있습니다.


2
따라서 캔버스와 비교하여 WebGL은 OS에 다소 부담이됩니까?
Pacerier

어쨌든 모든 캔버스가 webgl을 수행하는지 궁금합니다. 사전 컴파일 된 공통 사용 사례 webgl을 사용하는 경우 직접 webgl보다 효율적입니다. 또는 webgl을 사용하지 않는 한 어떤 방식 으로든 OpenGL과 인터페이스하지 않는 경우.
Dmitry

1
@Dmitry 좋은 질문이며, 다른 브라우저는 그 문제에 대해 다른 접근 방식을 자유롭게 취할 수 있습니다. 그러나 Canvas 2D API를 가속화하는 방법에 관계없이 Canvas 2D API 자체는 프로그래밍 가능한 셰이더 또는 정점 배열 버퍼를 제공하지 않습니다. WebGL의 API는 대량 데이터로드 및 GPU 기반 사용자 지정 처리를 허용하는 반면 "수다스러운"API (그린 요소 당 하나의 JavaScript-Native 호출)입니다.
emackey

14

음, 게임을 코딩 할 때 속도가 빨라야하기 때문에 성능이 가장 큰 이유 중 하나입니다. 하지만 캔버스 대신 WebGL을 선택해야하는 몇 가지 다른 이유가 있습니다. 셰이더, 조명 및 확대 / 축소를 코딩 할 수있는 가능성을 제공하며 이는 상용 게임 앱을 수행하는 경우 중요합니다. 또한 50 개 정도의 스프라이트 후에 캔버스가 느려집니다.


특히 자바 스크립트에서 CPU가 빠르게 과부하되는 Android 태블릿과 같은 기기에서 WebGL을 사용하는 주된 이유는 렌더링 부하를 GPU로 전송하는 것입니다.
Curtis

1
@ Xk0n, Re는 "셰이더, 조명 및 확대 / 축소를 코딩 할 수있는 가능성을 제공합니다."그러나 GPU에 종속되지 않습니까?
Pacerier

2D 캔버스 컨텍스트에서 setTransform으로 여전히 확대 / 축소 할 수 있습니다. 하지만 스프라이트 시트에서 스케일링 할 때 2D 캔버스에서 텍스처 번짐으로 어려움을 겪고 있었기 때문에 WebGL로 전환하고 있습니다. 가장 가까운 이웃 샘플링이 소스 사각형 외부로 나가는 것을 막는 튜토리얼을 보았는데, 이는 내 블리딩 에지 ​​문제를 해결해야합니다.
Frank

7

webGL로는 할 수없는 Canvas로 할 수있는 일은 없습니다. 캔버스는 get / putImageData로 바이트를 분쇄 할 수 있으며, webGL을 사용하여 프로그래밍 방식으로 선, 원 등을 그릴 수 있습니다.
그러나 꽤 많은 그림과 60fps에서 일부 효과를 수행하려는 경우 성능 차이가 너무 커서 webGL에서 제대로 실행될 때 캔버스에서는 불가능합니다. 성능은 기본 기능입니다.

그러나 webGL은 프로그래밍하기가 매우 복잡합니다. 캔버스가 당신에게 충분한 지 확인하거나 고통을 덜어 줄 라이브러리를 찾거나 ...
다른 단점 : IE (하지만 무엇을하나요?)와 일부 모바일에서는 작동하지 않습니다.
호환성은 여기를 참조하십시오 : http://caniuse.com/webgl


7

특히 캔버스에서 잘 작동하지 않는 고전적인 2D 항목을 원합니다.

  • 색상 변환 (예 : 스프라이트 깜박임)
  • 반복 비트 맵 채우기
  • 회전중인 맵 타일링 (캔버스 아래에서 일부 구현은 이음새를 생성 함)
  • 딥 레이어링 (구현에 따라 매우 다름)
  • 곱셈 또는 가산 블렌딩

... 물론 픽셀 액세스 권한이 있으므로 위를 포함한 모든 작업을 수동으로 수행 할 수 있습니다. 그러나 그것은 정말, 정말 느릴 수 있습니다. 이론적으로 캔버스에 렌더링하기 위해 Mesa openGl을 구현할 수 있습니다.

webGL을 사용하는 또 다른 큰 이유는 그 결과가 다른 곳으로 이식하기가 매우 쉽다는 것입니다. 이는 또한 기술을 더 가치있게 만듭니다.

캔버스를 사용하는 이유는 여전히 더 잘 지원되며 픽셀 단위로 작업하는 것을 배우면 매우 귀중한 교훈입니다.


Btw WebGL은 다중 스레드입니까? 동시에 화면의 두 부분을 그리는 두 개의 스레드를 가질 수 있습니까?
Pacerier

웹 브라우저는 본질적으로 단일 스레드이기 때문에 대답은 "예 및 아니오"라고 생각합니다. 따라서 GPU에 렌더링 할 데이터를 복사하는 것은 다중 스레드가 아닙니다. 그러나 셰이더가 렌더링을 시작하면 그래픽 카드의 대규모 병렬화를 사용하고 있으며 이는 기본적으로 화면의 여러 부분에 한 번에 그려집니다. 내가 틀렸다면 나를 바로 잡아주세요.
Kent Weigel

2

WebGL은 특히 새로운 기술이고 HTML5 캔버스가보다 확립되어 있으므로 사용하려는 것은 사용자에 따라 다릅니다. 사용자가 모바일 장치를 사용할 것이라고 생각한다면 HTML5 캔버스를 제안하고 더 나은 2D 렌더링을 원한다면 WebGL을 사용합니다. 그래서 당신이 할 수있는 일은 HTML5를 사용하는 모바일 렌더링에서 사용하는 경우이고 WebGL을 지원하는 플랫폼에서 사용하는 경우입니다.

예를 들면 :

 if (window.WebGLRenderingContext) {
     webGLcanvasApp()
         } else if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
     html5CanvasAppFMobile()
    } else {
    html5CanvasApp()
    }

출처 :
WebGL 지원을 감지하는 적절한 방법?
jQuery에서 모바일 장치를 감지하는 가장 좋은 방법은 무엇입니까?


1

WebGL은 GPU 없이는 사용할 수 없습니다.
대부분의 시스템에 GPU가 있기 때문에 이러한 하드웨어 종속성은 큰 문제가 아니지만 GPU 또는 CPU 아키텍처가 진화하는 경우 에뮬레이션으로 webgl 콘텐츠를 보존하는 것이 어려울 수 있습니다. 오래된 (가상화 된) 컴퓨터에서 실행하는 것은 문제가 있습니다.

그러나 "Canvas vs WebGL"은 바이너리 선택 일 필요가 없습니다. 실제로 효과를 위해 webgl을 사용하는 것을 선호하지만 나머지는 캔버스에서 수행합니다. VM에서 실행할 때 효과 없이도 여전히 훌륭하고 빠르게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.