2012-01-19 2 views
4

캔버스 요소에 극도의 확대/축소 기능이있는 게임을 만들려고합니다. 저는 벡터 그래픽이 고성능에서 비트 맵 이미지와 함께 런타임에 프로그래밍 방식으로 생성 될 수 있다는 점에서 이점을 이용하고 싶습니다.HTML 캔버스 요소의 비트 맵과 벡터의 장점 결합 - 어떻게?

내가하고 싶은데 프로그래밍 방식으로 게임 "스프라이트"의 첫 번째 프레임 이미지를 만드는 것입니다 ... 이것은 벡터 이미지가 될 것입니다. 첫 번째 프레임 후에도 이미지를 그리는 데 CPU 사이클을 낭비하고 싶지는 않습니다.이 확대/축소 수준의 비트 맵/고성능 이미지로 캐싱하고 싶습니다.

다음으로 사용자가 20 % 이상 확대하면 더 높은 수준의 세부 벡터 이미지로 이미지를 다시 그립니다. 위에서와 같이이 벡터 이미지는 캐시되고 최적화됩니다.

zoomed out

당신이 여기에서 볼 수 있듯이, 이것은 아주 기본적인 우주선 것 .. 내가 먼저 .. 프로그래밍 벡터로 후 같아요 래스터를 렌더링 것? 목표는 CPU 낭비를 피하는 것입니다.

사용자가 확대되는 경우

...

zoomed in

동일한 형상의 새로운 벡터 이미지 디테일의 훨씬 높은 수준 임에도 불구하고, 그려진 것이다. 기본적으로 Level of Detail 시스템입니다. 이 경우에도 초기 프로그래밍 방식을 적용한 후에 최대 성능을 위해 이미지를 "래스터 화"합니다.

누구나 HTML 캔버스 내부에서 어떤 도구를 사용해야할까요? (나머지 게임은 캔버스 요소 내부에서 실행됩니다.)

대단히 고맙습니다.

** 편집 : SVG를 통해 이미지를 렌더링하는 경로 (프로그래밍 방식)를 추가하고 drawimage()를 사용하여 해당 PNG 파일을 캔버스에 밀어 넣으면 몇 가지 성공을 거둘 수 있을까요? 비슷한 것? 흠 ...

+1

PNG로 변환 할 필요가 없습니다. 대부분의 브라우저는'drawImage'에서 SVG를 받아 들일 것입니다. – robertc

+0

아이디어는 초기 프레임을 SVG로 렌더링 한 다음 재사용 할 수있는 PNG로 변환하는 것입니다. SVG는 실제로 브라우저에서 직접 사용할 수 있지만 모든 프레임을 렌더링 할 경우 훨씬 더 큰 CPU 비용이 발생합니다 ... 일부 브라우저에서는 SVG 이미지의 "비트 맵 캐싱"을 허용합니다. SVG 이미지를 처음 생성 할 때, 크기 나 알파가 변경 될 때까지 비트 맵으로 캐싱됩니다. 그러나이 캐싱에 대해 얼마나 많은 제어 권한이 있는지는 잘 모르겠습니다. 또한 압축 된 PNG에 비해 BMP 이미지가 큽니다. 나중에 다시 사용하도록 PNG를 캐시하고 싶습니다. – Mavorus

답변

1

나는 내 자신의 질문에 대답 할 수 있었다.

이 작업을 수행하는 방법은 먼저 SVG 파일을 만든 다음 "canvg"를 사용하여 클라이언트의 PNG 파일로 변환하는 것입니다. PNG는 원하는 것을 기반으로 다양한 수준의 세부 정보로 만들 수 있습니다. 이렇게하면 동적 LOD 시스템을 만들 수 있습니다.

플래시는 SVG 파일의 비트 맵 이미지를 캐싱하여 자동으로 비슷한 작업을 수행합니다.이 작업을 "사전 렌더링"이라고합니다. SVG의 크기가 조절되지 않았거나 알파가 변경되지 않은 경우 플래시는 대신 비트 맵을 사용합니다 (복잡한 경우 훨씬 빠르게 다음 SVG 파일을 계속 렌더링).PNG 출력의 크기 (따라서 세부 사항)는 원하는대로 수정할 수 있으므로 사전 렌더링은 이벤트를 기반으로 수행 될 수 있습니다.

이 정보에서 사용자가 활발하게 확대/축소 (대상 "스프라이트"조정)하는 동안 SVG가 사용되도록 LOD 시스템을 구현하기로 결정한 다음 줌이 느려짐에 따라 PNG 사전 렌더링 . 또한 매우 높은 줌 레벨에서는 CPU가 SVG를 고해상도로 계산하는 것이 훨씬 쉬우므로 SVG를 사용하고 화면의 대부분을 덮는 비트 맵 이미지를 사용하기 만하면됩니다. (화면에 많은 아이콘을 넣은 HTML5 아이콘 테스트를 살펴보십시오. 아이콘이 클수록 아이콘이 더 느리게 실행됩니다).

많은 분들께 감사 드리며 제 질문/답변이 도움이되기를 바랍니다.

1

당신이 원하는 것을 할 수있는 표준 방법이없는 것 같아 IE에서 실패 할 수도 있습니다.

http://svgopen.org/2010/papers/62-From_SVG_to_Canvas_and_Back/#svg_to_canvas

당신은 아마도 모든 SVG 게임으로 이동하거나 게임 최대 확대 비율을 제공하고 스프라이트 자산으로 큰 이미지를 사용해야합니다. 그것은 플래시를 사용하는 데 문제가되지 않았을 것입니다,하지만 당신은 어쨌든 플래시와 함께 가지 않을 거에요.

아마도 "캔버스 드로잉 시퀀스"로 SVG를 번역 할 수있는 프레임 워크가 있지만 그 경우에는 높은 성능에 내기를 걸지는 않을 것입니다.

관련 문제