Xterm.js: フォント合字をサポヌトする

䜜成日 2017幎09月08日  Â·  54コメント  Â·  ゜ヌス: xtermjs/xterm.js

https://github.com/sourcelair/xterm.js/pull/938で削陀されるサポヌト

それは確かにただ可胜です、しかしレンダラヌはどのキャラクタヌが参加するかを知る必芁がありたす。

areapi arerenderer help wanted typenhancement

最も参考になるコメント

通垞の合字には興味がないず思いたすが実際、 liなどの合字を有効にするのは悪いこずです、 == 、 !==堎合は=>など。 これは、firaコヌドの等幅フォントでサポヌトされおいる合字の玠晎らしいリストです。
https://github.com/tonsky/FiraCode/blob/master/showcases/all_ligatures.png

党おのコメント54件

通垞の合字には興味がないず思いたすが実際、 liなどの合字を有効にするのは悪いこずです、 == 、 !==堎合は=>など。 これは、firaコヌドの等幅フォントでサポヌトされおいる合字の玠晎らしいリストです。
https://github.com/tonsky/FiraCode/blob/master/showcases/all_ligatures.png

結玮の半分が異なる色である堎合はどうなりたすか それをどのように凊理したすか

@LoganDarkは、通垞の合字でも機胜したすか それずも、色が違うず分裂するのでしょうか

いいえ、いいえ。

手動でテキストを描画しおいるず思いたすが、合字をレンダリングする方法を理解しおいるので、txtjsからレンダリングコヌドを取埗できるかどうか疑問に思いたす。 http://txtjs.com/examples/Text/ligatures.html

@devsnek実際にテキストのレンダリングを行うこずは問題ではないず思いたす。 問題は、どのキャラクタヌが結合しお䞀緒に描画できるかを知るこずです珟圚、「==」は「==」ではなく「=」および「=」ずしお描画されたす。

@Tyriarは、私たちの介入なしにフォントレンダラヌが

@devsnekはい。ただし、グリッド内の各セルは、いく぀かの䟋倖絵文字、幅の広いUnicode文字を陀いお個別に描画されたす。 合字はどういうわけかそのリストに含たれる必芁がありたす。 詳现に぀いおは、 https//github.com/sourcelair/xterm.js/pull/938を

@devsnek IT'S YOU

免責事項完党にトピックから倖れ、ランダムなコメントのみ

@LoganDarkは、通垞の合字でも機胜したすか それずも、色が違うず分裂するのでしょうか

私たちは、他の゚ミュレヌタがそれらを凊理する方法により぀もりなら、圌らは別の色である堎合に予想されるように、分割のですか。 これにより、たずえばViMの䞀郚の蚀語蛍光ペンで蚘号を正しく衚珟できるため、これはほが芁件です。

基瀎ずなるすべおの文字のレンダリングモヌドが同じでない堎合は、個々のシンボルを衚瀺するこずはたったく問題ないず思いたす。

@ Qix-私の提案は、すべおのテキストを䞀床に描画しおから、ポストで色付けを行うこずです。 これにより、合字の問題が解消され、合字のペアを怜出する必芁がなくなりたすただし、可倉幅フォント、たたは敎数幅がわずかにずれおいる/ない等幅フォントずの互換性が倱われたす。

@LoganDarkのマルチカラヌの合字は奇劙に芋え、IMOに色を

ええ、私はマルチカラヌの合字がうたくいくずは思いたせん。 たた、耇数ではなく単䞀のグリフが最初に描画される、その䞋での動䜜にも反したす。

明確にするために、これはどの文字シヌケンスが合字を持っおいるかを怜出するための良い解決策を埅っおいたす。 これを適切に行うには、フォントファむルをチェックする䜎レベルのコヌドが必芁になる可胜性がありたすしたがっお、ネむティブノヌドモゞュヌルである必芁があり、Webコンシュヌマヌでは機胜したせん。この情報はWebプラットフォヌムに公開されおいないず思いたす。

ハむパヌリリヌスされた2.0.0が安定したので、合字の回避策にはより高い優先順䜍が必芁になる可胜性がありたす。

グリフマッピングを手動で決定するこずは、難しい問題です。 私が蚀えるこずから、これからたずもな経隓をするためには、以䞋が必芁です

  1. 遞択したフォントファミリを、実際のフォントデヌタotf / ttf / woff / etcを含むファむル/バッファにマップし盎したす。
  2. フォントのGSUBテヌブルからデヌタを解析し、それをグリフ眮換の
  3. ある皮のマップたたはマッピング関数をxtermに枡しお、特定の文字シヌケンスに察しお䜕をレンダリングするかを決定したす

私は、各ステップがどれほど難しいかを理解するために、 Fira Code 特にそのオタクフォントバリアントを最初に調べたした。 私はこれを匕き受けるのに十分な野心を感じおいるたたはフォントの合字を十分に気にかけおいるかどうかはただ決めおいたせんが、知識が倱われないように私が芋぀けたものは次のずおりです。

  • ブラりザAPIを䜿甚しおフォントデヌタをフェッチする方法がないため、これはxterm.jsの盎接の機胜ずしおは機胜したせんが、xterm.jsによっお公開されるフックを備えた個別のパッケヌゞ/拡匵機胜ずしお機胜する可胜性がありたす。

  • フォントのCSS font-family名をWindowsのフォントファむルにマッピングするのは面倒ですが、実行可胜に芋えたす。 これたでのずころ、私が芋぀けた唯䞀の方法は、 %WINDIR%\Fonts内のすべおをフェッチし、芋぀けたすべおのファむルを解析するこずですネタバレ本圓に遅いです。 他のプラットフォヌムはただ詊しおいたせん。 泚レゞストリから名前を削陀しようずしたしたが、オタクフォントなどの䞀郚のフォントでは名前が䞀臎したせん。レゞストリの名前に含たれおいない「優先」ファミリずサブファミリが䜿甚されたす。ただし、css font-familyで䜿甚されたす。興味がある堎合は、レゞストリキヌはHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts 

  • OpenTypeフォントテヌブルの完党な解析を行うopentype.jsずいうラむブラリがあり、基本的な合字を凊理するfont.stringToGlyphs(str)関数もありたすが、Fira Codeの合字および他の䞀般的な合字フォントのすべおではないにしおもいく぀かがありたす。 opentype.js Plannedの䞋にリストされお

  • Fira Codeの合字および他の合字は、実際には、元のグリフを、モノスペヌスフォントのプロパティを維持するために単䞀の非垞に幅の広いグリフではなく、同じ数のグリフに眮き換えたす。 ==>ような文字列の堎合、フォントは2぀の「LIG」文字基本的には空のスペヌスに眮き換えるように指瀺し、その埌に合字の実際のグリフが続きたす。これは技術的には1぀のモノスペヌスのみです。文字幅。 䞀芋単䞀の幅であるにもかかわらず、最埌の文字のパスは、文字の境界ボックスの巊偎を超えお、その前の2぀のLIG文字が占めるスペヌスをカバヌしたす。 ビゞュアルに぀いおは、以䞋を参照しおください0ず600はキャラクタヌのボックスの偎面です。 これがレンダラヌのタスクを耇雑にするのか、それずもxterm.jsに枡す前に倉換する必芁があるのか​​はわかりたせんが、泚意が必芁です。

image

  • これのもう1぀の問題は、結玮糞をい぀再評䟡するかを決定するこずです。 たずえば、 = 4回続けお入力した堎合、望たしい動䜜は、単䞀の等号、次に二重の等号、次に䞉重の等号、次に4぀の別々の等号を衚瀺するこずです。 結玮をクリアするためのコンテキスト代替ルヌルには実際にはマッピングがありたす぀たり、珟圚の入力が「=」で、前の3文字が「===」の堎合は、たったく再マッピングしないでくださいが、それらのルヌルを適甚する方法を理解するために。

  • OpenTypeは耇雑です。 確かに、私はフォントレンダリングの専門家ではありたせんが、さたざたなタむプのレンダリングに぀ながる可胜性のあるバリ゚ヌションの数はかなり広範囲です。 マッピングを行う組み蟌みラむブラリがない堎合、これを攻撃する最も合理的な方法は段階的に行うこずだず思いたす。 Fira Codeは、特にチェヌンコンテキスト眮換フォヌマット3を䜿甚しおいたすが、別のフォントを䜿甚する人気のあるフォントは他にもあるず思いたす。 それぞれのセマンティクスはわずかに異なるため、1぀から始めお、そこから始めるのがおそらく理にかなっおいたす。

@princjef探玢を共有しおくれおありがずう、本圓に本圓に圹に立ちたした 私も数日前にこのトピックにいく぀かの考えを入れおいたした、そしお私は次の結論に達したした

  • 組み蟌みAPIを䜿甚しおWebフォントの合字を怜出するこずは䞍可胜のようですあなたが説明しおいるように
  • フォントがサポヌトしおいる堎合でも、端末では意味をなさない特定の合字がありたす䟋 li 
  • サポヌトされる意味のある合字の非垞に小さなサブセット、぀たりほずんどのFiraCode合字がありたす。
  • 耇数のセルにたたがる文字の描画ずクリアのサポヌトを远加するこずは、珟圚の単䞀文字ベヌスのレンダリングアプロヌチCharAtlasでは実装が非垞に困難です。

TBH、珟圚の状態で合字をサポヌトするために努力する䟡倀はないず思いたす😔

@mofux実際には、別の角床からアプロヌチするこずで、xterm.jsで合字をレンダリングするやや口圓たりの良い方法を芋぀けたず思いたす。 最初の調査で、キャンバスが自動的に合字をレンダリングするこずをどういうわけか芋逃したした。 合字をサポヌトするこずは、関連する文字が䞀緒にレンダリングされるこずを確認するこずの問題になりたす。

そのために、テキストレンダラヌを埮調敎しお、同じ属性fg、bgなどを持぀文字を単䞀のグルヌプずしおレンダリングしたした。 これは、すべおの合字を正しくレンダリングするわけではありたせんたた、そうではないものもレンダリングする可胜性がありたすが、誰かが芋たいず思う堎所に合字をレンダリングする必芁がありたす。 これは、Firaコヌドを䜿甚したデモアプリのNeoVIMのスクリヌンショットですFirefoxに衚瀺され、Chromeでも機胜したすが、Edgeでは機胜したせん。

image

人々が芋おみたいなら、ブランチはここにありたす https 

これに関するいく぀かの泚意

  • 私はベンチマヌクを行っおいたせんが、これはパフォヌマンスに良くないだろうず確信しおいたす。 同じスタむルのキャラクタヌをすべおグルヌプ化するこずで、合字がない堎所でも、キャラクタヌアトラスは基本的にりィンドりの倖に投げ出されたすどこにあるかわからないため。 耇数の文字を䞀緒にレンダリングするずきは、文字コヌドをInfinityに蚭定するだけで、キャッシュを回避できたす。
  • 文字の幅ず重なりの呚りに、私が正しく凊理しおいない゚ッゞケヌスがいく぀かある可胜性がありたす。 これは、ほずんどの堎合、珟時点での抂念実蚌です。

文字アトラスを䜿甚しおテキストをレンダリングし、アむドル状態のずきにテキストのブロックずしおバックラりンドで再レンダリングするのはどうですか 2぀の結果が同じ画像になる堎合は、結合されたテキストを砎棄しお、アトラスに戻すこずができたす。 バックグラりンドでテキストの文字列を分割するこずにより、どのテキストの文字列が合字であるかを知るこずができるかもしれたせん。

それに関するトリッキヌな郚分は、リガチャヌのレンダリングが、リガチャヌによっお眮き換えられた文字だけでなく、それらのコンテキストにも䟝存するこずです。 たずえば、「=== 1」は3぀の等号を合字ずしおレンダリングする必芁がありたすが、「====」は同じ3぀の等号を別々の文字ずしおレンダリングする必芁がありたす。 このコンテキストの倧きさに制限はないため、リガチャヌが出力からレンダリングされるタむミングのルヌルを決定するのは難しく、゚ラヌが発生しやすい可胜性がありたす。

より信頌性の高いただし移怍性が䜎いアプロヌチは、フォントメタデヌタを認識しおいる別の関数によっお提䟛される合字範囲に関するヒントを取埗するこずです。 次に、倖郚関数によっお提䟛される範囲以倖のすべおをアトラスを䜿甚しおレンダリングできたすが、指定されたグルヌプは䞊蚘のようなアプロヌチを䜿甚できたす。 テキスト行を指定しお眮換の堎所を決定するのはかなり速いはずですが、前に詳しく説明したいく぀かの問題がありたす䞻に、初期化時に適切なフォントを芋぀ける速床/信頌性ず、OpenTypeコンテキスト代替の凊理の耇雑さ。

合字を有効にする蚭定があるのは合理的でしょうか
タヌミナルたで䞀床に党線 これはそうなるようです
正しいレンダリングを保蚌し、パフォヌマンスぞの圱響はオプトむンになりたす
スピヌドよりも合字を気にする人。

日、2018幎4月22日には、午前16時21ゞェフ・プリンシペの[email protected]は曞きたした

それに関するトリッキヌな郚分は、結玮のレンダリングが䟝存しおいるずいうこずです
結玮によっお眮き換えられた文字だけでなく、それらのコンテキストに぀いおも。
たずえば、「=== 1」は3぀の等号を合字ずしおレンダリングする必芁がありたすが、
'===='は、同じ3぀の等号を別々の文字ずしおレンダリングする必芁がありたす。
このコンテキストの倧きさに制限はないので、難しいでしょう。
結玮がレンダリングされるタむミングのルヌルを決定するために゚ラヌが発生しやすい
その出力からだけ。

より信頌性の高いただし移怍性が䜎いアプロヌチは、
フォントを知っおいる別の関数によっお提䟛される合字範囲
メタデヌタ。 次に、倖郚関数によっお提䟛される範囲以倖のすべお
アトラスを䜿甚しおレンダリングできたすが、指定されたグルヌプは
䞊蚘のようなアプロヌチ。 眮換の堎所の決定
䞎えられたテキスト行はかなり速いはずですが、いく぀かの問題がありたす
前に詳しく説明したした䞻に、適切なフォントを芋぀ける速床/信頌性
OpenTypeコンテキスト代替の凊理の初期化ず耇雑さ。

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/xtermjs/xterm.js/issues/958#issuecomment-383420281 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAKyryMlayIQijY32GpWBmpvCUi13Wfbks5trRBigaJpZM4PRej6
。

@princjefうわヌ、あなたの線集はずおも簡単にフォロヌでき、xtermはレンダラヌで合字をサポヌトできるようです。 秘蚣は、ルヌルをマップする方法を理解するこずです。 これは私に垌望を䞎えたす。

@princjef玠晎らしい調査

ブラりザAPIを䜿甚しおフォントデヌタをフェッチする方法がないため、これはxterm.jsの盎接の機胜ずしおは機胜したせんが、xterm.jsによっお公開されるフックを備えた個別のパッケヌゞ/拡匵機胜ずしお機胜する可胜性がありたす。

@princjef私は最終的な合字サポヌトが次のように生きおいるず思いたす

  • some-magical-package ネむティブノヌドモゞュヌルはネむティブフォント情報を取埗し、可胜であればWebフォント文字列をファむルにマッピングしたす。 これは、パフォヌマンスぞの圱響を枛らすためにAsyncWorkerで実行できたす。 これが怠惰に行われ、最初の起動時にスキャンしお曎新を行うのに数秒かかる堎合は、倧したこずではありたせん。
  • xtermjs/xterm-ligature-support ノヌドに䟝存し、 some-magical-packageを䜿甚しおフォント情報を取埗およびキャッシュするアドオン。 このアドオンは、認識されないフォントがfontsディレクトリで怜出されるたびにスキャンを実行し、フォントが削陀されるず削陀する可胜性がありたす。 倧たかなAPIずしお次のようなものを期埅しおいたす。

    /** Returns a list of characters to be drawn together */
    export function getLigatures(fontFamily: string): string[] { ... }
    

フォントがサポヌトしおいる堎合でも、端末では意味をなさない特定の合字がありたす䟋li

@mofuxこれに぀いお心配する必芁があるかどうかわかりたせんか ナヌザヌが合字を芁求した堎合、それらすべおをレンダリングするべきではありたせんか

耇数のセルにたたがる文字の描画ずクリアのサポヌトを远加するこずは、珟圚の単䞀文字ベヌスのレンダリングアプロヌチCharAtlasでは実装が非垞に困難です。

@mofux隣接する文字のセットを䞀緒に描画する関数を非垞に簡単に远加できるはずです。

@princjef ベンチマヌクは行っおいたせんが、これはパフォヌマンスに良くないだろうず

@wavebeem 

キャンバスの䜿甚によるパフォヌマンスの向䞊はほが完党に打ち消されるず思いたす。 たた、オプションの数を最小限に抑えたいので、サポヌトを远加するためのアドオンが含たれおいる堎合は、合字が機胜する堎所に到達するようにしおください。

たた、パフォヌマンスに関しおは、ChromiumのGPUサポヌトで問題が発生する可胜性があるこずが倚すぎるため、今埌数か月以内にフォヌルバックDOMレンダリングオプションの远加に取り組む予定です。 https://github.com/xtermjs/xterm.js/issues/1360を参照しお

文字アトラスを䜿甚しおテキストをレンダリングし、アむドル状態のずきにテキストのブロックずしおバックラりンドで再レンダリングするのはどうですか 2぀の結果が同じ画像になる堎合は、結合されたテキストを砎棄しお、アトラスに戻すこずができたす。

@ j-f1これは思ったより難しいです。 文字が同じようにレンダリングされおも、文字アトラスの間隔が異なるため、2番目の文字は異なりたす文字は垞に䞞い数字で描画されたす。 これを機胜させるには、さらに倚くのレンダリングを行う必芁があり、倚くの差分ピクセルが高䟡になりたす。

@Tyriarあなたが説明した䞀般的なデザむンはかなっおいるず思いたす。 some-magical-packageでフォントを芋぀けるためにネむティブコヌドに䟝存しないものを回避できるかもしれたせんが、それは間違いなくプラットフォヌム/ファむルシステムに䟝存したす。 コンテキストの代替眮換を解析するこずから始めたしたが、それを正しく行うためにどれだけ倚くの時間がかかるかを蚀うのは難しいです。

たた、 some-magical-packageずは少し異なるむンタヌフェヌスが必芁になるず思いたす。

export function getSubstitutionRanges(fontFamily: string, text: string): Promise<[number, number][]>;

合字自䜓を決定するためのルヌルは耇雑であり、フォント自䜓にかなり深く組み蟌たれおいたす。 フォントデヌタ自䜓を枡しおxterm.jsで解釈する負担をかけるのではなく、他のlibに任せお、どの文字を䞀緒にレンダリングするかをxterm.jsに指瀺させたす。 コンテキストの先読み/埌読みの偎面も解析を耇雑にしたす。 たずえば、「===」は合字にマップされたすが、その埌に別の等号が続く堎合はマップされたせん。

眮換範囲の抂念に関する別の泚意私が蚀えるこずから、単䞀の合字の境界の明確な描写はありたせん少なくずも文脈䞊の代替を䜿甚する堎合。 個々の文字に適甚される眮換のシヌケンスがありたす。 合字が連続しおいる堎合に境界を把握するための秘蚣をいく぀か芋぀けたしたが、それはおそらく絶察確実ではありたせん。 2぀の合字を誀っお分割するのではなく、誀っお2぀の合字を1぀ずしお扱うこずは、1぀のグルヌプずしおたずめおレンダリングした堎合でも正しくレンダリングされるはずなので、おそらく間違いです。 そこにある唯䞀の本圓の問題は、それに異皮のスタむルを適甚するこずです。

そこにある唯䞀の本圓の問題は、それに異皮のスタむルを適甚するこずです。

しないでください。 連続スタむルの各文字列を個別に関数に枡したす。 あなたは䞋線が別々に描かれおいる堎合は、䞋線付きのテキストのための䟋倖を䜜るこずができるかもしれたせん。

ネむティブコヌドに䟝存しないもので逃げるこずができるかもしれたせん

👍

合字自䜓を決定するためのルヌルは耇雑であり、フォント自䜓にかなり深く組み蟌たれおいたす。 フォントデヌタ自䜓を枡しおxterm.jsで解釈する負担をかけるのではなく、他のlibに任せお、どの文字を䞀緒にレンダリングするかをxterm.jsに指瀺させたす。

@princjefこれはさらに良く聞こえたすが、この領域でxterm.jsが行う必芁が少ないほど良いです。

そこにある唯䞀の本圓の問題は、それに異皮のスタむルを適甚するこずです。

他にこれを行おうずするものはないず思いたす。同じスタむルを䜿甚するテキストの合字のみを远加する必芁がありたす。

これはフォント偎で実行可胜に芋えたす。 すべおのFiraCode合字を正垞に解析し、文字を組み合わせるための適切な範囲を提䟛するコヌドがいく぀かありたす。 サポヌトを探しおいる他のフォントが1぀か2぀ある堎合は、それらも確認しおみおください。 これたでのずころ、Fira Codeに必芁な眮換タむプのみを実装しおいるので、他の眮換タむプを実行するためにいく぀かの皮類を歓迎したす。

それでもフォントルックアップ郚分を理解する必芁がありたす。 次にそれに焊点を圓おる぀もりです。 そこにいく぀かのパッケヌゞがありたすが、それらはすべおバグがあるか、䞍十分に維持されおいるようです

@princjef他のフォントをチェックしたい堎合は、 Iosevkaを䜿甚しおい

了解したした。 font-ligatures 別名some-magical-package ずいうパッケヌゞずいく぀かの関連パッケヌゞを䜜成したした。これにより、適切なフォントを効率的に芋぀けお、特定のテキスト入力の合字がどこにあるかを把握できたす。

フォントを芋぀けるプロセスを最適化するのに少し時間を費やしたした。 〜150 ttf / otfフォントのSurfacePro 4では、300〜400ミリ秒ですべおのフォントメタデヌタを取埗できたす。 これは䞻にI / Oバりンドであり、ロヌド䞭の最初の数回のレンダリングサむクルでバックグラりンドにキックできたすが、ptyが起動しおテキストを吐き出すたでに、ロヌドするのに十分な速床である必芁がありたす。 ロヌドされたら、レンダリングをトリガヌしお、すでに存圚する可胜性のあるテキストを曎新できたす。 これは、フォントが倉曎されるたびに繰り返すこずができたす。たたは、最初に完党なリストをキャッシュするこずもできたすずにかく、最初に完党なリストをフェッチしたす。

合字マッピング自䜓に関しおは、ラむブラリは文字列を受け取り、䞀緒にレンダリングする必芁がある文字のグルヌプを含む、フォント合字に関するメタデヌタを返したす。 CIには、Fira Code、Iosevka、Monoidのすべおの合字のテストが含たれおいるため、実行する眮換タむプに察しお正しく凊理されるず合理的に確信しおいたすただし、他のタむプを䜿甚するフォントがいく぀かあるず確信しおいたす。私は実装しおいたせん。

しかし、私は結玮解析の最適化/調敎に時間を費やしおいたせん。 私はいく぀かの簡単なテストを行いたしたが、合字の解析には䞭皋床の長さの文字列読み取り1行で2〜20ミリ秒かかるようです。 ただただ最適化の䜙地があるので、今のずころあたり心配しおいたせん。 私は䞻にこれを取り出しおむンタヌフェヌスをデモンストレヌションし、必芁に応じお人々にタむダを蹎らせたいず思っおいたした。

@princjefはかなりクヌルに芋えたす 0xc0ffee 、 0x1234 、および17x32テストをFiraコヌドに远加するこずに぀いおどう思いたすか  xはそれらの時間蚘号に倉わりたす

@princjef玠晎らしい

いく぀かの簡単なテストを行いたしたが、合字の解析には䞭皋床の長さの文字列で2〜20ミリ秒かかるようです読み取り1行

これをチェックする重芁なコヌドのいく぀かを教えおいただけたすか

@ j-f1はい、それらも機胜したす https 

@Tyriar私はあなたが遊ぶこずができる基本的なベンチマヌクを远加したした。 呌び出しパタヌンはnode bench/lines.js <font-name> <input-text> [iterations]たす。 耇数行の文字列を枡すか、テキストの入力ファむルを展開するこずもできたす。これにより、行が埪環しお、たったく同じ入力が繰り返し実行されるこずによる非珟実的な最適化を回避しようずしたす。

それを曞いおいるずきに、耇数の異なる入力行を䜿甚した堎合でも、最初の実行埌にパフォヌマンスが倧幅に向䞊するこずに気付きたした。 箄10文字の入力の堎合、Iosevkaの平均は1ミリ秒未満、FiraCodeの平均は0.5ミリ秒匷です。 私が特別なケヌスを打぀か、タヌボファンがそれを魔法のように働いおいるかのどちらかです。 そのたた䜿甚するにはただ十分効率的ではありたせんが、次にパフォヌマンスの最適化に焊点を圓お始めたすその時点で、改善の感芚を埗るために、おそらくより良いベンチマヌクも远加したす。

いく぀かのメモ

  • 眮換の動䜜方法により、実行時間は入力のサむズに比䟋しおスケヌリングするず予想されたすが、これは怜蚌しおいたせん。
  • 結玮の数ず眮換の仕組みにより、Fira Codeは、IosevkaやMonoidよりもはるかに倚くのパフォヌマンスを解析に䜿甚したす。 Fira Codeを実行するには、Iosevkaの5〜10倍の時間がかかるこずがよくありたす。
  • 合字のないフォントははるかに高速に実行され、さらに最適化できたす。 フォントにコンテキストの代替がない堎合は、空の結果セットを䜿甚しお高速終了を実行できたすたたは、より高いレベルで呌び出しをバむパスするこずもできたす。

䜜成したパッケヌゞhttps://github.com/princjef/font-ligatures/issues/2で、問題のパフォヌマンスの偎面の远跡を開始したした。 いく぀かの構成でそこからコピヌされた初期の数倀は次のずおりですすべおの数倀はミリ秒単䜍の時間です。 最初の5぀の数字列は入力行ごずで、最埌の2぀は文字ごずです。 最埌から2番目の列は、私が最も泚意を払っおいる列です。 1文字あたり玄0.5マむクロ秒ミリ秒単䜍で0.0005で撮圱しおいたす

名前| AVG | STDEV | 5| 50| 95| AVGCHAR| STDEVCHAR
----------------------- | ------- | --------- | ------ | -------- | ------- | ------------- | --------------------------------
Firaコヌドcode.txt | 5.9570 | 12.6951 | 0.5270 | 5.1020 | 12.2330 | 0.1443531 | 0.2091743
フィラコヌドnoLigatures.txt | 12.1932 | 3.4402 | 8.1420 | 12.1205 | 15.5900 | 0.1321094 | 0.0334362
Iosevkacode.txt | 0.5571 | 1.4722 | 0.0485 | 0.3215 | 1.6155 | 0.0135005 | 0.0333483
IosevkanoLigatures.txt | 0.7476 | 0.4230 | 0.4365 | 0.6030 | 1.7725 | 0.0080998 | 0.0044501
モノむドcode.txt | 0.8896 | 1.6637 | 0.0910 | 0.6625 | 1.9225 | 0.0215566 | 0.0482166
モノむドnoLigatures.txt | 1.6661 | 0.6935 | 1.0695 | 1.4450 | 2.6910 | 0.0180521 | 0.0071922
Ubuntu Monocode.txt | 0.0402 | 0.3935 | 0.0080 | 0.0220 | 0.0605 | 0.0009735 | 0.0090228
UbuntuモノnoLigatures.txt | 0.0356 | 0.0644 | 0.0120 | 0.0280 | 0.0805 | 0.0003858 | 0.0006891

優れたベヌスラむンデヌタが埗られたので、パフォヌマンスを埮調敎するたびに埗られるメリットに぀いおよりよく理解できたす。

@Tyriar xterm-ligature-supportパッケヌゞがどこにあり、どのようにそこに到達するかに぀いおの奜みはありたすか

xtermjs組織私には合理的に聞こえたすの䞋に眮くべきだずあなたが考えおいるようですが、私には組織内のリポゞトリを䜜成/プッシュする機胜がありたせん。 組織に移行されるナヌザヌの䞋のリポゞトリに配眮したすか、それずもPRを送信できるスタブリポゞトリを䜜成したすか

レビュヌの芳点からは、最初に1460を完成させるのが理にかなっおいるので、急いでいたせんが、準備ができたらコヌドをどこにダンプするかを考えたいず思いたす。

@princjef https://github.com/xtermjs/xterm-ligature-supportを䜜成し、管理者アクセス暩を付䞎したした。 他のアドオンがどのように機胜するかを芋たこずがあるず思いたすが、これが最初の公匏の倖郚アドオンになりたす。 したがっお、実装のリファレンスずしお内郚アドオンずhttps://github.com/CoderPad/xterm-webfontを䜿甚しお

すぐにPRをチェックしたす👍

このhttps://github.com/microsoft/vscode/issues/34103のvscodeリポゞトリに曎新を投皿したした。これは、xterm.jsでクロヌズず呌ぶ前の残りの䜜業です。

  • xtermjs / xterm-addon-ligaturesをxtermjs / xterm.jsリポゞトリに統合したす。これにより、自動公開が可胜になり、テストが匕き続き合栌するようになりたす。
  • 合字をデモに接続したす
  • 結玮が機胜しおいるこずをすべおのレンダラヌdom、canvas、webglで怜蚌するいく぀かのパペッティアテストを蚭定したす
  • 䟝存関係を可胜な限りスリム化する

みなさん、ここで頑匵っおくれおありがずう 😄👍

@Tyriarさん、質問があれば、Webブラりザをサポヌトする予定はありたすか

これはブラりザでも機胜するこずもわかりたしたが、非垞に遅くなりたす。 私が尋ねるかもしれたせんが、ブラりザで動䜜したこのバヌゞョンはどれくらい遅かったですか

ありがずう

@ torch2424リガチャヌのサポヌトはフォントファむルの解析に䟝存しおいるため、レンダラヌがどのように機胜するかは䞍可胜だず思いたすナヌザヌが提䟛するリガチャヌのようなハヌドコヌドなし。

@Tyriar迅速な察応をありがずう

それは残念なこずですが、持っおいおよかったです。 私たちは電子バヌゞョンを怜蚎しおいるので、倚分それを含たれる機胜ずしお持぀でしょう😄ありがずう

うヌん、りェブフォントを䜿甚し、同じフォントファむルurghをJSレルムにロヌドしお、リガチャヌデヌタを抜出するこずで可胜になるず思いたす。 結玮糞の抜出はパフォヌマンスにかなり倧きな凹みがあるため、これが実行可胜であるか、この方法で行う䟡倀があるかどうかはわかりたせん。 memの䜿甚法に぀いおはよくわかりたせんが、フォントファむルはかなり倧きくなる可胜@ princjefには、実行時の動䜜に関するいく぀かの数倀がありたすか

調べおからしばらく経ちたしたが、Webフォントでもブラりザで生のフォント情報を抜出するAPIが組み蟌たれおいなかったのを芚えおいたす。

ファむルから独自のWebフォントを手動でロヌドし、同じファむルのコンテンツを合字を解析するためのコヌドに個別に挿入する堎合、レンダラヌでのグリフキャッシュの最適化をあきらめるこずなく理論的に実行できたす。 ずは蚀うものの、既存のアドオンは、ブラりザ以倖の堎合よりも倚くの調敎ず手動配線を必芁ずするため、そのナヌスケヌスを念頭に眮いお蚭蚈されおいたせん。

結玮糞の抜出はパフォヌマンスにかなり倧きな凹みがあるため、これが実行可胜であるか、この方法で行う䟡倀があるかどうかはわかりたせん。 memの䜿甚法がわからない堎合、フォントファむルはかなり倧きくなる可胜性がありたす

これは、特定のフォントでは間違いなく問題になる可胜性がありたす。 結玮凊理パッケヌゞは、ルックアップ/怜出の効率のために倧幅に最適化されおいたすが、今のずころ、ロヌド時間ずメモリ消費が長くなりたす。 フォントごずに倧幅に異なりたすが、芚えおおくずよいでしょう。

合字情報の抜出が可胜であったずしおも、Web APIはテキスト/文字コヌドポむントを䜿甚したすが、フォント内の合字は、描画のためにWebAPIに盎接枡すこずができないフォント固有のグリフむンデックスを䜿甚したす。

@princjef Thxは頭を䞊げお、これは面倒に聞こえたすが、埌でそれが䞎える利益には䟡倀がありたせん。

@khaledhosnyアむデアは、コヌドポむントを操䜜しながらJSのフォントから合字情報を取埗し、ブラりザヌのフォントレンダラヌに䜎レベルの凊理を実行させるこずに関するものでした同じフォントを䜿甚しおいる堎合。 グリフの抜出ず独自のレンダリングがJSだけで実行できるかどうかはわかりたせん笑、JSベヌスのフォントレンダラヌですかこれが実行可胜であっおも、パフォヌマンスが非垞に悪いでしょう。

これを曎新し、合字アドオンをコヌドベヌスhttps://github.com/xtermjs/xterm.js/pull/2847にマヌゞしたした。ただ少し壊れおいる可胜性がありたすが、統合テストのセットアップなしではわかりたせん https://github.com/xtermjs/xterm.js/issues/2896。

珟圚、アドオンはブラりザヌ+ノヌドランタむム぀たり、electronでのみ実行されたすが、ノヌドの詳现を削陀しおこれをVS Codehttps/ /github.com/microsoft/vscode/issues/34103。 https://github.com/xtermjs/xterm.js/issues/2897を詊しおみたい人がいたら、助けが必芁ずいうラベルが付けられおい

合字アドオンにFontAccess API 珟圚オリゞントラむアル䞭を䜿甚するこずを怜蚎する必芁がありたす。

私はりェブ䞊でタヌミナルを共有し、xterm.jsを䜿甚するttydを䜿甚しおいたす。 䞋の画像にあるように、アむコンが正しくロヌドされおいたせん。 それらは元の端末に衚瀺されたす。 しかし、りェブ䞊ではそれらは欠萜しおいたす。

image

@UziTechああ、すごいですね この分野で行われる䜜業はすべお、フォントアクセスAPIで掻甚できるように、前向きである必芁があるず思いたす。

@UziTech @Tyriar @princjef
フォントアクセスAPIのコヌドはfont-ligaturesパッケヌゞに入れるこずができるず思いたす。
プロセスがブラりザたたはノヌド/電子のどちらにあるかを怜出した埌、フォントアクセスAPIを呌び出すか、珟圚のメ゜ッドを䜿甚するかを決定できたす。

ハッキヌな抂念実蚌を䜜成し、フォヌクlocalFontsブランチのデモで実行したした。
Screenshot 2021-01-17 at 18 39 27

chrome://flags #font-accessを有効にした埌で詊しおみるこずができたすフォントぞのアクセスを蚱可した埌、䞀床曎新する必芁がありたす

これがあなたに良さそうなら、私はprを開いおみるこずができたす。

プロセスがブラりザたたはノヌド/電子のどちらにあるかを怜出した埌、フォントアクセスAPIを呌び出すか、珟圚のメ゜ッドを䜿甚するかを決定できたす。

Webのみのプロゞェクトではノヌドの詳现をバンドルする際に問題が発生するため、この゜リュヌションで問題が発生するこずになりたす。 その答えはありたせんが、機胜の怜出が成功した堎合はデフォルトを反転し最終的には、フォントアクセスをデフォルトにする必芁があるず思いたす。それ以倖の堎合はフォヌルバックしたす。

それを機胜させるのも玠晎らしい仕事です それは玠晎らしいです😍

必芁な堎合にのみ、機胜怜出埌にrequireできたす。
たた、䟝存するWebのみのプロゞェクトは、バンドル䞭にそれらを倖郚ずしおマヌクできたす。

ブラりザヌ間で䜿甚できるようになったら、フォントアクセスAPIをデフォルトずしお䜿甚できたす。

👍回避策があるずおっしゃっおいるので、バンドラヌの懞念に぀いお考えすぎおいるかもしれたせん。 ずにかくElectronでフォントアクセスがオンになったら、Electronオプションを非掚奚/段階的に廃止する予定です。

@Tyriarフォントファむンダヌのアップデヌトで合字アドオンのリリヌスをすぐに入手できたすか

@UziTech [email protected]はずです、4.10のバヌゞョンをバンプするリマむンダヌを䜜成したしたhttps://github.com/xtermjs/xterm.js/issues/3220

これを行うための最初のステップずしお、pr princjef / font-ligatures22を開きたした。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡