Alcinoe je biblioteka komponenti otvorenog koda za Delphi i C++Builder, koju na GitHubu održava Zeus64. Pokriva područja koja VCL i FireMonkey RTL prepuštaju trećim stranama: video player s GPU ubrzanjem, WebRTC omotač, izvorne iOS i Android kontrole za unos teksta, JSON/BSON parser s dvostrukim načinom rada, MongoDB klijent sa spremištem veza (connection pooling), ImageMagick omotač te zbirku FireMonkey kontrola koje u potpunosti zaobilaze standardni sustav za iscrtavanje. Biblioteka je stekla ugled na verzijama Rio (10.3.3) i Sydney (10.4.2), a od tada prati svako izdanje Embarcadora. U trenutku pisanja ovog teksta, potpuno je kompatibilna s Delphi 11.1 Alexandria i Delphi Athens 12.3.
Uvođenje Alcinoea u projekt
Instalacija se dijeli na jedno pitanje: trebate li podršku u dizajnu (design-time) za Alcinoe vizualne kontrole? Ako ne, u potpunosti preskočite BPL. Dodajte {alcinoe_rootdir}\source u putanju pretraživanja biblioteka u projektu i to je to. Svaka nevizualna komponenta, uključujući parsere, klijente baza podataka i pomoćne programe za nizove znakova, prevodi se iz izvornog koda bez registracije bilo čega.
Kada vam je potrebna podrška u fazi dizajna, put je malo duži. Otvorite Component > Install Packages u Delphi IDE-u, potražite BPL koji odgovara vašoj verziji (na primjer {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\alexandria\Alcinoe_alexandria.bpl), instalirajte ga, a zatim i dalje dodajte {alcinoe_rootdir}\source u putanju pretraživanja. BPL registrira komponente; direktorij izvornog koda je ono što prevoditelj pronalazi kada prevodi vaš projekt.
Alcinoe isporučuje neobavezne zakrpe za Embarcadero RTL izvorni kod. Ako ih želite, idite u {alcinoe_rootdir}\embarcadero\, odaberite poddirektorij za svoju verziju i pokrenite update.bat. Skripta očekuje da je GIT u PATH-u i pretpostavlja zadanu lokaciju instalacije Embarcadora. Ona dohvaća izvorni RTL kod i primjenjuje zakrpe. Kada završite, dodajte taj direktorij zakrpanog izvornog koda u putanju pretraživanja projekta kako bi ga prevoditelj uzeo prije kopije koja je samo za čitanje u Embarcadero instalacijskom stablu. Ništa od ovoga nije potrebno za početak rada; važno je samo ako naiđete na bugove koje zakrpe rješavaju.
Android i D8 desugaring proxy
Nekoliko Alcinoe komponenti (WebRTC, video podržan ExoPlayerom) ovisi o Java bibliotekama koje koriste značajke jezika Java 8. Androidov lanac alata koji se isporučuje sa starijim verzijama Delphija koristi dx.bat za DEX pretvorbu, što ne može rukovati tim bajt-kodovima na razinama API-ja ispod 26. Rješenje je desugaring, kojim D8 upravlja automatski kada se izravno pozove. Alcinoe nudi proxy skriptu na lokaciji {alcinoe_rootdir}\tools\D8Proxy\dx.bat koja prosljeđuje pozive iz Delphi sustava za izgradnju u D8, čineći desugaring transparentnim. Zamijenite izvorni dx.bat u svom Android SDK build-tools direktoriju (obično C:\SDKs\android\build-tools\30.0.3\) s ovim proxyjem. Embarcadero je pratio ovaj problem pod oznakom RSP-24155; novije verzije SDK alata riješile su to izravno, pa provjerite treba li vaš trenutni lanac alata i dalje ovo zaobilazno rješenje.
Problem iscrtavanja u FireMonkeyu i Alcinoeov odgovor
Zadani ciklus crtanja u FireMonkeyu postaje usko grlo u sučeljima s puno skrolanja. Jednom TRectangle-u sa zaobljenim kutovima može trebati oko 3 ms za ponovno iscrtavanje jer standardna implementacija preračunava putanju na svakom okviru. S 20 takvih kontrola vidljivih na zaslonu, to iznosi 60 ms po prolazu, što ograničava efektivni broj sličica u sekundi znatno ispod praga za glatko skrolanje.
Alcinoe to rješava pomoću GPU-međuspremnika po kontroli. Prvo crtanje iscrtava kontrolu u TTexture pohranjenu u GPU memoriji. Sljedeća iscrtavanja kopiraju tu teksturu (blit) umjesto ponovnog pokretanja algoritma crtanja. Izmjereni rezultat na istom zaobljenom pravokutniku pada s oko 3 ms na oko 0,1 ms. Osim međuspremnika, Alcinoe zamjenjuje OpenGL crtanje putanja za osnovne oblike s izvornim Android i iOS API-jima za crtanje, zaobilazeći kompromis između kvalitete i performansi povezan sa svojstvom Form.Quality. Relevantne kontrole su TALRectangle, TALCircle te skup poboljšanih spremnika izgleda uključujući ScrollBox i TabControl.
TALJsonDocument: DOM i SAX u jednom tipu
TALJsonDocument je Alcinoeov JSON i BSON parser. Podržava dva načina obilaska. DOM način gradi stablo objekata u memoriji, dajući izravan pristup bilo kojem čvoru po cijeni memorije proporcionalne veličini dokumenta. SAX način pokreće događaje kako parser čita svaki token bez zadržavanja stabla, što je ispravan izbor kada trebate filtrirati veliki dokument i zadržati samo nekoliko vrijednosti. DOM parseri u Delphiju (DBXJSON, SuperObject i drugi) obično su tri do pet puta sporiji od SAX pristupa za isti sadržaj, jer svaka alokacija čvora nosi režijske troškove stvaranja objekta povrh samog rada na parsiranju.
Ovaj tip prati isti uzorak navigacije čvorova kao i TALXMLDocument. Minimalno čitanje u DOM načinu izgleda ovako:
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);
Za SAX način, dodijelite anonimnu proceduru događaju OnParseText prije pozivanja LoadFromJSON s drugim argumentom postavljenim na True. Povratni poziv prima putanju čvora, naziv, vrijednost i TALJSONNodeSubType koji identificira tip JSON-a (string, cijeli broj, broj s pomičnim zarezom, logička vrijednost itd.). Taj način ne stvara alokacije čvorova na gomili, pa se skalira na proizvoljno velike dokumente bez prekoračenja memorijskog proračuna.
TALJsonDocument također čita i zapisuje BSON izvorno; proslijedite True kao BSON zastavicu u LoadFromFile ili SaveToFile. Druga varijanta, TALJsonDocumentU, koristi UnicodeString (UTF-16) interno umjesto AnsiString (UTF-8) for contexts where the surrounding code works in Unicode throughout.
MongoDB klijent i connection pooling
Alcinoeov MongoDB pokretač pokriva uobičajene operacije upita i izvorno upravlja spremištem veza. Jednostavni klijent, TAlMongoDBClient, otvara i zatvara jednu vezu po operaciji. Varijanta sa spremištem, TAlMongoDBConnectionPoolClient, održava skup aktivnih veza i predaje jednu svakoj niti pozivatelja iz spremišta, vraćajući je kada se poziv završi. Taj model sprječava da više niti blokira jedna drugu pri uspostavi veze, što je važno kada pozadinski procesi istovremeno šalju upite istoj bazi podataka. Za tailable kursore na capped kolekcijama, TAlMongoDBTailMonitoringThread prati nove dokumente i pokreće povratni poziv kada stignu, što je standardni obrazac za strujanje zapisa (log streaming) ili obavijesti o promjenama bez prozivanja (polling).
Ostale komponente koje vrijedi znati
ALVideoPlayer iscrtava video u TTexture umjesto u preklapajući prozor (overlay window), tako da se druge FireMonkey kontrole mogu nalaziti iznad njega u Z-redoslijedu. Android pozadina koristi ExoPlayer, koji dodaje podršku za DASH, HLS i SmoothStreaming povrh onoga što rješava ugrađeni Android MediaPlayer. iOS pozadina koristi AVPlayer s ekvivalentnom HLS podrškom.
TALWebRTC omotava WebRTC stog za peer-to-peer audio i video. Ne zahtijeva preglednik ili dodatak, a veza prolazi kroz NAT putem standardnog ICE/STUN/TURN pregovaranja kojim upravlja temeljna knjižnica.
TALStringList zamjenjuje sortiranje temeljeno na AnsiCompareText-u klase TStringList ordinarnom usporedbom neovisnom o lokaciji i brzim sortiranjem (quicksort) koje je do 10 puta brže na velikim popisima. Hashing varijanta, TALHashedStringList, dodaje internu tablicu raspršenog adresiranja (hash table) za O(1) pretraživanje uz cijenu malo većih režijskih troškova na malim popisima. Imajte na umu da je TALStringList 8-bitna AnsiString lista, a ne Unicode; dobro se uklapa u kod na poslužiteljskoj strani gdje je UTF-8 radno kodiranje, a sirova propusnost važnija od usporedbe prilagođene lokalnim postavkama.
Na 64-bitnom Windows sustavu, FastCode nasljeđe koje je mnogim Alcinoeovim rutinama za nizove znakova dalo prednost u brzini (uglavnom ručno pisani x86 asemblerski kod) se ne prenosi. Win64 izdanja vraćaju se na Pascal implementacije, koje rade primjetno sporije na zadacima s intenzivnim radom s nizovima znakova. Projekt demo\ALStringBenchMark omogućuje vam mjerenje razlike na vašem hardveru prije nego što se odlučite za 64-bitnu izgradnju u kojoj je propusnost nizova znakova usko grlo.
Cijeli izvorni kod dostupan je na github.com/Zeus64/alcinoe.