Műszaki cikk

Alcinoe komponenskönyvtár és Delphi 11.1 Alexandria kompatibilitás

Az Alcinoe egy nyílt forráskódú komponenskönyvtár Delphi-hez és C++Builder-hez, amelyet a Zeus64 tart karban a GitHub-on. Olyan területeket fed le, amelyeket a VCL és a FireMonkey RTL harmadik felekre bíz: GPU-gyorsított videolejátszó, WebRTC burkoló, natív iOS és Android szerkesztővezérlők, kettős módú JSON/BSON elemző, MongoDB kliens kapcsolatkészlettel, ImageMagick burkoló, valamint olyan FireMonkey vezérlők gyűjteménye, amelyek teljesen megkerülik az alapértelmezett renderelési folyamatot. A könyvtár hírnevét a Rio (10.3.3) és a Sydney (10.4.2) verziókon alapozta meg, és azóta minden Embarcadero kiadást követ. Az írás pillanatában teljes mértékben kompatibilis a Delphi 11.1 Alexandria és a Delphi Athens 12.3 verziókkal

Az Alcinoe integrálása egy projektbe

A telepítés egyetlen kérdésen múlik: szüksége van-e tervezésidejű támogatásra az Alcinoe vizuális vezérlőihez? Ha nem, hagyja ki teljesen a BPL-t. Adja hozzá a {alcinoe_rootdir}\source könyvtárat a projekt könyvtárkeresési útvonalához, és készen is van. Minden nem vizuális komponens, beleértve az elemzőket, az adatbázisklienseket és a karakterlánc-segédprogramokat, forráskódból fordul anélkül, hogy bármit is regisztrálni kellene

Ha tervezésidejű támogatásra van szüksége, az út egy kicsit hosszabb. Nyissa meg a Component > Install Packages menüpontot a Delphi IDE-ben, keresse meg a verziójának megfelelő BPL-t (például {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\alexandria\Alcinoe_alexandria.bpl), telepítse, majd továbbra is adja hozzá a {alcinoe_rootdir}\source könyvtárat a keresési útvonalhoz. A BPL regisztrálja a komponenseket; a forráskönyvtárat pedig a fordító találja meg, amikor lefordítja a projektet

Az Alcinoe opcionális javításokat szállít az Embarcadero RTL forráskódjaihoz. Ha ezekre szüksége van, navigáljon a {alcinoe_rootdir}\embarcadero\ könyvtárba, válassza ki a verziójának megfelelő alkönyvtárat, és futtassa az update.bat fájlt. A szkript elvárja, hogy a GIT a PATH-ban legyen, és az alapértelmezett Embarcadero telepítési hellyel számol. Lekéri az eredeti RTL forráskódot, és alkalmazza a javításokat. Ha elkészült, adja hozzá a javított forráskönyvtárat a projekt keresési útvonalához, hogy a fordító előbb találja meg, mint az Embarcadero telepítési fájából származó csak olvasható másolatot. Ezek egyike sem kötelező az induláshoz; csak akkor számít, ha olyan hibákba ütközik, amelyeket a javítások orvosolnak

Android és a D8 desugaring proxy

Számos Alcinoe komponens (WebRTC, ExoPlayer alapú videó) olyan Java könyvtárakra támaszkodik, amelyek Java 8 nyelvi funkciókat használnak. A régebbi Delphi verziókkal szállított Android eszközkészlet a dx.bat fájlt használja a DEX konverzióhoz, amely nem tudja kezelni ezeket a bájtkódokat 26 alatti API szinteken. A megoldás a desugaring, amelyet a D8 automatikusan kezel közvetlen meghíváskor. Az Alcinoe biztosít egy proxy szkriptet a {alcinoe_rootdir}\tools\D8Proxy\dx.bat címen, amely továbbítja a hívásokat a Delphi fordítási rendszerből a D8 felé, így a desugaring transzparens lesz. Cserélje le az eredeti dx.bat fájlt az Android SDK build-tools könyvtárában (jellemzően C:\SDKs\android\build-tools\30.0.3\) erre a proxyra. Az Embarcadero az RSP-24155 alatt követte a mögöttes problémát; az SDK eszközök újabb verziói közvetlenül megoldották ezt, ezért ellenőrizze, hogy jelenlegi eszközkészlete igényli-e még ezt az áthidaló megoldást

A FireMonkey renderelési probléma és az Alcinoe válasza

A FireMonkey alapértelmezett rajzolási ciklusa szűk keresztmetszetté válik a sok görgetést igénylő felhasználói felületeken. Egyetlen lekerekített sarkú TRectangle újrarajzolása körülbelül 3 ms-t vehet igénybe, mivel az alapértelmezett megvalósítás minden képkockánál újraszámolja az útvonalat. Ha 20 ilyen vezérlő látható, az képkockánként 60 ms-ot jelent, ami a hatékony képkockasebességet jóval a folyamatos görgetéshez szükséges küszöbérték alá szorítja

Az Alcinoe ezt vezérlőnként egy GPU-rezidens pufferrel orvosolja. Az első rajzolás a vezérlőt egy GPU memóriában tárolt TTexture-ra rendereli. A későbbi újrarajzolások ezt a textúrát másolják (blit) a rajzoló algoritmus ismételt végrehajtása helyett. A mért eredmény ugyanazon a lekerekített téglalapon körülbelül 3 ms-ról nagyjából 0,1 ms-ra csökken. A pufferelésen túl az Alcinoe az alapvető alakzatok OpenGL útvonalrajzolását natív Android és iOS rajzolási API-kra cseréli, kikerülve a Form.Quality-hez kötődő minőség/teljesítmény kompromisszumot. Az érintett vezérlők a TALRectangle, a TALCircle, valamint a továbbfejlesztett elrendezési konténerek halmaza, beleértve a ScrollBox és a TabControl vezérlőket

TALJsonDocument: DOM és SAX egyetlen típusban

A TALJsonDocument az Alcinoe JSON és BSON elemzője. Két bejárási módot támogat. A DOM mód memóriabeli objektumfát épít, véletlenszerű hozzáférést biztosítva bármely csomóponthoz a dokumentum méretével arányos memória árán. A SAX mód eseményeket indít, miközben az elemző beolvassa az egyes tokeneket anélkül, hogy fát tartana fenn, ami a megfelelő választás, ha egy nagy dokumentumot kell szűrnie, és csak néhány értéket kell megőriznie. A Delphi-ben található DOM elemzők (DBXJSON, SuperObject és a többiek) általában háromszor-ötször lassabbak, mint egy SAX megközelítés ugyanarra a tartalomra, mivel minden csomópont-lefoglalás objektumlétrehozási többletterheléssel jár magán az elemzési munkán felül

A típus ugyanazt a csomópont-navigációs mintát követi, mint a TALXMLDocument. Egy minimális DOM beolvasás így néz ki:

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 mód esetén rendeljen egy névtelen eljárást az OnParseText-hez a LoadFromJSON meghívása előtt, a második argumentumot True értékre állítva. A visszahívás megkapja a csomópont útvonalát, nevét, értékét, valamint egy TALJSONNodeSubType-ot, amely azonosítja a JSON típust (karakterlánc, egész szám, lebegőpontos szám, logikai érték és így tovább). Ez a mód nem hoz létre heap lefoglalásokat a csomópontok számára, így tetszőlegesen nagy dokumentumokra is skálázható anélkül, hogy kimerítené a memóriakeretet

A TALJsonDocument natív módon is olvas és ír BSON-t; adja át a True értéket BSON jelzőként a LoadFromFile vagy a SaveToFile függvénynek. Egy második változat, a TALJsonDocumentU, a UnicodeString (UTF-16) típust használja belsőleg az AnsiString (UTF-8) helyett olyan kontextusokban, ahol a környező kód végig Unicode-ban működik

MongoDB kliens és kapcsolatkészlet

Az Alcinoe MongoDB illesztőprogramja lefedi a gyakori lekérdezési műveleteket, és natív módon kezeli a kapcsolatkészletet. Az egyszerű kliens, a TAlMongoDBClient műveletenként megnyit és bezár egyetlen kapcsolatot. A készletezett változat, a TAlMongoDBConnectionPoolClient élő kapcsolatok halmazát tartja fenn, és mindegyik hívó szálnak átad egyet a készletből, majd visszaveszi, amikor a hívás befejeződik. Ez a modell megakadályozza, hogy a többszörös szálak blokkolják egymást a kapcsolat kiépítésekor, ami akkor számít, ha a háttérmunkások egyszerre kérdezik le ugyanazt az adatbázist. A korlátozott gyűjtemények (capped collections) követhető (tailable) kurzoraihoz a TAlMongoDBTailMonitoringThread figyeli az új dokumentumokat, és érkezésükkor egy visszahívást indít, ami a szabványos minta a naplófolyamokhoz vagy a lekérdezés nélküli változásértesítésekhez

Egyéb megismerésre érdemes komponensek

Az ALVideoPlayer a videót egy TTexture-ra rendereli átfedő ablak helyett, így más FireMonkey vezérlők is elhelyezkedhetnek felette a Z-sorrendben. Az Android háttérrendszer az ExoPlayert használja, amely DASH, HLS és SmoothStreaming támogatást ad az Android beépített MediaPlayer képességein túl. Az iOS háttérrendszer az AVPlayer-t használja egyenértékű HLS támogatással

A TALWebRTC a WebRTC stacket burkolja peer-to-peer hang- és videohívásokhoz. Nem igényel böngészőt vagy bővítményt, és a kapcsolat a NAT-on keresztül zajlik a szabványos ICE/STUN/TURN egyeztetéssel, amelyet a mögöttes könyvtár kezel

A TALStringList lecseréli a TStringList AnsiCompareText alapú rendezését egy területi beállítástól független, sorszámozott összehasonlításra és egy gyorsrendezésre (quicksort), amely nagy listákon akár 10-szer gyorsabb. A hashelt változat, a TALHashedStringList egy belső hash táblát ad hozzá az O(1) idejű kereséshez, kisebb listáknál jelentkező némileg magasabb többletterhelés árán. Vegye figyelembe, hogy a TALStringList egy 8 bites AnsiString lista, nem pedig Unicode; jól illeszkedik a szerveroldali kódba, ahol az UTF-8 a munkakódolás, és a nyers áteresztőképesség fontosabb, mint a területi beállítást figyelembe vevő összehasonlítás

64 bites Windowson a FastCode örökség, amely az Alcinoe sok karakterlánc-rutinjának sebességelőnyét adta (többnyire kézzel írt x86 assembly), nem vihető át. A Win64 buildek a Pascal implementációkra esnek vissza, amelyek érezhetően lassabban futnak a karakterlánc-intenzív terheléseknél. A demo\ALStringBenchMark projekt lehetővé teszi a különbség mérését a hardverén, mielőtt elkötelezné magát egy olyan 64 bites build mellett, ahol a karakterlánc-áteresztőképesség szűk keresztmetszetet jelent

A teljes forráskód a github.com/Zeus64/alcinoe címen található

A frissített útmutató az Android D8 desugaring proxyt, a FireMonkey renderelési problémát, a TALJsonDocument DOM/SAX használatát és a MongoDB kapcsolatkezelését követi