2010-07-01 11 views
7

Napisałem tę małą grę pod numerem http://amarnus.me/games/dodge. Teraz, jeśli spróbujesz grać w grę zarówno w Firefoksie, jak i w Chrome, zauważysz wyraźnie, że jest znacznie wolniejszy w Firefoksie. Możesz nazwać to niezamierzonym kodem, tak. ;-)Javascript Speed ​​- Chrome v Firefox

Moje pytanie brzmi - czy jest to spowodowane wolniejszym silnikiem JavaScript w przeglądarce Firefox w porównaniu z Chrome? A może ma coś wspólnego ze złym coding? (W mojej obronie jestem nowicjuszem Javascript)

Zakładając, że jest to pierwszy, czy to nie jest punkt przeciwko (wadzie) gier HTML5? (Te, które używają znacznika <canvas>, takiego jak mój)

+2

fajny projekt, btw :) – galambalazs

+0

Wciągająca gra. Poziom 17 z 83 uników w Chrome i poziomem 1 z 0 uników w Firefoksie. Sprawa była tak cholernie powolna w Firefoksie, że musiałem przesunąć pasek. – Anurag

+1

Być może interwał 8ms jest zbyt mały dla .. – galambalazs

Odpowiedz

6

Firefox jest wolniejszy od chrome w javascript. Uważam jednak, że wolniej jest też używać tagu canvas. Prawdopodobnie poprawi się to z FF4 (czy wypróbowałeś wersję beta?).

Istnieje również emulator nes w sieci gdzieś za pomocą js i canvas, i działa w około 30 fps na chrome (jeśli pamiętam o poprawnie), ale tylko około 10 w ff.

Czas jest prawdopodobnie Twoim najlepszym przyjacielem :-P, ale możesz spróbować zoptymalizować.

Wierzę, że gry przeglądarkowe pojawią się na czas, ale nie są jeszcze gotowe do niczego zbyt zaawansowanego. Może o czasie, tj. 12 wyjdzie :-P.

[Edytuj] Btw: Próbowałem gry w FF4b1, i pomyślałem, że działa świetnie. Prawdopodobnie nie tak szybko jak w chromie, ale niedaleko od niego :).

+0

+1 dla komentarza "canvas". Chrome optymalizuje ten element znacznie bardziej niż FF 3. –

+0

Chrome nie "optymalizuje" płótna tak samo jak Firefox. Firefox 4 ma akcelerację GPU, która sprawia, że ​​działa ona jeszcze lepiej niż MSIE 9 w demie akwarium. – itpastorn

+0

Przyspieszanie sprzętowe jest domyślnie wyłączone w FF4b1, zobacz https://wiki.mozilla.org/Platform/GFX/Direct2DDemo, aby je aktywować. –

0

jQuery animate robi coś podobnego do ruchu obiektu DOM.

Chciałbym zajrzeć do ich kodu i zobaczyć, jak robią rzeczywisty ruch, to prawdopodobnie najbardziej skuteczny sposób, ponieważ jest on wbudowany w jQuery.

0

Chrome to designed, aby mieć szybszy silnik JavaScript.

Nie sądzę, że mówi coś o grach HTML5. Zawsze znajdziesz użytkowników z szybszymi lub wolniejszymi ustawieniami niż inni, czy to sprzętem, oprogramowaniem, czy też zwyczajami użytkownika utrzymywania wielu aplikacji jednocześnie. Jeśli twoja gra była napisana w technologii Flash lub Java, wówczas użytkownik z wolniejszym sprzętem zobaczyłby podobne spowolnienie.

Możliwe jest wprowadzenie zmian w kodzie w celu przyspieszenia. Nie zbadałem tego szczegółowo, ale widzę, że masz konstrukcje takie jak if(dodge.goRight == true .... Chociaż nie jest to powolne źródło, wskazuje to na to, że nie zawsze korzystałeś z optymalnego rozwiązania.

+0

Prawdą jest, że V8 działa lepiej niż Tracemonkey w większości testów prędkości, ale myślę, że sformułowanie " zaprojektowany, aby mieć szybszy silnik JavaScript "jest nieco mylący. Napiszę sam komentarz na własny temat, aby wyjaśnić to bardziej szczegółowo. – itpastorn

+0

+1 Dobra analogia. Porównanie ze sprzętem ma dla mnie sens, ale czy jest tak zauważalne? Z drugiej strony zależy to od aplikacji. Hmm .. –

0

Możesz przetestować silnik JavaScript przeglądarki z witryną IE.

http://ie.microsoft.com/testdrive/

one dochodzić do najwyższej prędkości silnika javascript mają z IE9

+0

Czy myślałeś, że to powiedzieliby? (Nie żebym był tym, który zaaprobował) – Yacoby

+0

tutaj jest strona testowa. testuje przeglądarki w tym zakresie. po prostu wejdź na tę stronę z chrome i firefox. Zarzuciłeś jej nie o tych tematach. OK, bez względu na kod – onurbaysan

1

bym winien dużą część z nich na setTimeout i setInterval posiadające minimum ~ 10ms w przeglądarkach takich jak IE i Firefox . Zostało to pierwotnie przyjęte, aby powstrzymać strony przed zużyciem całego procesora, gdyby naiwnie używał 0ms, aby działał tak szybko, jak to możliwe. Chrome został uruchomiony bez limitu, ale teraz jest moving to a 4ms minimum, aby pasował do rekomendacji w HTML5.

John Resig hassomeawesomeposts badanie limitów i dokładności setTimeout.

Przeglądarki Mozilli mogą powiedzieć, jak późno (lub wcześnie!) Działają z każdym wywołaniem setInterval. Sprawdź artykuł setTimeout MDC (google "mdc settimeout" i sprawdź szarą notatkę w sekcji składni).

Oprócz problemów z timerem, Firefox jest generalnie wolniejszy w wykonaniu JS (przynajmniej na razie) i wydaje się, że Skia (grafika Chrome) jest szybsza również przy rasteryzacji.

Nadzieja to pomaga :)

(I pierwotnie miał kilka przydatnych linków, ale to jest mój pierwszy post i filtr spamu klepnął mnie w dół.)

2

W celu uzyskania pomocy można rozważyć zapewniając niezmineralizowaną wersję twojego skryptu.

Widzę, że w kodzie znajduje się 8ms setIntervals. Jak wspomniano powyżej, Firefox nigdy nie przechodzi poniżej 10 ms (jeszcze). Jednak gra w FFox 4 jest bardzo przyjemna. Widziałem dwie bardzo małe hikki, które najwyraźniej zostały spowodowane przez odśmiecanie. Chrome ma przewagę nad Foxem pod tym względem. Mimo że SpiderMonkey (obsługujący GC w Firefoksie) poprawił się dramatycznie z 3,5 do 3.6, to nadal nie jest wystarczająco dobry dla wielu gier. W wersji 4.0 jest o wiele lepszy, ale wciąż nie tak dobry jak w Chrome czy Opera. (Trwają prace nad nim).

Grając w grę i patrząc krótko na twój kod, nie widzę żadnej złożoności, która powodowałaby, że Firefox nie byłby w stanie poradzić sobie z tym, co się dzieje. Również Firefox 4 ma sprzętowo przyspieszone Canvas, które jest marginalnie szybsze niż IE9 i dużo szybsze niż Chrome.

Istnieje w Internecie pogląd, że Chrome jest szybszy niż Gecko, jeśli chodzi o płótno, ale dzieje się tak, ponieważ ludzie rzadko profilują swoje strony. W rzeczywistości płótno w Firefoksie 3.6 jest już co najmniej tak samo szybkie jak w Chrome, ale wiele testów nie pokazuje tego, ponieważ JavaScript jest wolniejszy. (Niektóre testy JavaScript są wolniejsze, ponieważ Firefox nie radzi sobie dobrze z szelkami testowymi.)

Wszystko to prowadzi do wielu nieporozumień i dezinformacji. Najważniejsze jest to, że twoja gra powinna być dobra w Firefoksie 4. Powinieneś zobaczyć, czy jest coś, co możesz zrobić, aby uniknąć wyzwalania niepotrzebnego GC. Na przykład. czy ponownie używasz zmiennych lub tworzysz zbędne nowe?

Jednak w Operze 10.53 nie było to przyjemne. Nie dlatego, że Opera nie nadążała za prędkością, ale zamiast przesuwać dolną część, była nieruchoma, a zamiast niej przesunięto całe boisko. (Mimo to udało mi się przejść na poziom 17 w mojej pierwszej próbie.) W Operze 10.6 strona nie ładuje się poprawnie.

Prawdopodobnie potrzebujesz debugowania kodu - lub może zgłosić błąd do Opery, jeśli jest to regresja. (Będę ćwierkać to aby przyciągnąć ich uwagę.)

+0

Z kodu źródłowego gry: "{if ($. Browser.webkit) {browserName =" Chrome "} else {if ($. Browser.mozilla) {browserName =" Firefox "}}". To sprawia, że ​​kończy się niepowodzeniem z wyjątkiem w Operze, ponieważ nazwa browserName nie jest nigdzie zdefiniowana dla tego przypadku. Napraw to. –

+0

Napraw to za pomocą wykrywania możliwości. Przeglądanie w przeglądarce nie jest potrzebne i zła praktyka. – itpastorn