Apa implikasi yang JIT (javascript / kanvas) vs AOT (Flash) miliki dalam hal kinerja game berbasis browser?

8

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.

Anthony
sumber
2
Kode flash di browser tidak dikompilasi sebelumnya; Flash Player termasuk mesin virtual untuk menafsirkan kode. Satu-satunya platform yang didukung Flash melalui kompilasi AOT adalah iOS.
jhocking

Jawaban:

4

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/

aaaaaaaaaaaa
sumber
Saya benar-benar menggunakan chrome karena alasan persis yang Anda nyatakan di atas, saya hampir melempar pengumpulan sampah ke dalam campuran di atas tetapi ingin tetap fokus pada pertanyaan. Bahkan di chrome, pengumpulan sampah masih menyebabkan perbandingan visual ini dibandingkan dengan flash. Jadi dari perspektif naif - apa solusi untuk masalah ini (selain hanya "pengumpulan sampah yang lebih baik")?
Anthony
@Anthony Lucu, saya tidak melihat masalah ini di Chrome sama sekali, apakah Anda mendapatkan apa pun selain bilah hijau jika Anda menjalankan lagtest saya? Tentu saja Anda selalu dapat menulis sebuah program yang hanya membutuhkan waktu terlalu lama untuk dijalankan di beberapa titik, Anda yakin itu bukan masalahnya?
aaaaaaaaaaaa
FF sangat rapuh selama beberapa tahun terakhir. Tidak yakin apa itu tentang tetapi rilis konstan yang tidak melakukan apa pun kecuali memaksa plug-in penulis untuk beradaptasi / meningkatkan sementara bug serius mendapatkan bau diabaikan seperti tangkas salah diterapkan atau scrum kepada saya. Sayang sekali.
Erik Reppen
3

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.

Erik Reppen
sumber
Saya perlu membaca secara pribadi beberapa terminologi tetapi ini adalah jawaban yang bagus juga.
Anthony
1
Saya pikir saya salah tentang sisi vektornya. Kanvas memang memiliki metode API berbasis vektor yang dimasukkan ke dalamnya. Saya pikir saya salah dikoreksi baru-baru ini oleh seseorang yang baru saja membuat asumsi yang salah tentang fakta bahwa Anda selalu menghasilkan bitmap. Telah membaca Grafis JavaScript O'Reilly's Supercharged di kereta dan saya sangat merekomendasikan.
Erik Reppen
3

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.

Raja Orvid
sumber
Java juga sangat diketik dan berkinerja tinggi ketika Anda melakukan benchmark. Saya masih akan bertaruh pada Node.js devs vs. Java devs dalam kontes kinerja untuk aplikasi web dasar sisi server dengan asumsi tepat di atas tingkat bakat yang biasa-biasa saja. Tipe kuat vs lemah adalah tradeoff desain, bukan jaminan aplikasi Anda akan berjalan lebih cepat ketika diserahkan ke tangan manusia yang melakukan hal-hal bodoh ketika ada lebih banyak kode untuk disulap. Bukannya saya merekomendasikan menulis mesin 3D di JS, Flash, atau Java.
Erik Reppen
0

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.

Galva
sumber
0

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.

zinking
sumber
Sama seperti catatan tambahan, di chrome / ff Anda dapat memaksa akselerasi perangkat keras (webgl), apakah itu dilakukan melalui kode dan / atau pengaturan konfigurasi browser, sedikit keuntungan tersedia. Bagaimanapun asumsi saya adalah implentasi di chrome / ff masih lebih belum matang daripada di IE 9+
Anthony
@Anthony ya, pasti setuju. sekarang beberapa hari di ranah API grafik, DX sedikit melebihi OPENGL, dan tidak ada cara yang chrome atau browser lain dapat lakukan lebih baik daripada IE9, setidaknya untuk periode yang singkat.
zinking