Alcinoe е библиоÑека Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñи Ñ Ð¾ÑвоÑен код за Delphi и C++Builder, ÑазÑабоÑвана в GitHub Ð¾Ñ Zeus64. Ð¢Ñ Ð¿Ð¾ÐºÑива облаÑÑи, коиÑо VCL и FireMonkey RTL оÑÑавÑÑ Ð½Ð° вÑнÑни доÑÑавÑиÑи: видео плейÑÑ Ñ GPU ÑÑкоÑение, WebRTC обвивка, оÑигинални iOS и Android конÑÑолки за вÑвеждане на ÑекÑÑ, двÑÑежимен JSON/BSON паÑÑеÑ, MongoDB ÐºÐ»Ð¸ÐµÐ½Ñ Ñ Ð¿Ð¾Ð´Ð´ÑÑжане на пÑл Ð¾Ñ Ð²ÑÑзки, ImageMagick обвивка и Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ FireMonkey конÑÑолки, коиÑо изÑÑло заобикалÑÑ ÑÑандаÑÑÐ½Ð¸Ñ Ð³ÑаÑиÑен конвейеÑ. ÐиблиоÑекаÑа изгÑади имеÑо Ñи на веÑÑииÑе Rio (10.3.3) и Sydney (10.4.2) и оÑÑогава Ñледва вÑÑка веÑÑÐ¸Ñ Ð½Ð° Embarcadero. ÐÑм моменÑа на пиÑане ÑÑ Ðµ напÑлно ÑÑвмеÑÑима Ñ Delphi 11.1 Alexandria и Delphi Athens 12.3.
ÐобавÑне на Alcinoe в пÑоекÑ
ÐнÑÑалаÑиÑÑа завиÑи Ð¾Ñ ÐµÐ´Ð¸Ð½ вÑпÑоÑ: необÑ
одима ли ви е поддÑÑжка по вÑеме на ÑазÑабоÑка (design-time) за визÑалниÑе конÑÑолки на Alcinoe? Ðко не, пÑопÑÑнеÑе изÑÑло BPL Ñайла. ÐобавеÑе {alcinoe_rootdir}\source кÑм пÑÑÑ Ð·Ð° ÑÑÑÑене на библиоÑеки (library search path) на пÑоекÑа и ÑÑе гоÑови. ÐÑеки невизÑален компоненÑ, вклÑÑиÑелно паÑÑеÑиÑе, клиенÑиÑе за бази данни и инÑÑÑÑменÑиÑе за низове, Ñе компилиÑа Ð¾Ñ Ð¸Ð·Ñ
Ð¾Ð´Ð½Ð¸Ñ ÐºÐ¾Ð´ без нÑжда Ð¾Ñ Ð´Ð¾Ð¿ÑлниÑелна ÑегиÑÑÑаÑиÑ.
Ðко обаÑе Ñе нÑждаеÑе Ð¾Ñ Ð¿Ð¾Ð´Ð´ÑÑжка по вÑеме на ÑазÑабоÑка, пÑоÑеÑÑÑ Ðµ малко по-дÑлÑг. ÐÑвоÑеÑе Component > Install Packages в Delphi IDE, намеÑеÑе BPL Ñайла, ÑÑоÑвеÑÑÑÐ²Ð°Ñ Ð½Ð° ваÑаÑа веÑÑÐ¸Ñ (напÑÐ¸Ð¼ÐµÑ {alcinoe_rootdir}\lib\bpl\alcinoe\Win32\alexandria\Alcinoe_alexandria.bpl), инÑÑалиÑайÑе го и Ñлед Ñова добавеÑе {alcinoe_rootdir}\source кÑм пÑÑÑ Ð·Ð° ÑÑÑÑене. BPL ÑайлÑÑ ÑегиÑÑÑиÑа компоненÑиÑе, а диÑекÑоÑиÑÑа Ñ Ð¸Ð·Ñ
Ð¾Ð´Ð½Ð¸Ñ ÐºÐ¾Ð´ е Ñова, коеÑо компилаÑоÑÑÑ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° пÑи компилиÑанеÑо на ваÑÐ¸Ñ Ð¿ÑоекÑ.
Alcinoe пÑедлага незадÑлжиÑелни паÑове (patches) за изÑ
Ð¾Ð´Ð½Ð¸Ñ ÐºÐ¾Ð´ на Embarcadero RTL. Ðко иÑкаÑе да ги пÑиложиÑе, оÑидеÑе на {alcinoe_rootdir}\embarcadero\, избеÑеÑе поддиÑекÑоÑиÑÑа за ваÑаÑа веÑÑÐ¸Ñ Ð¸ ÑÑаÑÑиÑайÑе update.bat. СкÑипÑÑÑ Ð¸Ð·Ð¸Ñква GIT да бÑде добавен в ÑиÑÑÐµÐ¼Ð½Ð¸Ñ Ð¿ÑÑ (PATH) и пÑедполага ÑÑандаÑÑна инÑÑалаÑÐ¸Ñ Ð½Ð° Embarcadero. Той извлиÑа оÑÐ¸Ð³Ð¸Ð½Ð°Ð»Ð½Ð¸Ñ RTL изÑ
оден код и пÑилага паÑовеÑе. След каÑо пÑиклÑÑиÑе, добавеÑе Ñази паÑнаÑа диÑекÑоÑÐ¸Ñ ÐºÑм пÑÑÑ Ð·Ð° ÑÑÑÑене на ваÑÐ¸Ñ Ð¿ÑоекÑ, за да може компилаÑоÑÑÑ Ð´Ð° Ñ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° пÑеди копиеÑо в инÑÑалаÑионноÑо дÑÑво на Embarcadero. ÐиÑо Ð¾Ñ Ñова не е задÑлжиÑелно за наÑална ÑабоÑа; Ñо е важно Ñамо ако Ñе ÑблÑÑкаÑе Ñ Ð¿Ñоблеми, коиÑо паÑовеÑе оÑÑÑÑанÑваÑ.
Android и пÑокÑиÑо за D8 desugaring
ÐÑкои компоненÑи на Alcinoe (WebRTC, видео базиÑано на ExoPlayer) завиÑÑÑ Ð¾Ñ Java библиоÑеки, коиÑо Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ ÐµÐ·Ð¸ÐºÐ¾Ð²Ð¸ ÑÑнкÑии на Java 8. ÐнÑÑÑÑменÑиÑе за Android, коиÑо Ñе доÑÑавÑÑ Ñ Ð¿Ð¾-ÑÑаÑиÑе веÑÑии на Delphi, Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ dx.bat за DEX конвеÑÑиÑане, коеÑо не поддÑÑжа Ñези байÑкодове пÑи нива на API под 26. РеÑениеÑо е desugaring, коеÑо D8 ÑпÑавлÑва авÑомаÑиÑно, когаÑо Ñе извика диÑекÑно. Alcinoe пÑедоÑÑÐ°Ð²Ñ Ð¿ÑокÑи ÑкÑÐ¸Ð¿Ñ Ð½Ð° адÑÐµÑ {alcinoe_rootdir}\tools\D8Proxy\dx.bat, койÑо пÑепÑаÑа извикваниÑÑа Ð¾Ñ ÑиÑÑемаÑа за компилиÑане на Delphi кÑм D8, пÑавейки desugaring напÑлно пÑозÑаÑен. ÐаменеÑе оÑÐ¸Ð³Ð¸Ð½Ð°Ð»Ð½Ð¸Ñ dx.bat вÑв ваÑаÑа Android SDK build-tools диÑекÑоÑÐ¸Ñ (обикновено C:\SDKs\android\build-tools\30.0.3\) Ñ Ñова пÑокÑи. Embarcadero пÑоÑледи Ñози пÑоблем в RSP-24155; по-новиÑе веÑÑии на SDK инÑÑÑÑменÑиÑе го адÑеÑиÑÐ°Ñ Ð´Ð¸ÑекÑно, Ñака Ñе пÑовеÑеÑе дали ÑекÑÑиÑе ви инÑÑÑÑменÑи за ÑазÑабоÑка вÑе оÑе Ð¸Ð¼Ð°Ñ Ð½Ñжда Ð¾Ñ Ñова ÑеÑение.
ÐÑоблемÑÑ Ñ ÑендеÑиÑанеÑо вÑв FireMonkey и ÑеÑениеÑо на Alcinoe
СÑандаÑÑниÑÑ ÑикÑл на изÑеÑÑаване на FireMonkey Ñе пÑевÑÑÑа в пÑеÑка пÑи инÑеÑÑейÑи Ñ Ð¸Ð½Ñензивно ÑкÑолиÑане. Само един ÐµÐ»ÐµÐ¼ÐµÐ½Ñ TRectangle ÑÑÑ Ð·Ð°Ð¾Ð±Ð»ÐµÐ½Ð¸ Ñгли може да оÑнеме около 3 ms за пÑеÑиÑÑване, ÑÑй каÑо ÑÑандаÑÑнаÑа имплеменÑаÑÐ¸Ñ Ð¸Ð·ÑиÑлÑва пÑÑÑ Ð¾Ñново на вÑеки кадÑÑ. ÐÑи 20 видими Ñакива компоненÑа Ñова пÑави обÑо 60 ms за кадÑÑ, коеÑо огÑаниÑава еÑекÑивнаÑа кадÑова ÑеÑÑоÑа Ð´Ð°Ð»ÐµÑ Ð¿Ð¾Ð´ нÑÐ¶Ð½Ð¸Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ñм за плавно движение.
Alcinoe ÑеÑава Ñози пÑоблем Ñ Ð±ÑÑÐµÑ Ð² GPU памеÑÑа за вÑÑка конÑÑолка. ÐÑи пÑÑвоÑо ÑиÑÑване компоненÑÑÑ Ñе ÑендеÑиÑа до TTexture, запиÑана в памеÑÑа на гÑаÑиÑÐ½Ð¸Ñ Ð¿ÑоÑеÑоÑ. ÐоÑледваÑиÑе ÑиÑÑÐ²Ð°Ð½Ð¸Ñ Ð¿ÑеÑ
вÑÑлÑÑ (blit) Ñази ÑекÑÑÑÑа, вмеÑÑо да изпÑлнÑÐ²Ð°Ñ Ð¾Ñново ÑÐµÐ»Ð¸Ñ Ð°Ð»Ð³Ð¾ÑиÑÑм за изÑеÑÑаване. ÐзмеÑениÑÑ ÑезÑлÑÐ°Ñ Ð·Ð° ÑÑÑÐ¸Ñ Ð·Ð°Ð¾Ð±Ð»ÐµÐ½ пÑавоÑгÑлник пада Ð¾Ñ Ð¾ÐºÐ¾Ð»Ð¾ 3 ms до около 0,1 ms. ÐÑвен Ñова бÑÑеÑиÑане, Alcinoe Ð·Ð°Ð¼ÐµÐ½Ñ ÑеÑÑанеÑо на пÑÑиÑа пÑез OpenGL за оÑновни ÑоÑми Ñ Ð²Ð³ÑадениÑе API за ÑиÑÑване на Android и iOS, заобикалÑйки компÑомиÑа каÑеÑÑво/пÑоизводиÑелноÑÑ, ÑвÑÑзан Ñ Form.Quality. СÑоÑвеÑниÑе конÑÑолки Ñа TALRectangle, TALCircle и Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ Ð¿Ð¾Ð´Ð¾Ð±Ñени конÑейнеÑи за оÑоÑмление, вклÑÑиÑелно ScrollBox и TabControl.
TALJsonDocument: DOM и SAX в един Ñип
TALJsonDocument е JSON и BSON паÑÑеÑÑÑ Ð½Ð° Alcinoe. Той поддÑÑжа два Ñежима на обÑ
ождане. РежимÑÑ DOM изгÑажда обекÑно дÑÑво в памеÑÑа, коеÑо дава пÑоизволен доÑÑÑп до вÑеки вÑзел за ÑмеÑка на памеÑ, пÑопоÑÑионална на ÑазмеÑа на докÑменÑа. РежимÑÑ SAX задейÑÑва ÑÑбиÑиÑ, докаÑо паÑÑеÑÑÑ ÑеÑе вÑеки Ñокен, без да запазва дÑÑво в памеÑÑа, коеÑо е пÑавилниÑÑ Ð¸Ð·Ð±Ð¾Ñ, когаÑо ÑÑÑбва да ÑилÑÑиÑаÑе голÑм докÑÐ¼ÐµÐ½Ñ Ð¸ да ÑÑÑ
ÑаниÑе Ñамо нÑколко ÑÑойноÑÑи. DOM паÑÑеÑиÑе в Delphi (DBXJSON, SuperObject, и дÑÑги) обикновено Ñа ÑÑи до Ð¿ÐµÑ Ð¿ÑÑи по-бавни Ð¾Ñ SAX подÑ
ода за едно и ÑÑÑо ÑÑдÑÑжание, ÑÑй каÑо вÑÑко заделÑне на вÑзел ноÑи ÑазÑ
оди за ÑÑздаване на обекÑи вÑÑÑ
Ñ ÑамаÑа ÑабоÑа по паÑÑванеÑо.
ТипÑÑ Ñледва ÑÑÑÐ¸Ñ Ð¼Ð¾Ð´ÐµÐ» на навигаÑÐ¸Ñ Ð¿Ð¾ вÑзли каÑо TALXMLDocument. Ðинимално ÑеÑене ÑÑез DOM изглежда Ñака:
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 пÑиÑвоеÑе анонимна пÑоÑедÑÑа кÑм OnParseText, пÑеди да извикаÑе LoadFromJSON Ñ Ð²ÑоÑи аÑгÑменÑ, зададен на True. Callback ÑÑнкÑиÑÑа полÑÑава пÑÑÑ Ð½Ð° вÑзела, имеÑо, ÑÑойноÑÑÑа и TALJSONNodeSubType, койÑо иденÑиÑиÑиÑа JSON Ñипа (низ, ÑÑло ÑиÑло, плаваÑа запеÑаÑ, бÑлева ÑÑойноÑÑ Ð¸ Ñ.н.). Този Ñежим не ÑÑздава заделÑÐ½Ð¸Ñ Ð² Ñ
ийпа (heap allocations) за вÑзли, Ñака Ñе може да ÑабоÑи Ñ Ð¿Ñоизволно големи докÑменÑи, без да пÑевиÑава бÑджеÑа за памеÑ.
TALJsonDocument ÑÑÑо Ñака ÑеÑе и запиÑва BSON наÑивно; пÑедайÑе True каÑо BSON Ñлаг кÑм LoadFromFile или SaveToFile. ÐÑоÑи ваÑианÑ, TALJsonDocumentU, иÑполÑзÑÐµÑ Ð²ÑÑÑеÑно UnicodeString (UTF-16) вмеÑÑо AnsiString (UTF-8) за конÑекÑÑи, пÑи коиÑо оÑÑаналаÑа ÑаÑÑ Ð¾Ñ ÐºÐ¾Ð´Ð° ÑабоÑи изÑÑло Ñ Unicode.
MongoDB ÐºÐ»Ð¸ÐµÐ½Ñ Ð¸ пÑл Ð¾Ñ Ð²ÑÑзки
MongoDB дÑайвеÑÑÑ Ð½Ð° Alcinoe покÑива оÑновниÑе заÑвки и ÑпÑавлÑва пÑла Ð¾Ñ Ð²ÑÑзки наÑивно. ÐбикновениÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ TAlMongoDBClient оÑваÑÑ Ð¸ заÑваÑÑ ÐµÐ´Ð½Ð° вÑÑзка на опеÑаÑиÑ. ÐÑлиÑаниÑÑ Ð²Ð°ÑÐ¸Ð°Ð½Ñ TAlMongoDBConnectionPoolClient поддÑÑжа Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ Ð°ÐºÑивни вÑÑзки, пÑедоÑÑÐ°Ð²Ñ ÐµÐ´Ð½Ð° на вÑÑка извикваÑа ниÑка Ð¾Ñ Ð¿Ñла и Ñ Ð²ÑÑÑа пÑи завÑÑÑване на повикванеÑо. Този модел пÑедоÑвÑаÑÑва взаимноÑо блокиÑане на множеÑÑво ниÑки пÑи ÑÑÑановÑване на вÑÑзка, коеÑо е важно, когаÑо Ñонови пÑоÑеÑи изпÑаÑÐ°Ñ Ð·Ð°Ñвки кÑм една и ÑÑÑа база данни едновÑеменно. Ðа tailable cursors вÑÑÑ
Ñ Ð¾Ð³ÑаниÑени колекÑии (capped collections), ниÑкаÑа TAlMongoDBTailMonitoringThread Ñледи за нови докÑменÑи и задейÑÑва извикване, когаÑо Ñе пÑиÑÑигнаÑ, коеÑо е ÑÑандаÑÑниÑÑ Ð¿Ð¾Ð´Ñ
од за поÑоÑно пÑедаване на лог Ñайлове или извеÑÑÑване за пÑомени без ÑегÑлÑÑно запиÑване (polling).
ÐÑÑги компоненÑи, коиÑо Ñи ÑÑÑÑва да знаеÑе
ALVideoPlayer ÑендеÑиÑа видео в TTexture, а не в наÑÐ»Ð°Ð³Ð²Ð°Ñ Ñе пÑозоÑÐµÑ (overlay window), Ñака Ñе дÑÑги FireMonkey компоненÑи Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° Ñе ÑÐ°Ð·Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ Ð½Ð°Ð´ него по Z-Ñед. ÐаднаÑа ÑаÑÑ (backend) за Android използва ExoPlayer, койÑо Ð´Ð¾Ð±Ð°Ð²Ñ Ð¿Ð¾Ð´Ð´ÑÑжка за DASH, HLS и SmoothStreaming над вÑзможноÑÑиÑе на вгÑÐ°Ð´ÐµÐ½Ð¸Ñ Ð² Android MediaPlayer. ÐаднаÑа ÑаÑÑ Ð·Ð° iOS използва AVPlayer Ñ ÐµÐºÐ²Ð¸Ð²Ð°Ð»ÐµÐ½Ñна поддÑÑжка за HLS.
TALWebRTC обвива WebRTC ÑÑека за диÑекÑна (peer-to-peer) аÑдио и видео вÑÑзка. Ðе изиÑква бÑаÑзÑÑ Ð¸Ð»Ð¸ плÑгин, а вÑÑзкаÑа пÑеминава пÑез NAT ÑÑез ÑÑандаÑÑноÑо ICE/STUN/TURN ÑÑглаÑÑване, коеÑо Ñе ÑпÑавлÑва Ð¾Ñ Ð±Ð°Ð·Ð¾Ð²Ð°Ñа библиоÑека.
TALStringList Ð·Ð°Ð¼ÐµÐ½Ñ ÑоÑÑиÑанеÑо на TStringList, базиÑано на AnsiCompareText, Ñ Ð½ÐµÐ·Ð°Ð²Ð¸Ñима Ð¾Ñ Ð»Ð¾ÐºÐ°Ð»Ð° оÑдинална ÑÑпоÑÑавка и алгоÑиÑÑм quicksort, койÑо е до 10 пÑÑи по-бÑÑз пÑи големи ÑпиÑÑÑи. ХеÑиÑаниÑÑ Ð²Ð°ÑÐ¸Ð°Ð½Ñ TALHashedStringList Ð´Ð¾Ð±Ð°Ð²Ñ Ð²ÑÑÑеÑна Ñ
ÐµÑ ÑаблиÑа за O(1) ÑÑÑÑене за ÑмеÑка на малко по-големи накладни ÑазÑ
оди пÑи малки ÑпиÑÑÑи. ÐмайÑе пÑедвид, Ñе TALStringList е 8-биÑов ÑпиÑÑк Ð¾Ñ Ñип AnsiString, а не Unicode; Ñой е подÑ
одÑÑ Ð·Ð° ÑÑÑвÑÑен код, кÑдеÑо UTF-8 е ÑабоÑноÑо кодиÑане и ÑÑÑоваÑа пÑоизводиÑелноÑÑ Ðµ по-важна Ð¾Ñ ÑÑавнениÑÑа, ÑÑобÑазени Ñ Ð»Ð¾ÐºÐ°Ð»Ð°.
ÐÑи 64-биÑов Windows наÑледÑÑвоÑо Ð¾Ñ FastCode, коеÑо оÑигÑÑÑваÑе ÑкоÑоÑÑноÑо пÑедимÑÑво на много Ð¾Ñ Ð½Ð¸Ð·Ð¾Ð²Ð¸Ñе пÑоÑедÑÑи на Alcinoe (главно ÑÑÑно пиÑан x86 аÑемблеÑ), не Ñе пÑенаÑÑ. ÐеÑÑииÑе за Win64 Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ ÑÑандаÑÑни Pascal имплеменÑаÑии, коиÑо ÑабоÑÑÑ Ð·Ð°Ð±ÐµÐ»ÐµÐ¶Ð¸Ð¼Ð¾ по-бавно пÑи инÑензивни наÑоваÑÐ²Ð°Ð½Ð¸Ñ Ñ Ð½Ð¸Ð·Ð¾Ð²Ðµ. ÐÑоекÑÑÑ demo\ALStringBenchMark ви позволÑва да измеÑиÑе ÑазликаÑа на ваÑÐ¸Ñ Ñ
аÑдÑеÑ, пÑеди да избеÑеÑе 64-биÑов билд в ÑлÑÑаиÑе, когаÑо обÑабоÑкаÑа на низове е ÑÑÑно мÑÑÑо.
ЦелиÑÑ Ð¸Ð·Ñ Ð¾Ð´ÐµÐ½ код е налиÑен на github.com/Zeus64/alcinoe.