Pixi.js: 提案テキストレンダリングの改善

䜜成日 2020幎04月05日  Â·  27コメント  Â·  ゜ヌス: pixijs/pixi.js

コミュニティはそれを蚀っおいたす-Pixiのテキストレンダリングパフォヌマンスは改善する必芁がありたす。 この問題は、私たちがどのように改善できるか、そしお私が考えるものが提䟛するための最良の方法であるこずに専念しおいたす。

  • 笊号付き距離フィヌルドこの手法は、テキストをテクスチャにレンダリングしCanvas 2D APIを䜿甚、距離倉換を適甚したす。 簡単に蚀うず、距離倉換は、出力テクスチャの各ピクセルの倀を、入力テクスチャのテキストの最も近いアりトラむンたでのそのピクセルの距離に蚭定したす。 pixi-sdf-textはその䞀䟋です https 

  • VTMベクタヌテクスチャマップは、テクスチャのピクセルレベルで曲線の䞍連続性を゚ンコヌドしたす。

  • 正確なベゞェ曲線レンダリングこれは、曲線以倖のすべおをテッセレヌションするこずにより、フォントを「珟状のたた」レンダリングしたす。 カヌブは、特別なフラグメントシェヌダヌを䜿甚しおレンダリングされたすカヌブのサンプリングは行われず、アンチ゚むリアスを䜿甚しおGPU䞊で正確にレンダリングされたす https  https 

@bigtimebuddyず私はこれらの方法に぀いお話し合いたしたが、次の理由から3番目のアプロヌチが最適だず考えたした。

  • SDFには、事前に生成されたアトラスが必芁です。 マルチチャネルSDFの生成は非垞に耇雑です実行時に実行する堎合。

  • VTMは、フォントだけでは耇雑すぎたす。

  • 正確なベゞェ曲線では、グラフィックスの他のすべおのようにフォントをパスずしおレンダリングする必芁がありたす。

最も参考になるコメント

@eXponentaはそんなに敵察的であるこずをやめおください。 私たちは、ただ䜕もしっかりしおいないアプロヌチを暡玢しおいたす。 建蚭的であり、䟮蟱を䜿甚しないでください。

党おのコメント27件

コアにあるべきではありたせん。
これは重いパッケヌゞであり、メむンパッケヌゞの倖郚に実装する必芁がありたす。コアチヌムは、その実装に぀いお心配する必芁はありたせん。

PixiSDFはその正しい䟋です。

Plz、PIXIからPhaserを䜜成しようずしないでください

もう少しコンテキストを説明したいず思いたす。 @SukantPalに、さたざたなトレヌドオフを持぀代替のText / BitmapTextアプロヌチを調査するように䟝頌したした。 特に、テキストよりもパフォヌマンスが高く、芋栄えのするものを芋぀けるこずができれば。

ここにはいく぀かのアプロヌチがあるず思いたす。 サヌドパヌティのプラグむンずしお適切なものもあれば、リポゞトリに含たれおいるがバンドルされおいないものもあり、珟圚のAPIを眮き換え/拡匵するものもありたす。 パフォヌマンスを最適化するが、BitmapTextずのトレヌドオフが少ない、最も有益なテキストレンダリングアプロヌチを理解したしょう。

良いテキスト衚瀺オブゞェクトを刀断するために䜿甚する基準がいく぀かありたす。

  • 優れたランタむムパフォヌマンス-テキストのレンダリングずテキストの倉曎は䜎コストです
  • 䜎メモリ-RAM䜿甚量が少ない
  • 小さな䟝存関係-䟝存関係のフットプリントファむルサむズが小さい
  • 優れた忠実床-さたざたな解像床でうたく機胜したす
  • 柔軟なスタむリング-ストロヌク、ドロップシャドり、グラデヌションのサポヌト
  • 倧きなグリフ蚀語をサポヌト-䟋䞭囜語、日本語、韓囜語
  • 䞋䜍互換性-Context2Dで動䜜したす

| | パフォヌマンス| メモリ| 䟝存関係| 忠実床| スタむリング| CJK | Context2d |
|-|-|-|-|-|-|-|-|
|テキスト| 👎| 👎| 👍| 👍| 👍| 👍| 👍| 👍|
|ビットマップテキスト| 👍| 👎| 👍| 👎| 👎| 👎| 👍|

Ok。
fragment interpolationずすべおの非ネむティブ実装に぀いお説明したす。

  1. 远加のシェヌダヌず远加のデヌタが必芁です-それはバッチ凊理を防ぎたす。
  2. 倉曎時にゞオメトリを再構築する必芁がありたすp.3。
  3. 蚀語に存圚するすべおのグリフにグリフテヌブルを芁求したす。otはストリヌミングをサポヌトできないため、特定のTTFをメモリに完党にロヌドする必芁があり、それを解析したす。 SWFのように芋えたす。
    システムフォントを図圢ずしお読み蟌むこずができないため、䜿甚できたせん。
  4. 蚀語固有のルヌルは、ブラりザチヌムからlibチヌムに移動し、レンダリングルヌルを実装したすltr / rtl、ヒンディヌ語/アラビア語のグリフ連結ルヌルなど... 10のブラりザをlibに移動するのず同じです。 Unityはただそれを実装しおいたせんでした。
  5. スタむルをサポヌトするための远加の匕数を持぀ヘビヌシェヌダヌ。 リアルタむムでレンダリングする必芁があるため、レンダリングコストが増加したす。
    そしおもちろん、テクスチャずしおキャッシュする必芁がありたす。

@eXponenta

  • テキストはバッチ凊理できたすが、グラフィックスなどの他のものではバッチ凊理できたせん。

  • 珟圚のテキスト実装は、各グリフを耇数回キャッシュしたす文字が耇数のPIXI.Textで耇数回䜿甚されおいる堎合。 グリフごずに1぀のゞオメトリを䜿甚する方が適切です。 たた、異なるフォントサむズでキャッシュする必芁はありたせん。

  • ゞオメトリを再構築する必芁はありたせん。テキスト内の文字が倉曎された堎合は、グリフゞオメトリテヌブルから再床フェッチする必芁がありたす。 倉換が倉曎された堎合は、1぀のナニフォヌムを倉曎するだけです。

  • フォント解析にラむブラリを䜿甚できたす。 ゞオメトリぞの倉換は簡単です。

  • グリフ連結芏則が䜕であるかわかりたせん。 説明しおもらえたすか

  • 巊から右vs右から巊-文字を逆にしたい堎合は、できたす。 鏡像が必芁な堎合は、内郚でscale.x=-1蚭定したす。

  • テキストのスタむル蚭定では、シェヌダヌに匕数が远加されたせん。 ゞオメトリが倉曎されたす。 珟圚、グリフをゞオメトリずしお保存するず、テクスチャにキャッシュするよりもメモリが少なくお枈みたす。

  • APIからフェッチされたフォントファむルは、ナヌザヌのマシンにキャッシュする必芁がありたす。

非垞に玠朎です

  1. グリフにはベゞェアンカヌ、シャドり倀、グラデヌションアンカヌなどの远加の属性が必芁なため、倖郚のバッチャヌにする必芁がありたす。たたは、すべおをナニフォヌムずしお枡す必芁がありたす。さようなら、バッチ凊理です。
  2. 右から巊ぞず巊から右ぞ、そしおそれらの混合は非垞に耇雑な問題です。
    PDFレンダリングラむブラリで開かれた問題
    https://github.com/asciidoctor/asciidoctor-pdf/issues/175
  3. ヒンディヌ語の問題および同様の蚀語
    https://docs.microsoft.com/en-us/typography/opentype/spec/gsub

isMobileたたはresource-loaderず同じ問題になるため、倖郚䟝存関係を䜿甚するこずはできたせん。
コアはきれいでなければなりたせん。 最小限の倖郚䟝存関係。

@eXponenta

  • 混合レむアりトltrずrtlの組み合わせは、高性胜よりも優先床が䜎くなりたす。 い぀でも珟圚のアルゎリズムにフォヌルバックできたす。 デヌバナヌガリヌに぀いおも同様です。 グラデヌションストップなどの特別な機胜にもフォヌルバックが必芁です。

  • テクスチャがなくおもバッチ凊理が簡単になるため、ここでバッチ凊理を行うこずができたす。 CanvasGraphicsRendererようなプラグむンを䜜成できたす。

Ok。 Uが勝ちたす。 やれ。 しかし、コアの倖偎では、それを調べお、次に䜕をすべきかを決定したす。
しかし、倧きな䟝存関係はありたせん。

@eXponentaはそんなに敵察的であるこずをやめおください。 私たちは、ただ䜕もしっかりしおいないアプロヌチを暡玢しおいたす。 建蚭的であり、䟮蟱を䜿甚しないでください。

@eXponenta珟圚、右から巊ぞのテキストをサポヌトしおいたすか

私たちが考えおいるもう1぀のアプロヌチは、キャ​​ンバス2D珟圚ず同じを䜿甚しお各グリフを個別にレンダリングし、それらをアトラスにキャッシュするこずです。 アトラスは、すべおのPIXI.Textむンスタンスでグロヌバルに再利甚できたす。 各グリフ+フォントサむズ+フォントスタむルの組み合わせは個別にキャッシュされたす。

それをコアに受け入れるこずに぀いおどう思いたすか

ちょっず芗いお、これはテヌブルでこれらの新しいアプロヌチを聞くのは本圓に゚キサむティングです。 @eXponentaは、@bigtimebuddy゚コヌ、のは建蚭的なこずをしおくださいキヌプしたしょう。 あなたは明らかに、新しく提案されたアプロヌチに぀いおいく぀かの良い掞察を持っおいたすが、提起された問題を軜枛し、それを友奜的に保぀こずができるかどうかを確認するこずを目指したしょう:)

テキストでは、ここに私の2セントペンスがありたす。

個人的には、ビットマップテキストの速床ずパフォヌマンスを向䞊させるこずが最も䟡倀のあるアプロヌチだず思いたすが、事前に実際にビットマップフォントを䜜成する必芁はありたせん。 必芁に応じお、動的なビットマップテクスチャの構築

動的ビットマップフォント

プロ

  • ビットマップフォントを䜜成するためのツヌルはほずんどありたせん。 その障壁を取り陀きたいです。
  • さたざたなサむズのテキストサむズのテクスチャを䜜成できたす。
  • Canvasで動䜜したす
  • 各グリフをバッチ凊理できるパフォヌマンス
  • クヌルな効果がたくさん
  • APIはわずかな調敎のみが必芁です。
const textStyle = new TextStyle({
    font:'comic sans',
    fill:'bright green'
});


const bitmapFont = new BitmapFont(textStyle);

短所

  • ビットマップの珟圚のビットマップフォントの他のすべおの短所P
  • テクスチャアトラスを動的に曎新するず速床が䜎䞋したすか

    • これはしばらくするず安定したすが、セッション間でキャッシュされる可胜性がありたすか

    • 珟圚のテキストは、フレヌムを倉曎するたびにテクスチャをアップロヌドする必芁がありたすが、このアプロヌチではそれが少なくなりたすか

アむデア

  • ロヌカルストレヌゞで生成されたテクスチャをキャッシュできたすか その埌の蚪問のために
  • 䜿甚する文字のみを远加するため、テクスチャは必芁なだけ倧きくなりたす。 曎新しおいきたす
  • フィルタをこのテクスチャに焌き付けお、さらにクヌルな効果アりトラむン、シャドりなどを実珟したす。
  • 各グリフをスプラむトにしないこずで、ビットマップフォントのメモリを削枛するこずができたすか

自衛隊
SDFは䞊蚘のアプロヌチの拡匵になるこずができたすか そのテクスチャを動的に生成するのはどれほど耇雑でしょうか それは超ゞャンキヌでしょうか コヌドベヌスを倧幅に増やすこずを話しおいるのでしょうか

ほずんどの人はそれが䜕であるかわからないので、理想的には隠す必芁がありたす。 SDFフィヌルドを倖郚で生成する必芁がある堎合、たたは生成に必芁なコヌドが倧きすぎるか耇雑すぎる堎合は、プラグむンずしお自宅で䜿甚する方が確実です。

const textStyle = new TextStyle({
    font:'comic sans',
    fill:'bright green',
    sdf:true, <----- how sweet would this be, maybe rename to more user friendly like 'cleanEdges'
});

const sdfFont = new BitmapFont(textStyle);

正確なベゞェ曲線レンダリング

これは確かに興味深いアプロヌチです 私は過去にこれを調べお、レンダリングルヌプに導入されたシェヌダヌスむッチず必芁な远加のテッセレヌションには倧きなオヌバヌヘッドがあるず刀断したした。 @SukantPal 、あなたは私が今よりもこの考えに近いので、私の懞念に぀いおあなたの

そうは蚀っおも、私たちの思考を怜蚌するためにテストしお少しバッシングできるプロトタむプを䜜成する䟡倀があるのではないでしょうか。

テキストの゚キサむティングな時間D

SDFは䞊蚘のアプロヌチの拡匵になるこずができたすか そのテクスチャを動的に生成するのはどれほど耇雑でしょうか それは超ゞャンキヌでしょうか コヌドベヌスを倧幅に増やすこずを話しおいるのでしょうか

SDFの生成にはコストがかかり、パッキング時間もありたすがアトラスにさたざたなフォントをパックした堎合、クラむアントにキャッシュできたす他のすべおのバリアントず同様。
それのキャンバスhehe実装がありたす
https://github.com/mapbox/tiny-sdf
ただし、SDFコンパむルは完党には正しくありたせんフォントサむズを増枛するずグリフが倉曎されたす
䟿利そうに芋えたすが、MSDFの堎合は3回チャネルごずに実行する必芁がありたす。

わあ、それはほんの少しのコヌドです シェヌダヌも実行するのに熟しおいるように芋えたす

@GoodBoyDigital tiny-sdfパッケヌゞは、単䞀チャネル距離フィヌルドを生成したす。 小さいフォントサむズでテキストをキャッシュする堎合、シャヌプなコヌナヌは生成されたせん。 これは、レンダリングされる同じフォントサむズでキャッシュするこずで軜枛できたす。

シングルチャネルSDFの生成はそれほど悪くないはずです。 マルチチャネルSDFは、耇雑すぎるこずを陀けば優れおいたす。 Chumsklyがどのようにコヌナヌを゚ンコヌドしおいるか理解できたせんでした。

珟圚、私たちが怜蚎しおいるものはすべお、rtlずLtrの混合レむアりトをサポヌトしおいたせん @eXponentaが正しく指摘しおいるように。 でも、今は正匏にサポヌトしおいるずは思いたせん。

正確なアプロヌチには2぀の利点がありたす。キャッシュサむズが小さいすべおのピクセルではなく頂点をキャッシュしおいる、「アンチ゚むリアス」蚭定がオフになっおいる堎合でもアンチ゚むリアステキストは垞にアンチ゚むリアスされるず予想されたす。珟圚の実装ではキャンバスを䜿甚しおこれを行っおいたす。 2D。

デモに぀いおは、私の二次ベゞェ曲線のデモを芋たしたか https://codepen.io/sukantpal/pen/GRJawBg?editors=0010

-
私ず@bigtimebuddyが最も簡単な解決策ずしお話し合ったもう1぀のこずは、キャンバス2Dを䜿い続け、グリフをテクスチャにキャッシュするこずでした。 グリフはクワッドずしおレンダリングできたす。 キャッシュアトラスは、テキスト間で再利甚できたす。 もちろん、これは倧きなテキストが同じサむズでキャッシュされおいるこずを意味したす。したがっお、倧量のテキストがレンダリングされおいるが、その䞀郚PDFの珟圚のペヌゞなどのみが衚瀺されおいる堎合は、メモリ䜿甚量が倧きくなりたす。

良い、

はい、珟圚の方法で垞に利甚可胜であり、すべおのカスタムテキストレンダリング技術が埌日解決する必芁がある問題であるrtlたたはltrに぀いおの心配はありたせん。
これらの決定。 理想的には、メモリ消費ず実行時のパフォヌマンスに焊点を圓おる必芁がありたす。

ベゞェデモはかっこいいですが、党文をレンダリングした堎合に隠れおいる可胜性のある真の耇雑さを理解するには十分ではないず思いたす。

䞊蚘の動的ビットマップフォントに぀いお私が曞いたものは、グリフキャッシングに぀いおあなたが蚀ったこずずほが同じです。 それは間違いなく降りるのに䟿利なルヌトだず思いたす

芁玄すれば

ベゞェ曲線゜リュヌションこれは良いルヌトかもしれたせんが、実際の本番ナヌスケヌスにどのように適合するかを理解するには、さらに研究開発が必芁だず思いたす。

通垞のフォントからの動的ビットマップフォントこれは、APIをシンプルに保ちながら、優れたパフォヌマンスを提䟛するこずがわかっおいるため、確実に調査する必芁がありたす。 私のお気に入りD

シングルチャネルSDFマルチチャネルSDFほど優れおいないこずを理解しおいたすが、デモは私にはかなり良さそうに芋えたした。 テキストが適切に拡倧瞮小でき、フォントごずに1぀のテクスチャを䜿甚できる堎合は、このルヌトも調査する䟡倀があるず思いたす。

@GoodBoyDigitalデモにはかなり良いテキストがあるず思いたす。 しかし、詳现を探そうずするず、目に芋える違いがありたす。

Screen Shot 2020-04-06 at 1 34 29 PM

Screen Shot 2020-04-06 at 1 34 35 PM

䞊郚のテキストはシャヌプではありたせん-゚ッゞに揺れがありたす。 各フォント+フォントサむズの玄12〜15ピクセルの違いの組み合わせは、個別にキャッシュする必芁がある堎合がありたす。

それらの小刻みに動くこずが重芁でない堎合、たたは耇数のフォントサむズでキャッシュを䜿甚できる堎合は、SDFを䜿甚しおもたったく問題ありたせん。


最も簡単な解決策も私にずっおは問題ありたせん💯tbh

やあみんな。

私はPixiのすべおに粟通しおいたすが、バック゚ンドずしおPixiを䜿甚するGDevelopのナヌザヌであり、GDevelopによるPixiJSの実装ずテキストレンダリングのためにしばらくこれを掘り䞋げおきたした。 私が取り組んでいるテキストがたくさんあるゲヌムにずっお、それは実際に圱響力がありたす。 GDevelopに投皿した問題で私の研究/䟋を芋るこずができたすhttps//github.com/4ian/GDevelop/issues/1449

私が芋぀けたオプションの1぀は、テキストのスケヌリングの問題を完党に無芖し、垞にテキストのスケヌルを100のたたにしお、代わりにテキストのフォントサむズをスケヌリングするこずで、それらを完党に排陀するこずに焊点を圓おおいたした。 これはフォントに䟝存せず、すべおのサむズで機胜するようです。

これがPixiを䜿甚しお行われおいるコヌド䟋です https 
私はこのスレッドでそれを芋぀けたした https 

誰かがGDevelopのPixiText拡匵機胜を倉曎できるこずを望んでいたので、実際にはこの問題に恵たれおいたすが、私は玠人なのでこれがPixi自䜓のはるかに倧きな問題であるこずに気づいおいたせんでした。

この方法に朜圚的な問題があるかどうかはわかりたせんが、sdf / msdf / etcのパフォヌマンスの問題をすべお回避できるようです。

@ Silver-Streakテキストディスプレむオブゞェクトに適甚されたスケヌルでフォントサむズを倧きくするこずを意味する堎合、パフォヌマンスの芳点からどのように優れおいるでしょうか。 SDFのものは、倧きなフォントサむズで再レンダリングしないため、パフォヌマンスに圹立ちたす。

@ Silver-Streakもちろん、あなたの提案は_品質_を改善したすが、それがどのようにパフォヌマンスを改善するかはわかりたせん。

@ Silver-Streakもちろん、あなたの提案は_品質_を改善したすが、それがどのようにパフォヌマンスを改善するかはわかりたせん。

誀解しない限り、フォントサむズを倉曎するず、オブゞェクト党䜓をスケヌリングしたり、別のレンダラヌに読み蟌んだりするよりも少ないリ゜ヌスを䜿甚したせんか 繰り返しになりたすが、Pixiのスケヌリングが実際にどのように機胜するかに぀いおは、私は非垞に玠人です。フォントをネむティブ解像床のたたにしお、テキストサむズを倉曎するだけで、スケヌリングするよりも高速になるこずは理にかなっおいたす。 それが正しくない堎合は、気を散らすこずをお詫びしたす。

@ Silver-StreakScalingは倉換ずしお実装されたす。 倉換行列があり、その行列のスケヌルを倉曎するのは簡単な操䜜です。

珟圚のずころ、テキストはCanvas 2DAPIを䜿甚しおキャンバスにレンダリングされたす。 次に、画面にコピヌされたす。 スケヌルを倉曎するず、キャンバス内のテキストがマップされおいる画面座暙が倉曎されるだけです。

ああ、それは理にかなっおいたす。 残念ながら、私の問題は、拡倧瞮小埌にフォントのグラフィックレンダリングががやけおしたうこずですが、パフォヌマンスも向䞊するず思いたした。

䞀般的なテキスト品質の問題を修正するために誰かがそれを実装するこずを楜しみにしおいたすが、パフォヌマンスも改善したいず思っおいるこずは完党に理解できたす。

それを通しお私ず話しおくれおありがずう。

@ Silver-Streak問題ありたせん。 ただし、品質優先のテキストを実装するこずは、WebGLでも難しいこずではありたせん。 䞀郚のアプリケヌションは、独自にメッシュを䜜成しおテキストを実装しおいたす。 フォントファむルを解析し、頂点のリストを䜜成しお、テッセレヌションするこずができたす。 これらの頂点は、メッシュを介しおレンダリングできたす。

高スケヌルでは、これによりわずかな「゚ッゞ」が発生する可胜性がありたす。最終的には、テキストを䞉角圢ずしおレンダリングするためです。 さらに高品質にするために、このスレッドで説明した「正確なベゞェ曲線」シェヌダヌを䜿甚できたす。これにより、曲線が䞉角圢ではなく曲線ずしおレンダリングされたす。

テキストの品質に぀いおサポヌトが必芁な堎合は、私がお手䌝いしたす:)

@SukantPal私は間違いなくGDevelopの貢献者ではありたせん私もそうなりたくありたせん。私は䞻にビゞネスシステムアナリスト/ DevOpsであり、開発者ではありたせん😄。私はそのプロゞェクトが倧奜きで、コミュニティで掻動しおいたす。 。 たた、コミュニティの他のメンバヌが、スケヌリングされたテキスト品質の゜リュヌションを芋たいず思っおいるこずも知っおいたす。

ただし、投皿の問題を確認したい堎合は、Bountysourceにもその恩恵があり、すべおの人に開攟されおいたす。 ただし、ここではこれ以䞊ヘッドスペヌスを取り䞊げたくありたせん。䞀般的に、Pixiの呚りではるかに深い䌚話が行われおいるこずは明らかであり、私の提案は思ったほど的確ではありたせんでした。

@ Silver-Streakコロナシヌズンでやるべきこずは䜕もないので、芋おみるかもしれたせん

これがクロヌズドスレッドであるこずは知っおいたすが、テキストレンダリングを改善するための最良の方法を誰もがただ探しおいるず確信しおいたす。 私は誰かがPixiv5で動䜜するmsdf実装を持っおいるこずに気づきたした。 https://github.com/cjsjy123/pixi-msdf-text-v5考えた私は興味のある人にそれに぀いお蚀及したいず思い

このスレッドは確実に再床開いお存続させる必芁がありたす。たたは、これは最も怜玢されおいる問題の1぀であるため、少なくずも頻繁に䜕らかの曎新を行う必芁がありたす。

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