Alcinoe on avoimen lähdekoodin komponenttikirjasto Delphille ja C++Builderille, jota Zeus64 ylläpitää GitHubissa. Se kattaa alueita, jotka VCL ja FireMonkey RTL jättävät kolmansille osapuolille: GPU-kiihdytetyn videosoittimen, WebRTC-kääreen, natiivit iOS- ja Android-muokkauskomponentit, kahden tilan JSON/BSON-jäsentimen, MongoDB-asiakkaan yhteyspoolauksella, ImageMagick-kääreen ja kokoelman FireMonkey-komponentteja, jotka ohittavat vakiomuotoisen renderöintiputken kokonaan. Kirjasto loi maineensa Riossa (10.3.3) ja Sydneyssä (10.4.2), ja on sittemmin seurannut jokaista Embarcaderon julkaisua. Tätä kirjoitettaessa se on täysin yhteensopiva Delphi 11.1 Alexandrian ja Delphi Athens 12.3:n kanssa
Alcinoen lisääminen projektiin
Asennus jakautuu yhteen kysymykseen: tarvitsetko suunnitteluaikaista tukea Alcinoen visuaalisille komponenteille? Jos et, ohita BPL kokonaan. Lisää {alcinoe_rootdir}\source projektin kirjaston hakupolkuun, ja olet valmis. Jokainen ei-visuaalinen komponentti, mukaan lukien jäsentimet, tietokanta-asiakkaat ja merkkijonotyökalut, kääntyy lähdekoodista rekisteröimättä mitään
Kun tarvitset suunnitteluaikaista tukea, polku on hieman pidempi. Avaa Delphin IDE:ssä Component > Install Packages, selaa versiotasi vastaavaan BPL-tiedostoon (esimerkiksi {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\alexandria\Alcinoe_alexandria.bpl), asenna se ja lisää silti {alcinoe_rootdir}\source hakupolkuun. BPL rekisteröi komponentit; lähdehakemisto on se, minkä kääntäjä löytää kääntäessään projektiasi
Alcinoe sisältää valinnaisia korjauksia Embarcaderon RTL-lähdekoodeihin. Jos haluat ne, siirry hakemistoon {alcinoe_rootdir}\embarcadero\, valitse versiosi alihakemisto ja suorita update.bat. Komentosarja olettaa, että GIT on PATH-muuttujassa ja käyttää Embarcaderon oletusasennussijaintia. Se hakee alkuperäisen RTL-lähdekoodin ja soveltaa korjaukset. Kun tämä on tehty, lisää korjattu lähdehakemisto projektisi hakupolkuun, jotta kääntäjä valitsee sen Embarcaderon asennuspuun vain luku -kopion sijaan. Mikään näistä ei ole pakollista aloittamiseksi; sillä on merkitystä vain, jos törmäät korjauksien ratkaisemiin vikoihin
Android ja D8-sokeroinnin poistava välityspalvelin
Useat Alcinoe-komponentit (WebRTC, ExoPlayer-pohjainen video) riippuvat Java-kirjastoista, jotka käyttävät Java 8:n kieliominaisuuksia. Vanhempien Delphi-versioiden mukana toimitettu Android-työkaluketju käyttää dx.bat-tiedostoa DEX-muunnokseen, joka ei pysty käsittelemään näitä tavukoodeja API-tason 26 alapuolella. Ratkaisu on sokeroinnin poisto (desugaring), jonka D8 hoitaa automaattisesti, kun sitä kutsutaan suoraan. Alcinoe tarjoaa välityspalvelinkomentosarjan osoitteessa {alcinoe_rootdir}\tools\D8Proxy\dx.bat, joka välittää kutsut Delphin koontijärjestelmästä D8:lle, tehden sokeroinnin poistosta läpinäkyvää. Korvaa alkuperäinen dx.bat Android SDK:n build-tools-hakemistossa (yleensä C:\SDKs\android\build-tools\30.0.3\) tällä välityspalvelimella. Embarcadero seurasi taustalla olevaa ongelmaa tunnisteella RSP-24155; uudemmat SDK-työkalujen versiot ratkaisivat sen suoraan, joten tarkista, tarvitseeko nykyinen työkaluketjusi yhä tätä kiertotapaa
FireMonkeyn renderöintiongelma ja Alcinoen ratkaisu
FireMonkeyn oletusarvoinen piirtosykli muodostuu pullonkaulaksi vierityspainotteisissa käyttöliittymissä. Yksittäisen TRectangle-elementin, jossa on pyöristetyt kulmat, uudelleenpiirtäminen voi kestää noin 3 ms, koska vakiototeutus laskee reitin uudelleen jokaisella ruudulla. Kun tällaisia ohjausobjekteja on näkyvissä 20, aikaa kuluu 60 ms ruutupäivitystä kohti, mikä rajoittaa tehokkaan ruudunpäivitysnopeuden selvästi sujuvan vierityksen kynnyksen alapuolelle
Alcinoe ratkaisee tämän säilyttämällä jokaiselle komponentille GPU:ssa sijaitsevan puskurin. Ensimmäinen piirto renderöi komponentin TTexture-tekstuuriin, joka on tallennettu GPU-muistiin. Myöhemmät uudelleenpiirrot siirtävät (blit) kyseisen tekstuurin piirtoalgoritmin uudelleensuorittamisen sijaan. Mitattu tulos samalla pyöristetyllä suorakulmiolla putoaa noin 3 ms:sta noin 0,1 ms:iin. Puskuroinnin lisäksi Alcinoe korvaa OpenGL-polun piirtämisen perusmuotojen osalta natiiveilla Android- ja iOS-piirtorajapinnoilla, välttäen Form.Quality-ominaisuuteen liittyvän laadun ja suorituskyvyn välisen kompromissin. Asiaankuuluvat komponentit ovat TALRectangle, TALCircle ja joukko parannettuja asetteluastioita, mukaan lukien ScrollBox ja TabControl
TALJsonDocument: DOM ja SAX yhdessä tyypissä
TALJsonDocument on Alcinoen JSON- ja BSON-jäsennin. Se tukee kahta läpikäyntitilaa. DOM-tila rakentaa muistissa olevan objektipuun, antaen satunnaispääsyn mihin tahansa solmuun asiakirjan koon mukaisen muistinkulutuksen hinnalla. SAX-tila laukaisee tapahtumia jäsentimen lukiessa kutakin merkkiä säilyttämättä mitään puuta, mikä on oikea valinta silloin, kun sinun täytyy suodattaa suuri asiakirja ja säilyttää vain kourallinen arvoja. Delphin DOM-jäsentimet (DBXJSON, SuperObject ja muut) ovat tyypillisesti kolmesta viiteen kertaa hitaampia kuin SAX-lähestymistapa samalle sisällölle, koska jokainen solmun varaus sisältää objektin luomisen yleiskustannukset itse jäsennystyön lisäksi
Tyyppi noudattaa samaa solmun navigointikuviota kuin TALXMLDocument. Minimaalinen DOM-luku näyttää tältä:
MyJsonDoc.LoadFromJSON(AJsonStr, False {dom mode});
MyJsonDoc.ParseOptions := [poAllowComments];
// lue skalaariarvoja
ShowMessage(MyJsonDoc.ChildNodes['name'].ChildNodes['first'].Text);
ShowMessage(IntToStr(MyJsonDoc.ChildNodes['_id'].Int32));
// käy läpi taulukko
for I := 0 to MyJsonDoc.ChildNodes['contribs'].ChildNodes.Count - 1 do
Writeln(MyJsonDoc.ChildNodes['contribs'].ChildNodes[I].Text);
SAX-tilaa varten määritä nimetön proseduuri OnParseText-tapahtumalle ennen kuin kutsut LoadFromJSON-metodia siten, että toisena argumenttina on True. Takaisinkutsu saa solmun polun, nimen, arvon ja TALJSONNodeSubType-tyypin, joka tunnistaa JSON-tyypin (merkkijono, kokonaisluku, liukuluku, totuusarvo ja niin edelleen). Tämä tila ei tuota kekomuistin varauksia solmuille, joten se skaalautuu mielivaltaisen suuriin asiakirjoihin ilman, että muistibudjetti ylittyy
TALJsonDocument lukee ja kirjoittaa myös BSON:ia natiivisti; syötä True BSON-lippuna kohteille LoadFromFile tai SaveToFile. Toinen muunnelma, TALJsonDocumentU, käyttää sisäisesti UnicodeString-tyyppiä (UTF-16) AnsiString-tyypin (UTF-8) sijaan ympäristöissä, joissa ympäröivä koodi toimii kokonaisuudessaan Unicodella
MongoDB-asiakas ja yhteyspoolaus
Alcinoen MongoDB-ajuri kattaa yleiset kyselytoiminnot ja käsittelee yhteyspoolauksen natiivisti. Yksinkertainen asiakas, TAlMongoDBClient, avaa ja sulkee yhden yhteyden toimintoa kohti. Poolattu versio, TAlMongoDBConnectionPoolClient, ylläpitää joukkoa aktiivisia yhteyksiä ja luovuttaa niistä yhden kullekin kutsuvalle säikeelle poolista, palauttaen sen, kun kutsu on suoritettu. Tämä malli estää useita säikeitä estämästä toisiaan yhteyden muodostuksessa, millä on merkitystä aina, kun taustatyöntekijät tekevät kyselyitä samaan tietokantaan samanaikaisesti. Rajoitettujen kokoelmien seurattaville kohdistimille (tailable cursors) TAlMongoDBTailMonitoringThread tarkkailee uusia asiakirjoja ja laukaisee takaisinkutsun niiden saapuessa, mikä on vakiomalli lokin suoratoistoon tai muutosilmoituksiin ilman kyselyitä (polling)
Muita tutustumisen arvoisia komponentteja
ALVideoPlayer renderöi videon TTexture-tekstuuriin peittoikkunan sijaan, joten muut FireMonkey-komponentit voivat sijaita sen yläpuolella Z-järjestyksessä. Android-taustaosa käyttää ExoPlayeria, joka lisää DASH-, HLS- ja SmoothStreaming-tuen yli sen, mitä Androidin sisäänrakennettu MediaPlayer käsittelee. iOS-taustaosa käyttää AVPlayeria vastaavalla HLS-tuella
TALWebRTC paketoi WebRTC-pinon vertaisverkon (peer-to-peer) ääntä ja videota varten. Se ei vaadi selainta tai laajennusta, ja yhteys läpäisee NAT-osoitteenmuunnoksen standardinmukaisella ICE/STUN/TURN-neuvottelulla, jota taustalla oleva kirjasto käsittelee
TALStringList korvaa TStringList:n AnsiCompareText-pohjaisen lajittelun aluekohtaisesta asetuksesta riippumattomalla järjestysvertailulla (ordinal comparison) ja pikalajittelulla (quicksort), joka on jopa 10 kertaa nopeampi suurilla luetteloilla. Tiivistetty versio (hashed), TALHashedStringList, lisää sisäisen tiivistetaulun (hash table) O(1)-hakuja varten pienten luetteloiden hieman suuremman yleiskustannuksen hinnalla. Huomaa, että TALStringList on 8-bittinen AnsiString-luettelo, ei Unicode-luettelo; se sopii hyvin palvelinpuolen koodiin, jossa UTF-8 on työskentelykoodaus ja raaka suorituskyky on tärkeämpää kuin aluekohtainen vertailu
64-bittisessä Windowsissa FastCode-perintö, joka antoi monille Alcinoen merkkijonorutiineille niiden nopeusedun (lähinnä käsin kirjoitettu x86-assembly), ei siirry mukana. Win64-koontiversiot palautuvat Pascal-toteutuksiin, jotka toimivat huomattavasti hitaammin merkkijonointensiivisissä työkuormissa. demo\ALStringBenchMark-projekti antaa sinun mitata eron laitteistollasi ennen kuin sitoudut 64-bittiseen koontiversioon silloin, kun merkkijonojen läpisyöttö on pullonkaula
Koko lähdekoodi löytyy osoitteesta github.com/Zeus64/alcinoe