Płótno, czy nie płótno, podczas tworzenia gier opartych na przeglądarce?

14

Tło: Mam rozległe doświadczenie programistyczne, ale ostatni raz kodowałem grę wiele lat temu. Moje umiejętności Javascript są dość ograniczone i zamierzam je ulepszyć, budując prostą grę - Tetris, Pac-man lub coś w tym stopniu złożoności.

Pytanie: Wydaje mi się, że podstawowym wyborem, którego muszę dokonać, jest to, czy powinienem wykonać <canvas>element, czy nie.

W obszarze roboczym mam podstawowe narzędzia do renderowania punktów, linii i bardziej złożonych rzeczy. Przypuszczalnie istnieją lub będą różne ramy, które mogą w tym pomóc.

Bez płótna mogłem przechowywać moje obiekty w drzewie DOM, jak zwykłą stronę internetową, tylko dość złożoną, z wieloma nakładającymi się elementami.

Czy jedno podejście jest lepsze od drugiego? Czy się wykluczają? Skąd mam wiedzieć, który wybrać?

Letharion
źródło

Odpowiedzi:

13

Płótno i DOM nie wykluczają się wzajemnie, chociaż są dość osobne. Jednym dobrym podejściem byłoby renderowanie głównego obszaru gry (np. Spadające elementy w Tetris) za pomocą Canvas i wykonanie całego interfejsu użytkownika (np. Wyświetlanie wyników) z elementami DOM, które nachodzą na element Canvas.

To powiedziawszy, takie podejście nie jest tak naprawdę konieczne w prymitywnej grze, takiej jak Tetris. Płótno przydaje się w przypadku bardziej zaawansowanych efektów graficznych, ale jeśli nie są one wymagane, trzymanie się DOM zapewni szerszą kompatybilność; nie wszystkie przeglądarki obsługują HTML5 Canvas.

jhocking
źródło
3
Szczerze mówiąc, pracując nad grami HTML5 przez ostatni rok jako codzienną pracę, powiedziałbym, że przeglądarka, która nie obsługuje Canvas, nie jest wystarczająco szybka dla żadnej przyzwoitej gry, ale z drugiej strony, nic wolniejszego niż WebKit na telefony z Androidem ... :(
Ivo Wetzel
Dzięki :) Nie dbam zbytnio o „wsparcie przeglądarki”, do czasu, gdy dowiedziałem się, że to ma znaczenie, spodziewam się, że problem sam się rozwiązał. Dotyczy to głównie zabawy i nauki.
Letharion
Robię to również: sama gra jest rysowana na płótnie, podczas gdy GUI składa się z częściowo przezroczystych elementów DOM na górze.
Philipp
@IvoWetzel Tak samo czuję się ... pracujemy też nad grami na platformy mobilne, a Androida
praktycznie nie da się
12

Informacje o DOM
DOM działa całkiem dobrze w oldschoolowych 2D, co oznacza brak obrotu i skalowania obrazu. W rzeczywistości istnieją narzędzia do obu tych zadań, ale nie można liczyć na ich dobre wyniki.

W grze powinieneś polegać na silniku układu przeglądarki w jak najmniejszym stopniu, co oznacza użycie position:absolutedo umieszczania obiektów. Staraj się w miarę możliwości nie tworzyć i nie niszczyć obiektów DOM przez cały czas, jeśli potrzebujesz bardzo zmiennej liczby obiektów, możesz chcieć ustawić pulę bezczynnych elementów DOM display:none, gotową do wskrzeszenia w razie potrzeby.

DOM a płótno
Z udziałem IE8 w rynku kurczenie się płótna staje się coraz bardziej atrakcyjną opcją, dla większości gier jest to prawdopodobnie dobry wybór. Ale w przypadku niektórych zadań DOM jest łatwiejszym w użyciu narzędziem, w razie potrzeby możesz użyć przepływu dokumentów, możesz wychwycić kliknięcia bezpośrednio przez renderowany obiekt, łatwo zintegrować paski przewijania.

Trudno jest pokryć różnicę wydajności, zależy to od zadania i będzie się różnić w różnych przeglądarkach.

aaaaaaaaaaaa
źródło
2
Nie myślałem o position:absolutetym, to dobra uwaga.
jhocking
Czy płótno GPU nie jest przyspieszane na jakimś poziomie, na którym nie ma DOM?
Thomas
1
@Thomas Jedynym miejscem, w którym możesz mieć pewność, że jest przyspieszenie GPU, jest webGL. (Technicznie można to zrealizować bez, ale nie jest to prawdopodobne). Pierwszymi implementacjami płótna 2D były wyłącznie procesory, niektóre funkcje zostały w niektórych przeglądarkach przeniesione na GPU, nie we wszystkich przypadkach ze znacznym wzrostem wydajności. Jeśli chodzi o przyspieszenie GPU DOM, pracują nad tym i nie widzę żadnego konkretnego powodu, aby tak się nie stało. W każdym razie ostatecznie nie ma znaczenia, w jaki sposób robi to przeglądarka, ale jeśli działa wystarczająco dobrze dla Twoich potrzeb, GPU nie zawsze oznacza szybsze.
aaaaaaaaaaaa
Co rozumiesz przez GPU nie zawsze jest szybszy? Na PC może to być prawda, ale na platformach mobilnych wolałbym, aby procesor graficzny renderował więcej, aby procesor miał więcej „cykli” na wykonanie logiki gry, takiej jak AI itp. W ten sposób gra może być bardziej złożona .
Thomas
1
@Thomas To zależy od platformy, pracy i wielu innych rzeczy. Old-school 2D to głównie operacje pamięciowe, utrzymywanie zasobów w pamięci głównej i używanie procesora do tych operacji będzie działać całkiem dobrze, również na telefonie komórkowym, ale próba wykonania operacji na danych znajdujących się w pamięci drugiego procesora jest zabójcą wydajności, więc jeśli pomieszasz operacje, których GPU nie może wykonać z operacjami GPU, albo skończysz wysyłaniem bufora tam i z powrotem w zależności od operacji, albo będziesz miał jeden z procesorów zapisujących w pamięci innych procesorów.
aaaaaaaaaaaa
6

Całkowicie zależy od rodzaju gry, chociaż płótno pasuje do „większości” z nich.

Zarządzanie DOMem staje się okropne w pewnym momencie, im więcej elementów dostajesz wolniej, tym więcej elementów poruszasz się po NIEZWYKLE SPOWOLNIENIU.

Zarządzanie kolejnością ładowania zasobów za pomocą elementów IMG jest ... niebanalne (przechwytywanie błędów celowo uszkodzonych protokołów w znacznikach obrazu: D).

Chociaż w przypadku gier z głównie statycznymi obrazami i niską liczbą efektów nadal wybrałbym DOM. Wszystko inne, płótno jest pierwszym wyborem (wskaż i kliknij, chociaż hitmapy to inna historia).

Obecnie płótno jest tak szybkie (nawet na iPhonie), że nie ma powodu, aby go nie używać.

Ivo Wetzel
źródło
Jeśli chodzi o szybkość, na podstawie prezentacji wideo silnika Avesa , gdy miałeś tysiące elementów, DOM był w rzeczywistości szybszy niż płótno. Nie zgadzasz się Czy to się zmieniło? Chciałbym móc znów znaleźć ten film ...
Letharion
1
: DI pracuję Zynga, z facetem, który stworzył Avesa. Rzeczy zmieniły się w ciągu ostatniego roku, zaufaj mi :)
Ivo Wetzel
-1, próbowałem mieć ~ 100000 elementów dom dla aplikacji innych niż gry, które prawie nie działały. Ale kilka tysięcy elementów nie stanowi problemu. Nie jest tak, że płótno będzie szybkie, jeśli narysujesz do niego wiele tysięcy zdjęć przy każdej aktualizacji.
aaaaaaaaaaaa
@eBusiness Następnie wprowadź skomplikowane zamawianie Z i transformacje 3D. Powodzenia :)
Ivo Wetzel
4
@IvoWetzel Jeśli chcesz robić 3D, płótno jest wyborem. Ale nie tak mówi twoja odpowiedź, więc o co ci chodzi?
aaaaaaaaaaaa
2

Jeśli tworzysz grę HTML5, płótno jest zdecydowanie lepsze. Dlatego:

  1. Szybkość - Pomyśl o płótnie jako obrazie. Rysujesz na obrazie, a następnie zapomina o tym, co narysowałeś. To znacznie zwiększa wydajność w porównaniu do DOM lub SVG. Aplikacje DOM i SVG śledzą każdy obiekt umieszczony na ekranie. Oznacza to, że jeśli masz duży poziom z wieloma obiektami na ekranie, zwłaszcza ukrytymi lub ukrytymi, są one i tak rysowane i śledzone.
  2. Funkcje rysowania - Podczas gdy elementy DOM mają potężne transformacje CSS3, to nic w porównaniu z funkcjami obszaru roboczego. Płótno może narysować dowolny obiekt, mieć potężną obsługę gradientów, wtyczki do wyświetlania obiektów w 3D, filtry itp.
  3. Wsparcie - Podczas korzystania z DOM, gdy chcesz korzystać z eksperymentalnych funkcji, takich jak transformacje lub animacje, musisz używać prefiksów -moz-, -webkit-, -o- i -ms- w CSS. W płótnie nie musisz się tym martwić. Wystarczy narysować za pomocą jednej funkcji i gotowe. Kolejną zaletą płótna związaną z obsługą jest sposób wyświetlania aplikacji. Jako programista strony internetowej brak standaryzacji DOM między przeglądarkami doprowadza mnie do szału. Tła, gradienty, transformacje itp. Wyświetlają się inaczej w różnych przeglądarkach, pomimo szczegółowych specyfikacji W3C. Na płótnie natknąłem się tylko na jedną rzecz, która może być inna - tła. Podczas wyświetlania tła z kafelkami niektóre przeglądarki przyjmują „kafelek x” jako środek kafelka w punkcie 0px na osi x, a inne przyjmują go jako kafelek w dół.
  4. Biblioteki i dokumentacja - W dokumentacji znajduje się mnóstwo wspaniałych bibliotek do tworzenia gier na płótnie. Niektóre biblioteki: CreateJS, paper.js, fabric.js, KineticJS, libCanvas, Processing.js, PlotKit, Rekapi, PhiloGL, InfoViz Toolkit, Frame-Engine, CAKE, Raphaeljs, Tweenjs itp. Mogę wymienić więcej, ale nie ma sensu.

Wada - Animacja - Chociaż istnieje wiele świetnych bibliotek do animacji, uwielbiam animacje CSS3. Są tak łatwe do tworzenia, manipulowania i uruchamiania. Istnieją różne hacki, aby animacje CSS3 działały z obiektami z płótnem, ale podejrzewam, że większość ludzi woli nie używać tej metody.

Życzę powodzenia w grze i mam nadzieję zobaczyć, co stworzysz!

Zoyt
źródło
2

Jeśli rozważasz kierowanie na przeglądarki mobilne, w szczególności na Androida, a gra zawiera ruchomą grafikę, unikaj animacji DOM. Przeglądarka zapasowa w Androidzie jest bezużyteczna, mimo że jest to webkit. Zanim zaczniesz, zapoznaj się z tym tematem dotyczącym Androida: „Straszne renderowanie animacji CSS3 i JavaScript w przeglądarce i WebView” .

Płótno samo w sobie może nie być szybsze, ale istnieją ramy wywołujące przyspieszenie sprzętowe dla animacji płótna, na przykład CocoonJS . Na stronie znajduje się link do filmu wideo, pokazujący wzrost wydajności, który można osiągnąć za pomocą frameworka (z jakiegoś powodu nie mogę publikować więcej niż dwóch linków).

Na Quested Aronsson
źródło
2

Prosta odpowiedź: WebGL z rezerwowym płótnem.

Zróżnicowana odpowiedź: jeśli gra zawiera dużo tekstu, nałóż warstwę tekstową HTML. Pixi.js to zahartowana w bitwie platforma wyświetlania z kilkoma przydatnymi dodatkami, które działają dobrze w tym celu.

d13
źródło
1

Pamiętaj, że DOM oznacza model obiektu dokumentu . Będziesz chciał go używać do tworzenia gier tylko w bardzo rzadkich sytuacjach, a w większości przypadków wolisz płótno.

Nawet jeśli twoja gra ma małe wymagania graficzne, wykonanie jej w DOM będzie miało słabą wydajność; cokolwiek więcej niż Tetris prawdopodobnie będzie źle działać.

Mam przykład z realnego świata: kiedy stworzyłem implementację gry Conwaya Game of Life, zacząłem od stołu 500 x 500, zmieniając kolor tła komórek. W tej wersji Szybowiec nie działał z prędkością większą niż 30 klatek na sekundę, większe wzory dawały prawie nie więcej niż 1. W mojej wersji na płótnie tej gry można teraz płynnie uruchamiać znacznie większe wzorce (liczba ludności 1000 i więcej) przy ~ 30 fps.

Tak też powinno być w przypadku SVG (Scalable Vector Graphics), chociaż nigdy nie próbowałem tego w praktyce.

Edycja : Muszę przyznać, że mój przykład nie jest zbyt dobry (ponieważ tabele = złe). Ale główny punkt jest nadal prawdą: manipulacja DOM dotyczy dokumentów. Przeglądarka musi wyszukać CSS i przydzielić więcej pamięci podczas pracy na elementach. Nie ma sensu być szybszym niż płótno.

Kopiuj
źródło
Od kiedy DOM ma słabą wydajność. Po prostu nie jest przyspieszany sprzętowo, to jedyna różnica. A tabela
500 x 500
1
@Raynos Zauważyłem, że nie jest to skuteczna implementacja DOM. Nie ma żadnych, jeśli chcesz manipulować pikselami.
skopiuj
1
-1, duże stoły to zabójca wydajności. Canvas jest zdecydowanie lepszym narzędziem, jeśli chcesz manipulować pojedynczymi pikselami, chociaż ustawienie go w tak słabej implementacji DOM naprawdę sprawia, że ​​twój przykład jest bezcelowy. Poza biodrem moim najlepszym strzałem w implementację DOM tego byłoby 50000 5x1 div z 32 różnymi obrazami tła zamienionymi w razie potrzeby.
aaaaaaaaaaaa
@eBusiness tak, ludzie już mi mówili. Szkoda, że ​​sam tego nie rozgryzłem: - /
skopiuj
@Raynos, DOM nigdy nie był szybki. W rzeczywistości jednym z głównych powodów płótna jest to, że DOM jest powolny. Powiązane: stackoverflow.com/q/6817093/632951
Pacerier