Sistem pengelolaan render memberi tahu perender kapan harus merender ulang blok. Hal ini memastikan bahwa saat blok diubah (misalnya, nilai kolom ditetapkan, atau input ditambahkan), bentuk blok akan diperbarui agar cocok.
Kapan harus melakukan perawatan
Anda perlu berinteraksi dengan sistem ini jika Anda:
- Menambahkan metode ke Blockly yang mengubah bentuk blok.
- Menambahkan metode ke Blockly yang mengandalkan informasi ukuran atau posisi yang diperbarui tentang blok.
Cara kerjanya
Buat antrean secara otomatis. Setiap kali blok diubah, Blockly "queues" a {i>rendered<i} untuk blok tersebut. Beberapa contoh modifikasi yang mengantrekan render adalah:
- Menetapkan nilai kolom
- Menambahkan atau menghapus input
- Menyambungkan atau memutuskan sambungan blok turunan
Buat set. Saat blok dimasukkan ke dalam antrean, sistem pengelolaan render akan menambahkannya, dan semua blok induknya, ke kumpulan blok yang perlu dirender ulang.
Minta telepon balik. Kemudian sistem pengelolaan render meminta menggunakan
requestAnimationFrame
. Callback ini mendapatkan dipanggil oleh browser kanan sebelum frame saat ini digambar.Render ulang set (sebagai hierarki). Saat callback
requestAnimationFrame
dipanggil, sistem pengelolaan render merender setiap blok dalam kumpulan dari blok daun ke blok root. Hal ini memastikan bahwa blok turunan memiliki informasi ukuran yang akurat sebelum blok induknya dirender sehingga blok induk dapat meluas di sekitar turunannya.
Mengapa cara ini bekerja?
Menunggu untuk merender ulang blok hingga tepat sebelum frame saat ini digambar memungkinkan sistem pengelolaan render untuk menghapus duplikat permintaan rendering. Jika blok selalu dirender dengan segera, blok yang sama mungkin tidak perlu dirender beberapa kali berturut-turut. Sebagai gantinya, permintaan render dikelompokkan, dan setiap blok yang diubah hanya digambar sekali di akhir frame, setelah statusnya selesai. Penghapusan duplikasi operasi rendering membuat Blockly jauh lebih efisien.
Misalnya, menyisipkan satu blok di antara dua blok lainnya akan mengantrekan 11 rendering, tetapi hanya 3 yang benar-benar terjadi (satu untuk setiap blok). Peningkatan performa ini 3,6 kali lipat.
Cara menggunakannya
Biasanya Anda tidak perlu memperhatikan sistem manajemen {i>render<i}, karena bekerja secara otomatis ketika Anda memodifikasi blok. Tetapi ada beberapa kasus di mana Anda harus berinteraksi dengannya secara langsung.
Render antrean
Jika menambahkan metode baru ke Blockly yang akan memperbarui bentuk
blok, Anda harus memanggil BlockSvg.prototype.queueRender
untuk mengantrekan rendering
blok.
Tunggu hingga render selesai
Jika menambahkan metode baru ke Blockly yang memerlukan informasi ukuran atau
pemosisi yang diperbarui tentang blok, Anda harus menunggu
promise renderManagement.finishQueuedRenders()
. Promise ini di-resolve setelah
render yang diantrean selesai, atau langsung jika tidak ada render yang diantrean.
import * as renderManagement from './renderManagement.js';
function async myNewMethod() {
block.somethingThatModifiesTheShape();
// Await the promise.
await renderManagement.finishQueuedRenders();
myThingThatReliesOnPositioningInfo();
}
Pemicu proses render yang diantrekan segera dipicu
Jika Anda menambahkan metode baru ke Blockly yang memerlukan pembaruan ukuran atau
informasi posisi tentang blok, dan Anda tidak bisa menunggu sampai
agar setiap {i>render<i} selesai, Anda bisa memanggil
renderManagement.triggerQueuedRenders
untuk memaksa proses render apa pun yang diantrekan
segera.
import * as renderManagement from './renderManagement.js';
function async myNewMethod() {
block.somethingThatModifiesTheShape();
// Trigger an immediate render.
renderManagement.triggerQueuedRenders();
myThingThatReliesOnPositioningInfo();
}
Secara umum, Anda tidak ingin melakukannya karena performanya kurang baik. Itu hanya diperlukan jika penundaan menyebabkan pengalaman pengguna yang buruk. Misalnya, penanda penyisipan memerlukan informasi pemosisian, dan penanda penyisipan harus memberikan masukan langsung kepada pengguna, sehingga memicu rendering langsung.
Ada juga beberapa tempat di inti yang memicu render langsung untuk alasan kompatibilitas mundur. Fitur ini akan dihapus di v11.