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ć?
źródło
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:absolute
do 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 DOMdisplay: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.
źródło
position:absolute
tym, to dobra uwaga.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ć.
źródło
Jeśli tworzysz grę HTML5, płótno jest zdecydowanie lepsze. Dlatego:
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!
źródło
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).
źródło
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.
źródło
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.
źródło