브라우저 기반 게임을 제작할 때 캔버스로 만들거나 캔버스로 만들지 않겠습니까?


14

배경 : 나는 광범위한 개발 배경을 가지고 있지만, 지난 몇 년 전에 게임을 코딩했을 때였습니다. Javascript 기술은 상당히 제한되어 있으며 Tetris, Pac-man 또는 그와 같은 복잡한 수준의 간단한 게임을 구축하여 향상시킬 계획입니다.

질문 : 내가 선택해야 할 근본적인 선택은 <canvas>요소에 렌더링해야하는지 여부 입니다.

캔버스를 사용하면 점, 선 및 그보다 복잡한 것을 렌더링하는 기본 도구가 있습니다. 아마도이를 도울 다양한 프레임 워크가 있거나있을 것입니다.

캔버스가 없으면 일반 웹 페이지와 같이 DOM 트리에 객체를 유지할 수 있습니다.

하나의 접근법이 다른 접근법보다 낫습니까? 상호 배타적입니까? 어느 것을 선택해야하는지 어떻게 알 수 있습니까?

답변:


13

Canvas와 DOM은 서로 별개이지만 상호 배타적이지는 않습니다. 좋은 접근 방법 중 하나는 Canvas를 사용하여 메인 게임 영역 (예 : Tetris에서 떨어지는 조각)을 렌더링하고 canvas 요소와 겹치는 DOM 요소로 모든 UI (예 : 점수 표시)를 수행하는 것입니다.

그러나 테트리스와 같은 원시 게임에는 이러한 접근 방식이 실제로 필요하지 않습니다. 캔버스는 고급 그래픽 효과에 유용하지만, 필요하지 않은 경우 DOM을 고수하면 더 넓은 호환성을 얻을 수 있습니다. 모든 브라우저가 HTML5 Canvas를 지원하는 것은 아닙니다.


3
작년 한 해 동안 HTML5 게임에서 정직하게 작업하기 위해 Canvas를 지원하지 않는 브라우저는 어쨌든 괜찮은 게임에 비해 빠르지 않지만 Android 전화의 WebKit보다 느리지 않습니다. ... :(
Ivo Wetzel 2016 년

고마워 :) 나는 "브라우저 지원"을별로 신경 쓰지 않습니다. 문제가 될 정도로 충분히 배웠을 때 문제가 저절로 해결 될 것으로 기대합니다. 이것은 주로 재미와 학습을위한 것입니다.
Letharion

나는 또한 그것을하고있다 : 게임 자체는 캔버스에 그려지는 반면 GUI는 부분적으로 투명한 DOM 요소로 구성됩니다.
Philipp

@IvoWetzel 나는 같은 방식으로 생각합니다 ... 우리는 모바일 플랫폼에서 게임을하고 안드로이드도 거의 재생할 수 없습니다 ...
Vaughan

12

DOM 정보 DOM
은 구식 2D에서 잘 작동합니다. 즉, 이미지 회전이나 크기 조정을 사용하지 않습니다. 실제로이 두 가지 작업을위한 도구가 있지만 그 성과를 기대할 수는 없습니다.

게임의 경우 가능한 적은 브라우저 레이아웃 엔진에 의존해야 position:absolute합니다. 즉, 객체를 배치 하는 데 사용 됩니다. DOM 객체를 항상 생성하고 파괴하지 않도록 가능한 한 많이 시도하십시오. 변수가 많은 수의 객체가 필요한 경우 유휴 DOM 요소 풀을로 설정하여 display:none필요할 때 되 살릴 준비를 할 수 있습니다.

DOM vs canvas
IE8의 시장 점유율이 줄어들면서 점점 줄어드는 캔버스가 점점 더 매력적인 옵션이되고 있습니다. 대부분의 게임에서 아마도 훌륭한 선택 일 것입니다. 그러나 일부 작업의 경우 DOM은 사용하기 쉬운 도구이며 필요한 경우 일부 문서 흐름을 사용할 수 있으며 렌더링 된 객체에서 직접 클릭을 잡을 수 있으며 스크롤 막대를 쉽게 통합 할 수 있습니다.

성능 차이를 다루기가 어렵고, 작업에 따라 다르며 브라우저마다 크게 다릅니다.


2
나는 언급하지 않았다 position:absolute, 그것은 좋은 지적이다.
jhocking

DOM이 아닌 특정 수준에서 캔버스 GPU가 가속되지 않습니까?
Thomas

1
@Thomas GPU 가속이 있는지 확인할 수있는 유일한 지점은 webGL입니다. (기술적으로는 구현하지 않고도 구현할 수 있지만 일어날 가능성은 없습니다). 첫 번째 캔버스 2D 구현은 엄밀히 CPU였습니다. 일부 브라우저에서 일부 기능이 GPU로 옮겨졌습니다. DOM GPU 가속과 관련하여 그들은 노력하고 있으며, 발생하지 않아야 할 특별한 이유는 없습니다. 어쨌든 궁극적으로 중요한 것은 브라우저가 어떻게 작동하는지가 아니라 필요에 따라 성능이 충분하다면 GPU가 항상 더 빠른 것을 의미하지는 않습니다.
aaaaaaaaaaaa

GPU 속도가 항상 빠르다는 것은 무엇을 의미합니까? PC에서는 이것이 사실 일지 모르지만 모바일 플랫폼에서는 GPU가 더 많은 렌더링을 수행하도록하여 CPU가 AI와 같은 게임 로직을 실행하는 데 더 많은 '사이클'을 소비하도록하고 싶습니다. 이런 방식으로 게임이 더 복잡해질 수 있습니다 .
Thomas

1
@Thomas 그것은 플랫폼, 직업 및 기타 많은 것들에 달려 있습니다. Old-school 2D는 주로 메모리 작업으로, 주 메모리에 리소스를 유지하고 이러한 작업에 CPU를 사용하면 휴대폰에서도 잘 작동하지만 다른 프로세서의 메모리에있는 데이터에 대해 작업을 수행하려고하면 성능이 저하됩니다. 따라서 GPU에서 수행 할 수없는 작업과 GPU 작업을 혼합하면 작업에 따라 버퍼를 앞뒤로 보내거나 프로세서 중 하나가 다른 프로세서 메모리에 쓰게됩니다.
aaaaaaaaaaaa

6

캔버스는 게임 유형에 따라 다르지만 캔버스는 "가장 많이"맞습니다.

DOM 관리는 특정 시점에서 끔찍합니다. 요소가 많을수록 더 느리게 움직일수록 요소가 더 느려집니다 .

IMG 요소로 자산 로딩 순서를 관리하는 것은 중요하지 않습니다 (이미지 태그에서 의도적으로 손상된 프로토콜의 오류를 차단합니다 : : D).

정적 이미지가 많고 효과 수가 적은 게임의 경우 여전히 DOM을 사용합니다. 다른 모든 것, 캔버스가 첫 번째 선택입니다 (히트 맵은 다른 이야기이지만 포인트 앤 클릭 항목).

요즘에는 캔버스가 너무 빠르기 때문에 (아이폰에서도) 사용하지 않는 이유는 거의 없습니다.


Aves Engine 의 비디오 프레젠테이션을 기반으로 한 속도에 관해서 는 수천 개의 요소가있을 때 DOM은 실제로 캔버스보다 처리 속도가 빠릅니다. 동의하지 않습니까? 이것이 바뀌 었습니까? 나는 그 비디오를 다시 찾을 수 있으면 좋겠다 ...
Letharion

1
: DI는 Zynga와 Aves를 만든 사람과 함께 일합니다. 작년에 상황이 바뀌었고, 나를 믿어 라 :)
Ivo Wetzel

-1, 게임이 아닌 응용 프로그램에 ~ 100000 개의 dom 요소를 사용하려고 시도했지만 거의 작동하지 않았습니다. 그러나 수천 가지 요소는 문제가되지 않습니다. 매번 업데이트 할 때마다 수천 개의 이미지를 그려도 캔버스가 빠르지는 않습니다.
aaaaaaaaaaaa

@eBusiness 그런 다음 복잡한 Z 순서 및 3D 변환을 소개합니다. 행운을 빕니다 :)
Ivo Wetzel

4
@IvoWetzel 3D를하려면 캔버스가 선택입니다. 그러나 그것은 당신의 대답이 말하는 것이 아니므로 요점이 무엇입니까?
aaaaaaaaaaaa

2

HTML5 게임을 만드는 경우 캔버스가 훨씬 좋습니다. 이유는 다음과 같습니다.

  1. 속도-캔버스를 이미지로 생각하십시오. 당신은 이미지를 그리고 당신이 그린 것을 잊어 버립니다. 이는 DOM 또는 SVG에 비해 성능을 크게 향상시킵니다. DOM 및 SVG 응용 프로그램은 화면에 배치 한 모든 객체를 추적합니다. 즉, 화면에 많은 객체, 특히 오프 스크린 또는 숨겨 짐이있는 레벨이 많으면 어쨌든 그려지고 추적됩니다.
  2. 드로잉 기능-DOM 요소에는 강력한 CSS3 변환이 있지만 캔버스의 기능과 비교할 수는 없습니다. 캔버스는 모든 객체를 그릴 수 있고, 강력한 그라디언트 지원, 3D로 객체를 표시하기위한 플러그인, 필터 등이 있습니다.
  3. 지원-DOM을 사용할 때 변형 또는 애니메이션과 같은 실험적인 기능을 사용하려면 CSS에서 -moz-, -webkit-, -o- 및 -ms- 접두사를 사용해야합니다. 캔버스에서, 당신은 그것에 대해 걱정할 필요가 없습니다. 하나의 기능으로 그리기 만하면됩니다. 캔버스의 다른 지원 관련 장점은 응용 프로그램이 표시되는 방식입니다. 웹 사이트 개발자로서 브라우저 사이의 DOM 표준화가 부족하여 견딜 수 없습니다. 자세한 W3C 사양에도 불구하고 배경, 그라디언트, 변형 등이 브라우저마다 다르게 표시됩니다. 캔버스에서는 배경이 다를 수있는 한 가지 항목 만 실행했습니다. 바둑판 식 배경을 표시 할 때 일부 브라우저는 x 축에서 타일을 0px로 중앙으로 "tile-x"를 사용하고 다른 타일은 타일을 아래로 타일링하는 것처럼 사용합니다.
  4. 라이브러리 및 문서-캔버스로 게임을 만드는 데 필요한 문서에는 수많은 라이브러리가 있습니다. 일부 라이브러리 : CreateJS, paper.js, fabric.js, KineticJS, libCanvas, Processing.js, PlotKit, Rekapi, PhiloGL, InfoViz Toolkit, Frame-Engine, CAKE, Raphaeljs, Tweenjs 등 톤을 더 많이 나열 할 수는 있지만 아무 소용이 없다.

단점-애니메이션-애니메이션을위한 훌륭한 라이브러리가 많이 있지만 CSS3 애니메이션을 좋아합니다. 작성, 조작 및 트리거가 매우 쉽습니다. CSS3 애니메이션이 캔버스를 사용하여 객체와 작동하도록하는 다양한 해킹이 있지만 대부분의 사람들은이 방법을 사용하지 않는 것이 좋습니다.

당신의 게임에 행운을 빕니다.


2

모바일 브라우저, 특히 Android를 대상으로하고 게임에 움직이는 그래픽이 포함 된 경우 DOM 애니메이션을 피하십시오. 안드로이드의 주식 브라우저는 웹킷이지만 쓸모가 없습니다. : 시작하기 전에이 안드로이드 문제 스레드 확인 "브라우저 및 웹보기에서 CSS3 및 자바 스크립트 애니메이션의 끔찍한 렌더링을" .

캔버스 자체는 더 빠르지는 않지만 CocoonJS 와 같이 캔버스 애니메이션에 하드웨어 가속을 호출하는 프레임 워크가 있습니다. 사이트에 비디오에 대한 링크가 있는데 프레임 워크를 사용하여 얻을 수있는 성능 향상을 보여줍니다 (그러나 어떤 이유로 든 둘 이상의 링크를 게시 할 수는 없습니다).


2

간단한 대답 : 캔버스 대체 기능이있는 WebGL.

미묘한 답변 : 게임에 많은 텍스트가있는 경우 HTML 텍스트 레이어를 오버레이하십시오. Pixi.js 는이를 위해 유용한 유용한 추가 기능이 포함 된 전투 강화 디스플레이 프레임 워크입니다.


1

DOM은 문서 객체 모델을 나타냅니다 . 매우 드문 상황에서만 게임을 만드는 데 사용하고 대부분의 경우 캔버스를 선호합니다.

게임에 작은 그래픽 요구 사항이 있더라도 DOM에서 수행하면 성능이 저하됩니다. 테트리스보다 더 많은 것은 아마도 제대로 작동하지 않을 것입니다.

실제 사례가 있습니다. Conway의 Game of Life 구현을 만들 때 셀의 배경색을 변경하여 500x500 테이블로 시작했습니다. 이 버전에서는 글라이더 가 30fps 이상으로 실행되지 않았고, 더 큰 패턴은 거의 1을 넘지 않았습니다.이 게임의 캔버스 버전에서는 더 큰 패턴 (1000 이상의 인구)을 매끄럽게 실행할 수 있습니다. ~ 30fps

또한 SVG (Scalable Vector Graphics) 의 경우에도 마찬가지입니다 . 실제로는 시도하지는 않았습니다.

편집 : 내 예제가 좋지 않다는 것을 인정해야합니다 (테이블이 나쁘기 때문에). 그러나 요점은 여전히 ​​그렇습니다. DOM 조작은 문서를위한 것입니다. 브라우저는 요소를 작업 할 때 CSS를 조회하고 더 많은 메모리를 할당해야합니다. 캔버스보다 빠르다는 것은 실제로 의미가 없습니다.


DOM은 언제부터 성능이 좋지 않습니다. 하드웨어 가속이 아니라 유일한 차이점입니다. 그리고 셀 배경 색상의 500x500 표는 효율적인 DOM 구현되지 않습니다
Raynos

1
@Raynos 나는 그것이 효율적인 DOM 구현이 아니라는 것을 알았습니다. 픽셀을 조작하려면 아무 것도 없습니다.
복사

1
-1, 큰 테이블은 성능을 저하시킵니다. 개별 픽셀을 조작하려는 경우 Canvas가 확실히 더 좋은 도구이지만 DOM 구현이 좋지 않은 경우이를 설정하면 실제로 예제가 의미가 없습니다. 결론적으로 DOM 구현에서 가장 좋은 장면은 필요에 따라 32 개의 서로 다른 배경 이미지가있는 50000 5x1 div입니다.
aaaaaaaaaaaa

@ eBusiness 예, 사람들은 이미 저에게 말했습니다. 너무 나쁘다 나는 그때 스스로 알아 내지 않았다 :-/
copy

@Raynos, DOM은 결코 빠르지 않았습니다. 실제로 canvas의 가장 큰 이유는 DOM이 느리기 때문입니다. 관련 : stackoverflow.com/q/6817093/632951
Pacerier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.