Techninis straipsnis

„Alcinoe“ komponentų biblioteka ir „Delphi 11.1 Alexandria“ suderinamumas

„Alcinoe“ yra atvirojo kodo komponentų biblioteka, skirta „Delphi“ ir „C++Builder“, kurią prižiūri „Zeus64“ sistemoje „GitHub“. Ji apima tas sritis, kurias VCL ir „FireMonkey RTL“ palieka trečiosioms šalims: GPU paspartintą vaizdo grotuvą, „WebRTC“ apvalkalą, vietinius „iOS“ ir „Android“ redagavimo valdiklius, dvigubo režimo JSON/BSON analizatorių, „MongoDB“ klientą su ryšių telkimu, „ImageMagick“ apvalkalą ir „FireMonkey“ valdiklių kolekciją, kuri visiškai aplenkia standartinį atvaizdavimo konvejerį. Biblioteka pelnė savo reputaciją su „Rio“ (10.3.3) ir „Sydney“ (10.4.2) versijomis ir nuo to laiko seka kiekvieną „Embarcadero“ leidimą. Šio rašymo metu ji visiškai suderinama su „Delphi 11.1 Alexandria“ ir „Delphi Athens 12.3“

„Alcinoe“ įtraukimas į projektą

Diegimas priklauso nuo vieno klausimo: ar jums reikia projektavimo laiko palaikymo „Alcinoe“ vaizdiniams valdikliams? Jei ne, visiškai praleiskite BPL. Pridėkite {alcinoe_rootdir}\source prie projekto bibliotekos paieškos kelio ir baigta. Kiekvienas nevaizdinis komponentas, įskaitant analizatorius, duomenų bazių klientus ir eilučių programos paslaugas, kompiliuojamas iš šaltinio kodo nieko neregistruojant

Kai jums reikia projektavimo laiko palaikymo, kelias yra šiek tiek ilgesnis. Atidarykite Component > Install Packages „Delphi IDE“ aplinkoje, naršykite iki BPL, atitinkančio jūsų versiją (pavyzdžiui, {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\alexandria\Alcinoe_alexandria.bpl), įdiekite jį ir vis tiek pridėkite {alcinoe_rootdir}\source prie paieškos kelio. BPL užregistruoja komponentus; šaltinio kodų katalogas yra tai, ką kompiliatorius randa, kai kompiliuoja jūsų projektą

„Alcinoe“ pateikia pasirenkamus pataisymus „Embarcadero RTL“ šaltinio kodams. Jei jų norite, eikite į {alcinoe_rootdir}\embarcadero\, pasirinkite savo versijos pakatalogį ir paleiskite update.bat. Skriptas tikisi GIT sistemos PATH kintamajame ir prisiima numatytąją „Embarcadero“ diegimo vietą. Jis atsisiunčia originalų RTL šaltinio kodą ir pritaiko pataisymus. Baigę, pridėkite tą pataisytą šaltinio kodų katalogą prie savo projekto paieškos kelio, kad kompiliatorius jį pasirinktų vietoje tik skaityti skirtos kopijos „Embarcadero“ diegimo medyje. Niekas iš to nėra privaloma norint pradėti; tai svarbu tik tuo atveju, jei susiduriate su klaidomis, kurias išsprendžia pataisymai

„Android“ ir D8 „desugaring“ tarpinis serveris (proxy)

Keli „Alcinoe“ komponentai („WebRTC“, „ExoPlayer“ palaikomas vaizdo įrašas) priklauso nuo „Java“ bibliotekų, naudojančių „Java 8“ kalbos funkcijas. „Android“ įrankių grandinė, pateikiama su senesnėmis „Delphi“ versijomis, DEX konvertavimui naudoja dx.bat, kuri negali apdoroti tų baitkodų žemesniuose nei 26 API lygiuose. Sprendimas yra „desugaring“, kurį D8 apdoroja automatiškai, kai iškviečiamas tiesiogiai. „Alcinoe“ pateikia tarpinio serverio (proxy) skriptą {alcinoe_rootdir}\tools\D8Proxy\dx.bat, kuris nukreipia iškvietimus iš „Delphi“ kūrimo sistemos į D8, padarydamas „desugaring“ procesą skaidrų. Pakeiskite originalų dx.bat savo „Android SDK build-tools“ kataloge (paprastai C:\SDKs\android\build-tools\30.0.3\) šiuo tarpiniu serveriu. „Embarcadero“ sekė pagrindinę problemą RSP-24155; vėlesnės SDK įrankių versijos tai išsprendė tiesiogiai, todėl patikrinkite, ar jūsų dabartinei įrankių grandinei vis dar reikia šio sprendimo

„FireMonkey“ atvaizdavimo problema ir „Alcinoe“ sprendimas

Numatytasis „FireMonkey“ piešimo ciklas tampa siaura vieta gausiai slenkamose vartotojo sąsajose (UI). Vienas TRectangle su užapvalintais kampais perpiešimui gali užtrukti apie 3 ms, nes standartinis įgyvendinimas perskaičiuoja kelią kiekviename kadre. Kai matoma 20 tokių valdiklių, tai prideda iki 60 ms vienam kadro praėjimui, kas apriboja efektyvų kadrų dažnį gerokai žemiau sklandaus slinkimo ribos

„Alcinoe“ išsprendžia tai naudodama GPU reziduojantį buferį kiekvienam valdikliui. Pirmasis piešimas atvaizduoja valdiklį į TTexture, saugomą GPU atmintyje. Vėlesni perpiešimai atvaizduoja tą tekstūrą, užuot pakartotinai vykdę piešimo algoritmą. Išmatuotas rezultatas tame pačiame užapvalintame stačiakampyje nukrenta nuo maždaug 3 ms iki maždaug 0,1 ms. Be buferizavimo, „Alcinoe“ pakeičia „OpenGL“ kelių piešimą pagrindinėms formoms vietinėmis „Android“ ir „iOS“ piešimo API, išvengdama kokybės ir našumo kompromiso, susieto su Form.Quality. Atitinkami valdikliai yra TALRectangle, TALCircle ir patobulintų išdėstymo konteinerių rinkinys, įskaitant ScrollBox ir TabControl

TALJsonDocument: DOM ir SAX viename tipe

TALJsonDocument yra „Alcinoe“ JSON ir BSON analizatorius. Jis palaiko du perėjimo režimus. DOM režimas sukuria atmintyje objekto medį, suteikdamas atsitiktinę prieigą prie bet kurio mazgo atminties sąskaita, proporcinga dokumento dydžiui. SAX režimas iššaukia įvykius, kai analizatorius skaito kiekvieną žetoną, neišlaikydamas jokio medžio, o tai yra teisingas pasirinkimas, kai reikia filtruoti didelį dokumentą ir išsaugoti tik keletą reikšmių. DOM analizatoriai „Delphi“ (DBXJSON, „SuperObject“ ir kiti) paprastai yra nuo trijų iki penkių kartų lėtesni nei SAX metodas tam pačiam turiniui, nes kiekvieno mazgo paskirstymas turi objekto kūrimo pridėtines išlaidas papildomai po paties analizavimo darbo

Tipas seka tuo pačiu mazgų naršymo šablonu kaip ir TALXMLDocument. Minimalus DOM skaitymas atrodo taip:

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 režimui priskirkite anoniminę procedūrą OnParseText prieš iškviesdami LoadFromJSON su antruoju argumentu nustatytu į True. Atgalinio ryšio funkcija gauna mazgo kelią, pavadinimą, reikšmę ir TALJSONNodeSubType, kuris identifikuoja JSON tipą (eilutė, sveikasis skaičius, slankiojo kablelio skaičius, loginis ir pan.). Šis režimas nesukuria krūvos paskirstymų mazgams, todėl jis pritaikomas savavališkai dideliems dokumentams neviršijant atminties biudžeto

TALJsonDocument taip pat skaito ir rašo BSON natūraliai; perduokite True kaip BSON vėliavėlę į LoadFromFile arba SaveToFile. Antrasis variantas, TALJsonDocumentU, viduje naudoja UnicodeString (UTF-16) vietoje AnsiString (UTF-8) kontekstams, kur aplinkinis kodas visur veikia „Unicode“

„MongoDB“ klientas ir ryšių telkimas (connection pooling)

„Alcinoe“ „MongoDB“ tvarkyklė apima įprastas užklausų operacijas ir natūraliai apdoroja ryšių telkimą. Paprastas klientas, TAlMongoDBClient, atidaro ir uždaro vieną ryšį kiekvienai operacijai. Telkinio variantas, TAlMongoDBConnectionPoolClient, palaiko aktyvių ryšių rinkinį ir perduoda vieną kiekvienai iškviečiančiajai gijai iš telkinio, grąžindamas jį, kai iškvietimas baigiamas. Šis modelis neleidžia kelioms gijoms blokuoti vienos kitos ryšio nustatymo metu, o tai svarbu, kai foniniai darbuotojai tuo pačiu metu pateikia užklausas tai pačiai duomenų bazei. Stebimiems žymekliams (tailable cursors) ribotose kolekcijose, TAlMongoDBTailMonitoringThread stebi naujus dokumentus ir iššaukia atgalinį ryšį, kai jie atvyksta, o tai yra standartinis šablonas žurnalų srautiniam perdavimui ar pranešimams apie pakeitimus be apklausos

Kiti komponentai, kuriuos verta žinoti

ALVideoPlayer atvaizduoja vaizdo įrašą į TTexture, o ne į perdengimo langą, todėl kiti „FireMonkey“ valdikliai gali būti virš jo pagal Z tvarką. „Android“ programos užpakalinė dalis naudoja „ExoPlayer“, kuri prideda DASH, HLS ir „SmoothStreaming“ palaikymą viršijančiu tai, ką apdoroja „Android“ integruotas MediaPlayer. „iOS“ programos užpakalinė dalis naudoja AVPlayer su atitinkamu HLS palaikymu

TALWebRTC apgaubia „WebRTC“ krūvą, skirtą tiesioginiam garsui ir vaizdui. Jai nereikia naršyklės ar papildinio, o ryšys praeina NAT per standartinį ICE/STUN/TURN derybų procesą, kurį apdoroja pagrindinė biblioteka

TALStringList pakeičia TStringList AnsiCompareText pagrįstą rūšiavimą nuo lokalės nepriklausomu eilės palyginimu ir greituoju rūšiavimu, kuris dideliuose sąrašuose yra iki 10 kartų greitesnis. Maišytas variantas, TALHashedStringList, prideda vidinę maišos lentelę O(1) paieškai dėl šiek tiek didesnių pridėtinių išlaidų mažuose sąrašuose. Atkreipkite dėmesį, kad TALStringList yra 8 bitų „AnsiString“ sąrašas, o ne „Unicode“; jis puikiai tinka serverio kodui, kur UTF-8 yra darbinė koduotė, o neapdorotas pralaidumas yra svarbesnis nei palyginimas, atsižvelgiant į lokalę

64 bitų „Windows“ sistemoje „FastCode“ paveldas, kuris daugeliui „Alcinoe“ eilučių programos paslaugų suteikė greičio pranašumą (daugiausia ranka rašytas x86 asemblerio kodas), neperkeliamas. „Win64“ versijos grįžta prie „Pascal“ įgyvendinimų, kurie pastebimai lėčiau veikia intensyviai eilutes naudojančiose darbo krūviuose. demo\ALStringBenchMark projektas leidžia išmatuoti atotrūkį jūsų aparatinėje įrangoje prieš įsipareigojant 64 bitų versijai, kur eilučių pralaidumas yra siaura vieta

Visas šaltinio kodas yra adresu github.com/Zeus64/alcinoe