Dalam pengalaman saya, bahkan sampai hari ini, saya masih melihat lebih banyak lag visual dalam gerakan entitas / animasi dalam game berbasis JavaScript (Canvas) daripada yang saya lakukan dalam game berbasis Flash.
Mengapa ini - apa sebenarnya descrepancy pada level paling dasar antara kompiler JIT vs AOT dalam skenario spesifik JavaScript vs Flash.
Jawaban:
Ini bukan metode kompilasi yang membuat game ketinggalan, itu adalah pengumpul sampah, dan pengumpul sampah Flash terpisah dari peramban.
Saya pikir saya dapat dengan cukup percaya diri alasan Anda menjalankan Firefox, karena pengumpul sampah Firefox adalah omong kosong terburuk yang bisa Anda dapatkan, dari sudut pandang permainan. Jika Anda membuka hanya satu tab dan menjalankan permainan JavaScript ringan di dalamnya, biasanya dapat ditoleransi, bahkan mungkin tidak terlalu mencolok. Tetapi jika Anda membuka banyak tab, jalankan sesuatu yang sedikit lebih menuntut atau gunakan Firebug Anda akan dengan mudah mendapatkan lonjakan lag reguler melebihi 100 ms.
Saya belum melakukan pengujian ekstensif untuk sementara waktu, tetapi Chrome selalu melakukannya dengan sangat baik dalam hal ini, dan baik IE9 maupun Safari tampaknya melakukan pekerjaan yang dapat diterima juga.
Saya membuat alat untuk menguji jeda JavaScript, Anda dapat bermain dengannya jika Anda suka: http://ebusiness.hopto.org/lagtest/
sumber
Sulit untuk mengatakan tanpa melihat kode aktual tetapi beberapa poin:
Flash sudah ada lebih lama. Orang yang membuat alat dan pustaka untuk itu memiliki lebih banyak pengalaman menangani animasi. Saya bukan penggemar berat alat-alat dan teknologi eksklusif, tetapi saya tidak akan pernah mengetuk dev ActionScript yang tahu apa yang dia lakukan.
Browser JIT juga relatif baru bagi pengembang JS. Pilihan terbaik untuk perf-intitiatives yang benar-benar terasah masih merupakan sesuatu yang kami pilah sebagai sebuah komunitas. Def fungsi sebaris digunakan untuk menjadi hal bodoh batas yang harus dilakukan dalam banyak kasus. Sekarang ini adalah cara yang bagus untuk meningkatkan perf dalam banyak skenario JIT.
Normalisasi untuk beberapa browser tidak harus tetapi sering mengakibatkan kegagalan untuk mengambil keuntungan penuh dari kemampuan penuh browser yang diberikan.
(sunting: tidak tepat untuk yang satu ini tetapi mungkin masih ada satu titik di sini - Erik) Plug-in Flash ramah vektor dan secara luas dipahami bagaimana memanfaatkannya secara maksimal. Apakah skema pewarisan akan memberi kita banyak manfaat dengan objek konteks kanvas masih harus dilihat tetapi saya ragu itu akan menjadi tingkat kemenangan yang sama dengan yang Anda dapatkan dari vektor.
sumber
Satu hal menarik yang saya terkejut belum ada yang disebutkan adalah perbedaan dalam jenis kompilasi JIT, karena Flash masih dikompilasi JIT, dan, di sebagian besar browser modern, begitu pula JavaScript, namun Flash adalah bahasa yang diketik dengan sangat kuat, yang berarti ada seluruh bidang optimisasi yang dapat dilakukannya (seperti memancarkan panggilan ke metode secara langsung (sesuatu yang tidak dapat dilakukan JavaScript)), yang tidak dapat dilakukan oleh JavaScript karena diketik secara dinamis. Anda dapat mengganti seluruh definisi fungsi dalam JavaScript di titik mana pun yang Anda inginkan, dan definisi baru itulah yang harus disebut. (Masih mungkin bagi JavaScript untuk melakukan panggilan tidak langsung yang tidak akan jauh lebih mahal) Akses lapangan pada suatu bidang sebenarnya adalah contoh yang lebih baik daripada metode panggilan, karena JavaScript bahkan tidak dapat melakukan ini secara tidak langsung,
Perbedaan lain dalam kinerja adalah, seperti yang telah disebutkan, GC. Saya curiga (saya belum memeriksa) bahwa sebagian besar browser menggunakan salah satu penghitungan referensi GC (karena semua memori yang dialokasikan GC untuk sebuah halaman dapat dibebaskan ketika halaman dibiarkan, itu sebenarnya salah satu tempat terbaik untuk menggunakan penghitungan referensi GC ), atau pemindaian GC konservatif (seperti Boehm). Yang terakhir dapat menjadi jauh lebih lambat dari yang sebelumnya jika tidak diterapkan dengan benar. (Boehm adalah contoh implementasi yang tepat) Flash di sisi lain menggunakan GC yang tepat (jauh lebih mudah dilakukan dalam sistem yang sangat diketik). Karena Flash menggunakan GC yang tepat, ia tidak memiliki overhead runtime penghitungan referensi. (yang tidak besar, tetapi masih ada) Contoh yang bagus dari GC yang tepat adalah Mono SGen, yang juga memadatkan tumpukan.
Kemudian muncul fakta bahwa JavaScript tidak dirancang dengan animasi dalam pikiran. (seperti yang juga disebutkan) Sejauh yang saya tahu, tidak ada browser yang akan memancarkan instruksi gaya-SSE untuk loop animasi, di mana-sebagai fungsi rendering inti dalam Flash mungkin telah dioptimalkan untuk kinerja puncak. (di beberapa tempat ditulis dalam rakitan mentah)
Semua-dalam semua, itu datang ke fakta bahwa bahasa yang dinamis akan selalu lebih lambat daripada yang diketik secara statis jika harus dikompilasi tepat waktu sehingga tidak membuat pengguna mengeluh tentang kelambatan itu.
sumber
IMHO perbedaan itu berasal dari kenyataan bahwa Flash dibangun dari tanah untuk melakukan hal itu, animasi. Flash menerapkan (walaupun buruk oleh penilaian utama) teknik untuk visualisasi yang lebih halus berjalan secara default, ketika di JS Anda perlu membuat implementasi tersebut secara manual.
Ada contoh implementasi hebat JS / Canvas yang berjalan lebih baik daripada kebanyakan game Flash yang saya lihat. Semuanya datang ke pengembang membuat mereka.
sumber
selain dari GC, aspek JIT dari teknologi ini, ada kesenjangan antara penggunaan perangkat keras.
dalam versi terbaru dari flash player, flash telah mulai menggunakan akselerasi perangkat keras untuk merender gambar-gambar itu, yang membuat proses rendering lebih cepat dan kualitas lebih baik. sementara di sisi lain, game berbasis JS di beberapa browser (FF, CHROME) belum dimulai. Namun ada satu pengecualian, browser IE9 telah mulai mendesain ulang dari lapisan abstraksi perangkat keras, browser dari IE9 telah membuat kemajuan luar biasa dalam memanfaatkan akselerasi perangkat keras, sehingga grafis rendering pada browser ini jelas lebih baik dan lebih cepat daripada browser lain.
sumber