cari
Rumahhujung hadapan webTutorial H5Perbincangan ringkas tentang menggunakan cache untuk mengoptimumkan prestasi kemahiran tutorial HTML5 Canvas program_html5

Selepas anda terlalu banyak bermain dengan kanvas, anda secara automatik akan mula mempertimbangkan isu prestasi. Bagaimana untuk mengoptimumkan animasi kanvas?

【Gunakan cache】

Menggunakan cache bermakna menggunakan kanvas luar skrin untuk pra-perenderan Prinsipnya sangat mudah, iaitu, mula-mula lukis ke dalam kanvas luar skrin, dan kemudian lukiskan kanvas luar skrin ke dalam kanvas utama melalui drawImage. Ramai orang mungkin salah faham tentang ini. Bukankah ini mekanisme penimbal berganda yang banyak digunakan dalam permainan?

Sebenarnya, mekanisme penimbalan berganda digunakan dalam pengaturcaraan permainan untuk mengelakkan kelipan skrin Oleh itu, akan ada kanvas yang dipaparkan di hadapan pengguna dan kanvas latar belakang apabila melukis, kandungan skrin akan dilukis terlebih dahulu kanvas latar belakang, dan kemudian kanvas latar belakang akan dilukis Data dalam kanvas dilukis ke kanvas hadapan. Ini ialah penimbalan berganda, tetapi tiada penimbalan berganda dalam kanvas, kerana pelayar moden pada asasnya mempunyai mekanisme penimbalan berganda terbina dalam. Oleh itu, menggunakan kanvas luar skrin bukanlah penimbalan berganda, tetapi menganggap kanvas luar skrin sebagai kawasan cache. Data skrin cache yang perlu dilukis berulang kali untuk mengurangkan penggunaan memanggil API kanvas.

Seperti yang kita semua tahu, memanggil API kanvas menggunakan prestasi Oleh itu, apabila kami ingin melukis beberapa data skrin berulang, penggunaan kanvas luar skrin yang betul boleh meningkatkan prestasi anda dengan ketara

1. Tiada cache digunakan

 2. Cache digunakan tetapi lebar dan ketinggian kanvas luar skrin tidak ditetapkan

3. Cache digunakan tetapi lebar dan ketinggian kanvas luar skrin tidak ditetapkan

 4. Gunakan caching dan tetapkan lebar dan tinggi kanvas luar skrin

Anda dapat melihat bahawa prestasi DEMO di atas adalah berbeza Mari kita analisa sebab di bawah: Untuk mencapai gaya setiap bulatan, saya menggunakan lukisan gelung semasa melukis bulatan Jika caching tidak didayakan, apabila bilangan bulatan pada halaman Apabila ia mencapai titik tertentu, sebilangan besar panggilan API kanvas diperlukan untuk setiap bingkai animasi, dan sejumlah besar pengiraan diperlukan, supaya tidak kira betapa baiknya penyemak imbas, ia akan dibawa turun.
Kod XML/HTMLSalin kandungan ke papan keratan

  1. ctx.save();   
  2.                         var j=0;   
  3.                          ctx.lineWidth = borderWidth;   
  4.                          untuk(var i=1;i;iini.r;i =borderWidth){   
  5.                             ctx.beginPath();   
  6.                             ctx.strokeStyle = warna ini.   
  7.                             ctx.arc(this.x , this.y , i , 0 , 2*Math.PI);   
  8.                             ctx.stroke();   
  9.                             j ;   
  10.                         }   
  11.                         ctx.restore();  
  所以,我的方法很简单,每个圈圈对象里面给他一个离屏kanvas作缓存区。

  除了创建离屏kanvas作为缓存之外,下面的代码中有一点很关键,就是福箺高度,kanvas生成后的默认大小是300X150;对于我的代码中每个缓存起来圈圈对象半径最大也就不超过80,所以300X150的大小明显会造成很多琺定白,所以300X150。费,所以就要设置一下离屏canvas的宽度和高度,让它跟缓存起来的元素大小一致,这样也有利于提高动画性能。上面的四个demo很明显的显示出了性能差距,如月家家面超过400个圈圈对象时就会卡的不行了,而设置了宽高1000个圈圈对象也不觉得卡。


Kod XML/HTML
复制内容到剪贴板
  1. var bola = fungsi(x , y , vx , vy , useCache){   
  2.                 ini.x = x;   
  3.                 ini.y = y;   
  4.                 ini.vx = vx;   
  5.                 ini.vy = vy;   
  6.                 ini.r = getZ(getRandom(20,40));   
  7.                 warna ini = [];   
  8.                 this.cacheCanvas = dokumen.createElement("canvas");   
  9.                 inithis.cacheCtx = this.cacheCanvas.getContext("2d");   
  10.                 this.cacheCanvas.width = 2*this.r;   
  11.                 this.cacheCanvas.height = 2*this.r;   
  12.                 var bilangan = getZ(this.r/borderWidth);   
  13.                  untuk(var j=0;jbilangan;j ){   
  14.                     this.color.push("rgba(" getZ(getRandom(0,255)) "," getZ(getRandom(0,255)) "," getZ(getRandom(0,255)) ",1)");   
  15.                 }   
  16.                 this.useCache = useCache;   
  17.                 jika(useCache){   
  18.                     this.cache();   
  19.                 }   
  20.             }  

Apabila saya membuat instantiat objek bulatan, saya terus memanggil kaedah cache dan melukis bulatan kompleks terus ke dalam kanvas luar skrin objek bulatan dan menyimpannya.

Kod XML/HTMLSalin kandungan ke papan keratan
  1. cache:function(){
  2. this.cacheCtx.save();
  3. var j=0;
  4. this.cacheCtx.lineWidth = borderWidth; untuk(var
  5. i
  6. =1;iini.r;i =borderWidth){ this.cacheCtx.beginPath();
  7.  
  8. ini
  9. this.cacheCtx.strokeStyle = this.color[j]; this.cacheCtx.arc(this.r, this.r, i, 0, 2*Math.PI );
  10. this.cacheCtx.stroke();
  11. j ;
  12.                                                                       
  13. this.cacheCtx.restore();
  14.                                                                                    
  15. Kemudian dalam animasi seterusnya, saya hanya perlu melukis kanvas luar skrin objek bulatan ke dalam kanvas utama dengan cara ini, canvasAPI yang dipanggil dalam setiap bingkai hanya mempunyai ayat ini:
  16. Kod XML/HTML
  17. Salin kandungan ke papan keratan

ctx.drawImage(this.cacheCanvas , this.x-this.r , this.y-this.r); Berbanding dengan lukisan gelung sebelumnya, ia adalah lebih pantas. Oleh itu, apabila kita perlu berulang kali melukis grafik vektor atau melukis berbilang gambar, kita boleh menggunakan kanvas luar skrin secara munasabah untuk menyimpan data gambar terlebih dahulu, yang boleh mengurangkan banyak penggunaan prestasi yang tidak diperlukan dalam setiap bingkai berikutnya.
Kod versi lancar untuk 1000 objek bulatan disiarkan di bawah:
     
  1. Kod XML/HTML
  2. Salin kandungan ke papan keratan
  1. html>  
  2. html lang="en" >  
  3. kepala>  
  4.     meta charset="UTF- 8">  
  5.     gaya>  
  6.         badan{   
  7.             padding:0;   
  8.             margin:0;   
  9.              limpahan: tersembunyi;   
  10.         }   
  11.         #cas{   
  12.             paparan: sekat;   
  13.             warna latar belakang:rgba(0,0,0,0);   
  14.             margin:auto;   
  15.             sempadan:1px pepejal;   
  16.         }
  17.  gaya> 
  18.  tajuk>Ujiantajuk>
  19. kepala>
  20. badan>
  21. div >
  22.  kanvas id='cas' lebar="800" tinggi="600">Pelayar tidak menyokong kanvaskanvas > ;
  23.  div gaya="teks- align:center">1000 objek bulatan tidak tersekatdiv>
  24.  div> 
  25.  skrip> 
  26. var testBox = fungsi(){
  27. var kanvas = dokumen.getElementById("cas"),
  28. ctx = kanvas.getContext('2d'),
  29.  lebar sempadan = 2,
  30. Bola = [];
  31. var bola = fungsi(x, y, vx, vy, useCache){
  32.  ini.x = x;
  33.  
  34. ini.y = y
  35.  
  36. ini.vx = vx
  37.                 ini.vy = vy;   
  38.                 ini.r = getZ(getRandom(20,40));   
  39.                 warna ini = [];   
  40.                 this.cacheCanvas = dokumen.createElement("canvas");   
  41.                 inithis.cacheCtx = this.cacheCanvas.getContext("2d");   
  42.                 this.cacheCanvas.width = 2*this.r;   
  43.                 this.cacheCanvas.height = 2*this.r;   
  44.                 var bilangan = getZ(this.r/borderWidth);   
  45.                  untuk(var j=0;jbilangan;j ){   
  46.                     this.color.push("rgba(" getZ(getRandom(0,255)) "," getZ(getRandom(0,255)) "," getZ(getRandom(0,255)) ",1)");   
  47.                 }   
  48.                 this.useCache = useCache;   
  49.                 jika(useCache){   
  50.                     this.cache();   
  51.                 }   
  52.             }  
  53.   
  54.             fungsi getZ(num){   
  55.                 var dibundarkan;   
  56.                 bulat = (0.5   bilangan) | 0;   
  57.                 // A double bitwise bukan.   
  58.                 bulat = ~~ (0.5   bilangan);   
  59.                 // Akhir sekali, anjakan bitwise ke kiri.   
  60.                 bulat = (0.5   bilangan)  🎜>0
  61. ;   
  62.   
  63.                 kembali bulat;   
  64.             }  
  65.   
  66.             bola.prototaip = {   
  67.                 paint:function(ctx){   
  68.                     jika(!this.useCache){   
  69.                         ctx.save();   
  70.                         var j=0;   
  71.                          ctx.lineWidth = borderWidth;   
  72.                          untuk(var i=1;i;iini.r;i =borderWidth){   
  73.                             ctx.beginPath();   
  74.                             ctx.strokeStyle = warna ini.   
  75.                             ctx.arc(this.x , this.y , i , 0 , 2*Math.PI);   
  76.                             ctx.stroke();   
  77.                             j ;   
  78.                         }   
  79.                         ctx.restore();   
  80.                     } lain{   
  81.                          ctx.drawImage(this.cacheCanvas , this.x-this.r , this.y-this.r);   
  82.                     }   
  83.                 },   
  84.   
  85.                 cache:function(){   
  86.                     this.cacheCtx.save();   
  87.                     var j=0;   
  88.                     this.cacheCtx.lineWidth = borderWidth;   
  89.                     untuk(var i=1;i< 🎜>ini.r;i =borderWidth){   
  90.                         this.cacheCtx.beginPath();   
  91.                          
  92. inithis.cacheCtx.strokeStyle = this.color[j];   
  93.                         this.cacheCtx.arc(this.r , this.r , i , 0 , 2*Math.PI);   
  94.                         this.cacheCtx.stroke();   
  95.                          j ;   
  96.                     }   
  97.                     this.cacheCtx.restore();   
  98.                 },   
  99.   
  100.                 move:function(){   
  101.                     ini.x  = ini.vx;   
  102.                     ini.y  = ini.vy;   
  103.                     jika(ini.x
  104. >(canvas.width-this.r)||ini.xini.r){                             
  105. ini
  106. ini.x=ini.x 🎜>?this.r:(kanvas.width-this.r);                             
  107. ini.vx
  108.  = -ini.vx;                        }  
  109.                     jika(this.y>(canvas.height-this.r)||this.yini.r){   
  110.                          
  111. iniini.y=ini.ythis.y 🎜>?this.r:(canvas.height-this.r);   
  112.                          
  113. ini.vy = -ini.vy;   
  114.                     }   
  115.   
  116.                     ini.cat(ctx);   
  117.                 }   
  118.             }   
  119.   
  120.             var 
  121. Permainan = {   
  122.                 init:function(){   
  123.                     untuk(var 
  124. i=0;i< 🎜>1000;i ){                             var 
  125. b
  126.  = baharu bola(get Random(0,) can .height), , getRandom(-10 , 10) ,  getRandom(-10 , 10) , true)                            Bola.tolak(b);   
  127.                     }   
  128.                 },   
  129.   
  130.                 kemas kini:function(){   
  131.                     ctx.clearRect(0,0,canvas.width,canvas.height);   
  132.                     untuk(var 
  133. i
  134. =0;i< 🎜>Bola.panjang;i ){                            Bola[i].move();   
  135.                     }   
  136.                 },   
  137.   
  138.                 gelung:function(){   
  139.                     var _ini = ini;   
  140.                     ini.kemas kini();   
  141.                     RAF(function(){   
  142.                         _this.loop();   
  143.                     })   
  144.                 },   
  145.   
  146.                 mula:function(){   
  147.                     ini.init();   
  148.                     this.loop();   
  149.                 }   
  150.             }   
  151.   
  152.             tetingkap.RAF = (fungsi(){   
  153.                 return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || fungsi (panggilan balik) {window.setTimeout(panggilan balik, 1000 / 60); };   
  154.             })();   
  155.   
  156.             permainan kembali;   
  157.         }();   
  158.   
  159.         fungsi getRandom(a , b){   
  160.             kembali Math.random()*(b-a) a;   
  161.         }   
  162.   
  163.         window.onload = fungsi(){   
  164.             testBox.start();   
  165.         }   
  166.     skrip>  
  167. badan>  
  168. html>  

Terdapat satu lagi nota tentang kanvas luar skrin Jika kesan yang anda lakukan ialah membuat dan memusnahkan objek secara berterusan, sila gunakan kanvas luar skrin dengan berhati-hati Sekurang-kurangnya jangan mengikat atribut setiap objek seperti yang saya tulis di atas. Tetapkan kanvas luar skrin.

Kerana jika diikat seperti ini, apabila objek dimusnahkan, kanvas luar skrin juga akan dimusnahkan, dan sejumlah besar kanvas luar skrin sentiasa dicipta dan dimusnahkan, yang akan menyebabkan penimbal kanvas menggunakan banyak sumber GPU dan mudah menyebabkan penyemak imbas Ranap atau membekukan bingkai yang serius. Penyelesaiannya adalah untuk mencipta tatasusunan kanvas luar skrin, pramuat bilangan kanvas luar skrin yang mencukupi, cache hanya objek yang masih hidup dan nyahcachenya apabila objek dimusnahkan. Ini tidak akan menyebabkan kanvas luar skrin dimusnahkan.

【Gunakan requestAnimationFrame】

Saya tidak akan menerangkan perkara ini secara terperinci, saya rasa ramai orang tahu bahawa ini adalah gelung terbaik untuk animasi, bukan setTimeout atau setInterval. Siarkan secara langsung kaedah penulisan keserasian:

Kod XML/HTMLSalin kandungan ke papan keratan
  1. tetingkap.RAF = (fungsi(){
  2. Kembalikan tetingkap.requestAnimationFrame ||. tetingkap.webkitRequestAnimationFrame ||.
  3. })();

 

【Elakkan operasi titik terapung】

Walaupun JavaScript menyediakan beberapa kaedah pembundaran yang sangat mudah, seperti Math.floor, Math.ceil dan parseInt, rakan asing telah melakukan ujian dan kaedah parseInt melakukan beberapa kerja tambahan (seperti mengesan sama ada data adalah nilai yang sah, parseInt malah menukar parameter kepada rentetan terlebih dahulu!), jadi menggunakan parseInt secara langsung adalah lebih intensif prestasi Jadi bagaimana untuk membulatkan, anda boleh terus menggunakan kaedah yang sangat bijak yang ditulis oleh orang asing:

    Kod JavaScriptSalin kandungan ke papan keratan

    1.bulat = (0.5 somenum) | 2.bulat = ~~ (0.5 somenum);

    Jika anda tidak memahami pengendali, anda boleh klik di sini:

    http://www.w3school.com.cn/js/pro_js_operators_bitwise.asp Terdapat penjelasan terperinci di dalam

     
【Kurangkan panggilan canvasAPI sebanyak mungkin】
Apabila membuat kesan zarah, cuba gunakan bulatan sesedikit mungkin dan sebaiknya gunakan segi empat sama Kerana zarahnya terlalu kecil, segi empat sama kelihatan seperti bulatan. Mengenai sebabnya, ia mudah difahami. Kita memerlukan tiga langkah untuk melukis bulatan: mula-mula beginPath, kemudian gunakan lengkok untuk melukis lengkok, dan kemudian gunakan isian untuk mengisinya untuk menghasilkan bulatan. Tetapi untuk melukis segi empat sama, anda hanya memerlukan satu fillRect. Walaupun hanya terdapat perbezaan dua panggilan, apabila bilangan objek zarah mencapai tahap tertentu, jurang prestasi akan muncul.

Terdapat beberapa perkara lain yang perlu diberi perhatian, saya tidak akan menyenaraikan semuanya kerana terdapat beberapa perkara di Google. Ini boleh dianggap sebagai rekod untuk diri saya sendiri, terutamanya untuk merekodkan penggunaan cache. Jika anda ingin meningkatkan prestasi kanvas, perkara yang paling penting ialah memberi perhatian kepada struktur kod, mengurangkan panggilan API yang tidak perlu, mengurangkan operasi kompleks dalam setiap bingkai, atau menukar operasi kompleks daripada sekali untuk setiap bingkai kepada sekali untuk beberapa bingkai. Pada masa yang sama, untuk penggunaan cache yang disebutkan di atas, untuk kemudahan, saya menggunakan kanvas luar skrin untuk setiap objek Malah, kanvas luar skrin tidak boleh digunakan terlalu banyak Jika anda menggunakan terlalu banyak kanvas luar skrin akan menjadi masalah prestasi. Sila cuba yang terbaik menggunakan kanvas luar skrin.

Alamat kod sumber:

https://github.com/whxaxes/canvas-test/tree/gh-pages/src/Other-demo/cache

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Dekonstruktur Kod H5: Tag, Elemen, dan AtributDekonstruktur Kod H5: Tag, Elemen, dan AtributApr 18, 2025 am 12:06 AM

Kod HTML5 terdiri daripada tag, elemen dan atribut: 1. Tag mentakrifkan jenis kandungan dan dikelilingi oleh kurungan sudut, seperti. 2. Unsur terdiri daripada tag permulaan, kandungan dan tag akhir, seperti kandungan. 3. Atribut menentukan pasangan nilai utama dalam tag permulaan, meningkatkan fungsi, seperti. Ini adalah unit asas untuk membina struktur web.

Memahami Kod H5: Asas HTML5Memahami Kod H5: Asas HTML5Apr 17, 2025 am 12:08 AM

HTML5 adalah teknologi utama untuk membina laman web moden, menyediakan banyak elemen dan ciri -ciri baru. 1. HTML5 memperkenalkan unsur -unsur semantik seperti, dan lain -lain, yang meningkatkan struktur laman web dan SEO. 2. Sokongan unsur multimedia dan menanamkan media tanpa pemalam. 3. Borang meningkatkan jenis input baru dan sifat pengesahan, memudahkan proses pengesahan. 4. Menawarkan fungsi storan luar talian dan tempatan untuk meningkatkan prestasi laman web dan pengalaman pengguna.

Kod H5: Amalan Terbaik untuk Pemaju WebKod H5: Amalan Terbaik untuk Pemaju WebApr 16, 2025 am 12:14 AM

Amalan terbaik untuk kod H5 termasuk: 1. Gunakan pengisytiharan dan pengekodan watak yang betul; 2. Gunakan tag semantik; 3. Mengurangkan permintaan HTTP; 4. Gunakan pemuatan asynchronous; 5. Mengoptimumkan imej. Amalan ini dapat meningkatkan kecekapan, penyelenggaraan dan pengalaman pengguna halaman web.

H5: Evolusi piawaian dan teknologi webH5: Evolusi piawaian dan teknologi webApr 15, 2025 am 12:12 AM

Piawaian dan teknologi web telah berkembang dari HTML4, CSS2 dan JavaScript mudah setakat ini dan telah menjalani perkembangan yang ketara. 1) HTML5 memperkenalkan API seperti kanvas dan webstorage, yang meningkatkan kerumitan dan interaktiviti aplikasi web. 2) CSS3 menambah fungsi animasi dan peralihan untuk menjadikan halaman lebih berkesan. 3) JavaScript meningkatkan kecekapan pembangunan dan kebolehbacaan kod melalui sintaks moden node.js dan ES6, seperti fungsi anak panah dan kelas. Perubahan ini telah mempromosikan pembangunan pengoptimuman prestasi dan amalan terbaik aplikasi web.

Adakah H5 adalah singkat untuk HTML5? Meneroka butiranAdakah H5 adalah singkat untuk HTML5? Meneroka butiranApr 14, 2025 am 12:05 AM

H5 bukan sekadar singkatan HTML5, ia mewakili ekosistem teknologi pembangunan web moden yang lebih luas: 1. H5 termasuk HTML5, CSS3, JavaScript dan API dan Teknologi yang berkaitan; 2. Ia menyediakan pengalaman pengguna yang lebih kaya, interaktif dan lancar, dan boleh berjalan dengan lancar pada pelbagai peranti; 3. Menggunakan timbunan teknologi H5, anda boleh membuat laman web responsif dan fungsi interaktif yang kompleks.

H5 dan HTML5: Istilah yang biasa digunakan dalam pembangunan webH5 dan HTML5: Istilah yang biasa digunakan dalam pembangunan webApr 13, 2025 am 12:01 AM

H5 dan HTML5 merujuk kepada perkara yang sama, iaitu HTML5. HTML5 adalah versi kelima HTML, membawa ciri -ciri baru seperti tag semantik, sokongan multimedia, kanvas dan grafik, penyimpanan luar talian dan penyimpanan tempatan, meningkatkan ekspresi dan interaktiviti laman web.

Apa yang dirujuk oleh H5? Meneroka konteksApa yang dirujuk oleh H5? Meneroka konteksApr 12, 2025 am 12:03 AM

H5referstohtml5, apivotaltechnologyinwebdevelopment.1) html5introducesnewelementsandapisforrich, dynamicwebapplications.2) itsupp ortsmultimediawithoutplugins, enhancusexperienceaceacrossdevices.3) SemantikelementsImproveContentstructureandseo.4) H5'srespo

H5: Alat, Rangka Kerja, dan Amalan TerbaikH5: Alat, Rangka Kerja, dan Amalan TerbaikApr 11, 2025 am 12:11 AM

Alat dan kerangka yang perlu dikuasai dalam pembangunan H5 termasuk Vue.js, React dan Webpack. 1.vue.js sesuai untuk membina antara muka pengguna dan menyokong pembangunan komponen. 2. Leact mengoptimumkan rendering halaman melalui DOM maya, sesuai untuk aplikasi yang kompleks. 3.WebPack digunakan untuk pembungkusan modul dan mengoptimumkan beban sumber.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).