Do powiązanych dodaję js1k.com - serwis pasjonatów, którzy tworzą duże ilości takich dem, niektóre równie (lub nawet bardziej) widowiskowe, np: http://js1k.com/2012-love/demo/1100
@janusz-korwin-mikke: Generalnie jest to śmieszna kompresja kodu z użyciem PNG :) Kod JS został spakowany tradycyjnym packerem, następnie skonwertowany do kodu bajtowego i zapisany jako grafika PNG. PNG ma w siebie wbudowaną kompresje ZIP. Potem koleś tą krótką funkcją odczytuje ten PNG, i czyta piksele których wartości RGB są po prostu kolejnymi znakami kodu JS. Tak rozpakowany JS się wykonuje za pomocą eval :). Do zawodów 1k idealne, ale w praktyce
A myślałem że znam JS. Ok, niby wiem że można pakować rzeczy w PNG itd, ale to... dewastuje trochę. Szczególnie biorąc pod uwagę rozmiar. Zrobiłem (dożo) prostsze demko to miało jakieś 10k. A PNG wcale tak rewelacyjnie nie pakuje.
@rezoner: PNG >= ZIP, bo w PNG mozna jeszcze uzywac roznych filtrow aby zoptymalizowac kompresje (ale zazwyczaj programistom nie chce sie tego implementowac wiec 99.9% obrazkow PNG to naglowek + "zip" )
Chyba jednak nie chodzi o szybkość dostępu do zmiennych globalnych. Podejrzewam, że chodzi o sposób wywołania eval. Jeżeli użyjesz eval() to musi on rozwinąć zasięg, w którym został wywołany oraz wszystkie nadrzędne, kończąc na globalnym. Musi "widzieć" wszystkie zmienne zdefiniowane po drodze, w kolejnych zagnieżdżeniach. Widocznie na to zużywa dużo czasu. Jeżeli wykonasz go pośrednio jako (1,eval)(), to jest on wykonany od razu w zasięgu globalnym, pomimo że
bo ja wiem czy taki hack?fajny fajny ale nie takie możliwości są obecnie.... przypomina mi to demoscenę z czasów amigowych - świetne czasy gdzie cuda się upychało w demka 4KB lub 64KB :)
Komentarze (109)
najlepsze
(1,eval)(e)
a nie po prostu:
eval(e)
?
Co ciekawe - po tej zmianie wszystko działa tak samo, ale strona wczytuje się dużo dłużej :|
Chyba jednak nie chodzi o szybkość dostępu do zmiennych globalnych. Podejrzewam, że chodzi o sposób wywołania eval. Jeżeli użyjesz eval() to musi on rozwinąć zasięg, w którym został wywołany oraz wszystkie nadrzędne, kończąc na globalnym. Musi "widzieć" wszystkie zmienne zdefiniowane po drodze, w kolejnych zagnieżdżeniach. Widocznie na to zużywa dużo czasu. Jeżeli wykonasz go pośrednio jako (1,eval)(), to jest on wykonany od razu w zasięgu globalnym, pomimo że
Dostęp do zmiennych w zasięgu globalnym jest szybszy.
To jest dużo lepsze.
Komentarz usunięty przez moderatora
O co chodzi w tym znalezisku?