Teknik Makale

Alcinoe Bileşen Kütüphanesi ve Delphi 11.1 Alexandria Uyumluluğu

Alcinoe, Delphi ve C++Builder için, GitHub üzerinde Zeus64 tarafından bakımı yapılan açık kaynaklı bir bileşen kütüphanesidir. VCL ve FireMonkey RTL'in üçüncü taraflara bıraktığı alanı kapsar: GPU hızlandırmalı bir video oynatıcı, bir WebRTC sarmalayıcı, yerel iOS ve Android düzenleme denetimleri, çift kipli bir JSON/BSON ayrıştırıcı, bağlantı havuzlama (connection pooling) özellikli bir MongoDB istemcisi, bir ImageMagick sarmalayıcı ve stok işleme (render) hattını tamamen atlayan bir FireMonkey denetimleri koleksiyonu. Kütüphane, itibarını Rio (10.3.3) ve Sydney (10.4.2) üzerine inşa etti ve o zamandan beri her Embarcadero sürümünü izledi. Bu yazının yazıldığı sırada Delphi 11.1 Alexandria ve Delphi Athens 12.3 ile tümüyle uyumludur

Alcinoe'yi bir projeye dahil etmek

Kurulum tek bir soru üzerinden ayrılır: Alcinoe'nin görsel denetimleri için tasarım zamanı (design-time) desteğine ihtiyacınız var mı? Yoksa BPL'yi tamamen atlayın. Projenin kütüphane arama yoluna (library search path) {alcinoe_rootdir}\source dizinini ekleyin, işiniz biter. Ayrıştırıcılar, veritabanı istemcileri ve string yardımcıları dahil her görsel olmayan bileşen, hiçbir şey kaydetmeden kaynaktan derlenir

Tasarım zamanı desteğine ihtiyaç duyduğunuzda yol biraz daha uzundur. Delphi IDE'de Component > Install Packages menüsünü açın, sürümünüzle eşleşen BPL'ye gidin (örneğin {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\alexandria\Alcinoe_alexandria.bpl), kurun ve ardından yine de arama yoluna {alcinoe_rootdir}\source dizinini ekleyin. BPL bileşenleri kaydeder; kaynak dizini ise derleyicinin projenizi derlerken bulduğu şeydir

Alcinoe, Embarcadero RTL kaynaklarına yönelik isteğe bağlı yamalar (patch) sunar. Bunları istiyorsanız {alcinoe_rootdir}\embarcadero\ dizinine gidin, sürümünüze ait alt dizini seçin ve update.bat dosyasını çalıştırın. Betik, PATH içinde GIT bulunmasını bekler ve varsayılan bir Embarcadero kurulum konumu olduğunu varsayar. Orijinal RTL kaynağını çeker ve yamaları uygular. İşlem bittiğinde, derleyicinin yamalı sürümü Embarcadero kurulum ağacındaki salt okunur kopyadan önce alması için, o yamalı kaynak dizinini proje arama yolunuza ekleyin. Başlamak için bunların hiçbiri gerekli değildir; bu yalnızca yamaların çözdüğü hatalarla karşılaşırsanız önem taşır

Android ve D8 desugaring vekili (proxy)

Birkaç Alcinoe bileşeni (WebRTC, ExoPlayer destekli video) Java 8 dil özelliklerini kullanan Java kütüphanelerine bağımlıdır. Eski Delphi sürümleriyle gelen Android araç zinciri, DEX dönüşümü için dx.bat kullanır; bu, API 26'nın altındaki seviyelerde o bytecode'ları işleyemez. Çözüm, doğrudan çağrıldığında D8'in otomatik olarak halledeceği desugaring'dir. Alcinoe, çağrıları Delphi derleme sisteminden D8'e ileten ve desugaring'i saydam hale getiren bir vekil betik sunar: {alcinoe_rootdir}\tools\D8Proxy\dx.bat. Android SDK build-tools dizininizdeki (genellikle C:\SDKs\android\build-tools\30.0.3\) orijinal dx.bat dosyasını bu vekil ile değiştirin. Embarcadero temeldeki sorunu RSP-24155 numarasıyla izledi; SDK araçlarının sonraki sürümleri bunu doğrudan giderdi, bu yüzden mevcut araç zincirinizin bu geçici çözüme hâlâ ihtiyaç duyup duymadığını kontrol edin

FireMonkey işleme sorunu ve Alcinoe'nin yanıtı

FireMonkey'in varsayılan boyama döngüsü, kaydırma yoğun kullanıcı arayüzlerinde bir darboğaza dönüşür. Yuvarlatılmış köşeli tek bir TRectangle, stok uygulama her karede yolu (path) yeniden hesapladığı için yeniden boyanması yaklaşık 3 ms sürebilir. Görünürdeki 20 böyle denetimle bu, kare geçişi başına 60 ms'ye çıkar ve etkin kare hızını akıcı kaydırma eşiğinin oldukça altında sınırlar

Alcinoe bunu, denetim başına GPU'da yerleşik (GPU-resident) bir tamponla ele alır. İlk boyama, denetimi GPU belleğinde saklanan bir TTexture içine işler. Sonraki yeniden boyamalar, boyama algoritmasını yeniden çalıştırmak yerine o dokuyu (texture) blit eder. Aynı yuvarlatılmış dikdörtgen üzerinde ölçülen sonuç yaklaşık 3 ms'den yaklaşık 0,1 ms'ye düşer. Tamponlamanın ötesinde, Alcinoe temel şekiller için OpenGL yol çizimini yerel Android ve iOS çizim API'leriyle değiştirir ve böylece Form.Quality ile bağlı kalite/performans ödünleşimini atlatır. İlgili denetimler TALRectangle, TALCircle ile bir ScrollBox ve TabControl dahil bir dizi geliştirilmiş yerleşim kapsayıcısıdır

TALJsonDocument: Tek bir türde DOM ve SAX

TALJsonDocument, Alcinoe'nin JSON ve BSON ayrıştırıcısıdır. İki gezinme (traversal) kipini destekler. DOM kipi bellek içi bir nesne ağacı kurar ve belge boyutuyla orantılı bellek pahasına herhangi bir düğüme rastgele erişim sağlar. SAX kipi, herhangi bir ağaç tutmadan ayrıştırıcı her belirteci (token) okurken olayları tetikler; bu, büyük bir belgeyi filtreleyip yalnızca bir avuç değeri tutmanız gerektiğinde doğru seçimdir. Delphi'deki DOM ayrıştırıcılar (DBXJSON, SuperObject ve diğerleri), aynı içerik için tipik olarak SAX yaklaşımından üç ila beş kat daha yavaştır, çünkü her düğüm ayırma işlemi, ayrıştırma işinin kendisinin üstüne nesne oluşturma yükü taşır

Bu tür, TALXMLDocument ile aynı düğüm gezinme desenini izler. Minimal bir DOM okuması şöyle görünür:

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);

SAX kipi için, ikinci argümanı True olarak ayarlanmış LoadFromJSON'u çağırmadan önce OnParseText olayına anonim bir yordam atayın. Geri çağırma (callback), düğüm yolunu, adını, değerini ve JSON türünü (string, integer, float, boolean vb.) tanımlayan bir TALJSONNodeSubType alır. O kip düğümler için hiçbir öbek (heap) ayırması üretmez, bu yüzden bellek bütçesini patlatmadan keyfi olarak büyük belgelere ölçeklenir

TALJsonDocument ayrıca BSON'u yerel olarak okur ve yazar; LoadFromFile veya SaveToFile'a BSON bayrağı olarak True geçirin. İkinci bir varyant olan TALJsonDocumentU, çevredeki kodun baştan sona Unicode ile çalıştığı bağlamlar için dahili olarak AnsiString (UTF-8) yerine UnicodeString (UTF-16) kullanır

MongoDB istemcisi ve bağlantı havuzlama

Alcinoe'nin MongoDB sürücüsü, yaygın sorgu işlemlerini kapsar ve bağlantı havuzlamayı yerel olarak yönetir. Basit istemci TAlMongoDBClient, işlem başına tek bir bağlantı açıp kapatır. Havuzlanmış varyant TAlMongoDBConnectionPoolClient, bir dizi canlı bağlantı tutar ve çağrı tamamlandığında geri döndürerek havuzdan çağıran her iş parçacığına (thread) birer bağlantı verir. Bu model, birden çok iş parçacığının bağlantı kurulumunda birbirini engellemesini önler ki bu, arka plan işçileri aynı veritabanını eşzamanlı sorguladığında önem taşır. Sınırlanmış (capped) koleksiyonlar üzerindeki izlenebilir (tailable) imleçler için TAlMongoDBTailMonitoringThread, yeni belgeleri gözler ve geldiklerinde bir geri çağırma tetikler ki bu, yoklama (polling) olmadan günlük akışı veya değişiklik bildirimi için standart desendir

Bilmeye değer diğer bileşenler

ALVideoPlayer, videoyu bir bindirme (overlay) penceresi yerine bir TTexture'a işler, böylece diğer FireMonkey denetimleri Z-sırasında onun üzerinde durabilir. Android arka ucu ExoPlayer kullanır; bu, Android'in yerleşik MediaPlayer'ının işlediğinin ötesinde DASH, HLS ve SmoothStreaming desteği ekler. iOS arka ucu, eşdeğer HLS desteğiyle AVPlayer kullanır

TALWebRTC, uçtan uca (peer-to-peer) ses ve video için WebRTC yığınını sarmalar. Bir tarayıcı veya eklenti gerektirmez ve bağlantı, temeldeki kütüphanenin hallettiği standart ICE/STUN/TURN müzakeresiyle NAT'ı geçer

TALStringList, TStringList'in AnsiCompareText tabanlı sıralamasını yerel (locale) bağımsız sıra tabanlı (ordinal) bir karşılaştırma ve büyük listelerde 10 kata kadar daha hızlı bir hızlı sıralama (quicksort) ile değiştirir. Karma (hashed) varyant TALHashedStringList, küçük listelerde biraz daha yüksek ek yük pahasına O(1) arama için dahili bir karma tablosu ekler. TALStringList'in Unicode değil, 8 bitlik bir AnsiString listesi olduğuna dikkat edin; UTF-8'in çalışma kodlaması olduğu ve ham verimin yerele duyarlı karşılaştırmadan daha çok önem taşıdığı sunucu tarafı kodda iyi oturur

64 bit Windows'ta, Alcinoe'nin string yordamlarının çoğuna hız avantajını veren FastCode mirası (çoğunlukla elle yazılmış x86 assembly) taşınmaz. Win64 derlemeleri, string yoğun iş yüklerinde belirgin biçimde daha yavaş çalışan Pascal uygulamalarına geri döner. demo\ALStringBenchMark projesi, string verimin bir darboğaz olduğu bir 64 bit derlemeye bağlanmadan önce donanımınızda bu farkı ölçmenize olanak tanır

Tam kaynak github.com/Zeus64/alcinoe adresindedir