Artikel Teknis

Pustaka Komponen Alcinoe dan Kompatibilitas Delphi 11.1 Alexandria

Alcinoe adalah pustaka komponen sumber terbuka untuk Delphi dan C++Builder, yang dikelola di GitHub oleh Zeus64. Pustaka ini mencakup area yang ditinggalkan VCL dan FireMonkey RTL kepada pihak ketiga: pemutar video yang dipercepat GPU, wrapper WebRTC, kontrol edit iOS dan Android asli, parser JSON/BSON dual-mode, klien MongoDB dengan connection pooling, wrapper ImageMagick, dan kumpulan kontrol FireMonkey yang sepenuhnya melewati pipeline rendering bawaan. Pustaka ini membangun reputasinya pada Rio (10.3.3) dan Sydney (10.4.2), dan sejak itu mengikuti setiap rilis Embarcadero. Pada saat penulisan ini, pustaka ini sepenuhnya kompatibel dengan Delphi 11.1 Alexandria dan Delphi Athens 12.3

Instalasi bergantung pada kebutuhan dukungan design-time. Untuk komponen non-visual, tambahkan {alcinoe_rootdir}\source ke library search path proyek dan kompilasi source langsung tanpa mendaftarkan BPL. BPL hanya diperlukan ketika kontrol visual Alcinoe harus tersedia di IDE

Menambahkan Alcinoe ke sebuah proyek

Instalasi bergantung pada satu pertanyaan: apakah Anda membutuhkan dukungan waktu desain untuk kontrol visual Alcinoe? Jika tidak, lewati BPL sepenuhnya. Tambahkan {alcinoe_rootdir}\source ke library search path proyek dan selesai. Setiap komponen non-visual, termasuk parser, klien database, dan utilitas string, dikompilasi dari sumber tanpa mendaftarkan apa pun

Ketika Anda membutuhkan dukungan waktu desain, jalurnya sedikit lebih panjang. Buka Component > Install Packages di Delphi IDE, cari BPL yang sesuai dengan versi Anda (misalnya {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\alexandria\Alcinoe_alexandria.bpl), instal, lalu tetap tambahkan {alcinoe_rootdir}\source ke search path. BPL mendaftarkan komponen; direktori sumber adalah yang ditemukan kompiler saat mengompilasi proyek Anda

Alcinoe menyertakan patch opsional untuk sumber RTL Embarcadero. Jika Anda menginginkannya, navigasikan ke {alcinoe_rootdir}\embarcadero\, pilih subdirektori untuk versi Anda, dan jalankan update.bat. Skrip ini mengharapkan GIT di PATH dan mengasumsikan lokasi instalasi Embarcadero default. Skrip mengambil sumber RTL asli dan menerapkan patch. Setelah selesai, tambahkan direktori sumber yang sudah dipatch ke search path proyek Anda agar kompiler menemukannya terlebih dahulu sebelum salinan read-only di pohon instalasi Embarcadero. Ini semua tidak diperlukan untuk memulai; hanya penting jika Anda menemui bug yang ditangani oleh patch tersebut

Android dan D8 desugaring proxy

Beberapa komponen Alcinoe (WebRTC, video berbasis ExoPlayer) bergantung pada pustaka Java yang menggunakan fitur bahasa Java 8. Toolchain Android yang disertakan dengan versi Delphi yang lebih lama menggunakan dx.bat untuk konversi DEX, yang tidak dapat menangani bytecode tersebut pada level API di bawah 26. Solusinya adalah desugaring, yang ditangani D8 secara otomatis ketika dipanggil langsung. Alcinoe menyediakan skrip proxy di {alcinoe_rootdir}\tools\D8Proxy\dx.bat yang meneruskan panggilan dari sistem build Delphi ke D8, membuat desugaring transparan. Ganti dx.bat asli di direktori build-tools Android SDK Anda (biasanya C:\SDKs\android\build-tools\30.0.3\) dengan proxy ini. Embarcadero melacak masalah mendasar di RSP-24155; versi SDK tools yang lebih baru menanganinya secara langsung, jadi periksa apakah toolchain Anda saat ini masih memerlukan solusi ini

Masalah rendering FireMonkey dan solusi Alcinoe

Siklus paint default FireMonkey menjadi bottleneck pada UI yang banyak melakukan scroll. Sebuah TRectangle tunggal dengan sudut membulat dapat memakan sekitar 3 milidetik untuk dicat ulang karena implementasi bawaan menghitung ulang path di setiap frame. Dengan 20 kontrol seperti itu yang terlihat, itu berarti 60 ms per frame pass, yang membatasi frame rate efektif jauh di bawah ambang batas untuk scrolling yang mulus

Alcinoe mengatasi ini dengan buffer berbasis GPU per kontrol. Paint pertama merender kontrol ke TTexture yang disimpan di memori GPU. Repaint berikutnya melakukan blit tekstur tersebut alih-alih mengeksekusi ulang algoritma paint. Hasil terukur pada persegi panjang membulat yang sama turun dari sekitar 3 ms menjadi sekitar 0,1 ms. Di luar buffering, Alcinoe menggantikan OpenGL path-drawing untuk bentuk dasar dengan API drawing Android dan iOS asli, melewati trade-off kualitas/performa yang terkait dengan Form.Quality. Kontrol yang relevan adalah TALRectangle, TALCircle, dan sekumpulan kontainer layout yang ditingkatkan termasuk ScrollBox dan TabControl

TALJsonDocument: DOM dan SAX dalam satu tipe

TALJsonDocument adalah parser JSON dan BSON milik Alcinoe. Ini mendukung dua mode traversal. Mode DOM membangun pohon objek di memori, memberikan akses acak ke node mana pun dengan biaya memori proporsional dengan ukuran dokumen. Mode SAX menembakkan event saat parser membaca setiap token tanpa mempertahankan pohon apa pun, yang merupakan pilihan tepat ketika Anda perlu memfilter dokumen besar dan hanya menyimpan beberapa nilai. Parser DOM di Delphi (DBXJSON, SuperObject, dan lainnya) biasanya tiga hingga lima kali lebih lambat dari pendekatan SAX untuk konten yang sama, karena setiap alokasi node membawa overhead pembuatan objek di atas pekerjaan parsing itu sendiri

Tipe ini mengikuti pola navigasi node yang sama seperti TALXMLDocument. Pembacaan DOM minimal terlihat seperti ini:

MyJsonDoc.LoadFromJSON(AJsonStr, False {dom mode});
MyJsonDoc.ParseOptions := [poAllowComments];

// read scalar values
ShowMessage(MyJsonDoc.ChildNodes['name'].ChildNodes['first'].Text);
ShowMessage(IntToStr(MyJsonDoc.ChildNodes['_id'].Int32));

// iterate an array
for I := 0 to MyJsonDoc.ChildNodes['contribs'].ChildNodes.Count - 1 do
  Writeln(MyJsonDoc.ChildNodes['contribs'].ChildNodes[I].Text);

Untuk mode SAX, tetapkan prosedur anonim ke OnParseText sebelum memanggil LoadFromJSON dengan argumen kedua diset ke True. Callback menerima path node, nama, nilai, dan TALJSONNodeSubType yang mengidentifikasi tipe JSON (string, integer, float, boolean, dan sebagainya). Mode itu tidak menghasilkan alokasi heap untuk node, sehingga dapat diskalakan ke dokumen yang sangat besar tanpa membengkakkan anggaran memori

TALJsonDocument juga membaca dan menulis BSON secara native; lewati True sebagai flag BSON ke LoadFromFile atau SaveToFile. Varian kedua, TALJsonDocumentU, menggunakan UnicodeString (UTF-16) secara internal alih-alih AnsiString (UTF-8) untuk konteks di mana kode sekitarnya bekerja sepenuhnya dalam Unicode

Klien MongoDB dan connection pooling

Driver MongoDB Alcinoe mencakup operasi kueri umum dan menangani connection pooling secara native. Klien sederhana, TAlMongoDBClient, membuka dan menutup satu koneksi per operasi. Varian pooled, TAlMongoDBConnectionPoolClient, mempertahankan sekumpulan koneksi aktif dan menyerahkan satu ke setiap thread pemanggil dari pool, mengembalikannya saat panggilan selesai. Model itu mencegah beberapa thread saling memblokir pada setup koneksi, yang penting ketika worker latar belakang mengkueri database yang sama secara bersamaan. Untuk tailable cursor pada capped collection, TAlMongoDBTailMonitoringThread memantau dokumen baru dan menembakkan callback saat dokumen tersebut tiba, yang merupakan pola standar untuk log streaming atau notifikasi perubahan tanpa polling

Komponen lain yang perlu diketahui

ALVideoPlayer merender video ke TTexture alih-alih jendela overlay, sehingga kontrol FireMonkey lain dapat berada di atasnya dalam Z-order. Backend Android menggunakan ExoPlayer, yang menambahkan dukungan DASH, HLS, dan SmoothStreaming di luar apa yang ditangani MediaPlayer bawaan Android. Backend iOS menggunakan AVPlayer dengan dukungan HLS yang setara

TALWebRTC membungkus tumpukan WebRTC untuk audio dan video peer-to-peer. Ini tidak memerlukan browser atau plugin, dan koneksi melintasi NAT melalui negosiasi ICE/STUN/TURN standar yang ditangani oleh pustaka yang mendasarinya

TALStringList menggantikan pengurutan berbasis AnsiCompareText milik TStringList dengan perbandingan ordinal yang bebas locale dan quicksort yang hingga 10x lebih cepat pada daftar besar. Varian hash, TALHashedStringList, menambahkan tabel hash internal untuk pencarian O(1) dengan biaya overhead yang sedikit lebih tinggi pada daftar kecil. Perlu dicatat bahwa TALStringList adalah daftar AnsiString 8-bit, bukan Unicode; cocok untuk kode sisi server di mana UTF-8 adalah encoding yang digunakan dan throughput mentah lebih penting daripada perbandingan yang memperhitungkan locale

Pada Windows 64-bit, warisan FastCode yang memberikan keunggulan kecepatan pada banyak rutinitas string Alcinoe (kebanyakan assembly x86 tulisan tangan) tidak terbawa. Build Win64 kembali ke implementasi Pascal, yang berjalan jauh lebih lambat pada workload yang intensif string. Proyek demo\ALStringBenchMark memungkinkan Anda mengukur selisihnya pada hardware Anda sebelum berkomitmen pada build 64-bit di mana throughput string menjadi bottleneck

Sumber lengkapnya ada di github.com/Zeus64/alcinoe