3

私のFlexアプリでは、ユーザーがテキストを入力できます。選択できるフォントは幅広くあります。多言語アプリであるため、これらのフォントの一部(中国語など)は実際には非常に大きく、すべてのフォントを埋め込むには大きすぎます。

私はスタイルシートを介して実行時にフォントをロードできることを知っています-人々がフォントを選択するときにこれを行う予定です(フォントがロードされるまで少し待つことは問題ではありません)。私がやりたいのは、それらのフォントを再度アンロードして、ユーザーが1つのフォントを選択してから別のフォントを選択した場合に、アプリが大量のメモリを消費しないようにすることです。

しかし、私はそれを行う方法を見ることができません。実行時にフォントをロードできますが、アンロードできません。何か案は?

モジュールの一部としてフォントをロードすることについて言及しているSOでこの質問を見ました-モジュールごとに1つのフォントがあると思います。モジュールをアンロードできるという利点があります。しかし、質問者が指摘しているように、モジュールの外部ではフォントにアクセスできません。行き止まりのようです。

それが不可能な場合、私は-悲しいことに-それが不可能であることを示す答えを受け入れますが、はるかに有用な代替戦略があります!これは、人々が以前に遭遇したかなり一般的なシナリオであるに違いありません...

4

3 に答える 3

2

あなたの直感が示唆しているように、これはフレックス開発者にとって比較的一般的なシナリオです-解決策が必要です!

あなたが提案したように、私はそれぞれにフォントが埋め込まれたモジュールとしてスタイルシートをコンパイルします(中国語の場合、フォントサイズを節約するために可能であればユニコード範囲を指定することを検討することをお勧めします:http://renaun.com/blog/2011/ 10 / flash-embed-font-unicode-range-generator /)。

モジュールを親アプリにロードできるアプリケーションドメインは3つあります。これを見てください:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e07.html。3つの方法のうち2つで、モジュールのリソースを使用できると思います。最も簡単なのは、同じアプリケーションドメインでロードすることです。つまり、モジュール内のクラスは親のクラスと同じであると想定します。

ビルドシステムが、親アプリケーションと同じバージョンのSDKを使用してモジュールをコンパイルしていることを確認してください。そうしないと、マーシャリングクラスでactionscriptランタイムエラーが発生します。

最後に、ガベージコレクション用にアプリケーションをどのようにプロファイリングしていますか?Flash Builderの組み込みプロファイラーを使用していますか?フレックスアプリでガベージコレクションを強制するのは面倒です(私が覚えていることから、System.gc()2回またはそのような奇妙なブードゥーマジックを呼び出す必要があります)。

于 2012-07-06T09:13:56.767 に答える
1

ここにいくつかの便利なリンクがあります:

フォントを外部からSWFファイルに埋め込み(フォントごとに1つ)、必要に応じてロードし、CSSの「fontFamily」にSWFEmbedの「fontName」と同じ値を使用できます。

ユーザーが完了し、フォントへのすべての参照をクリアしたら、SWFをアンロードして(Loader.unloadAndStop())、nullに設定できます。これにより、ガベージコレクションが促され、メモリが解放されると思います。

使用するフォントは、どのように取得したかに関係なく、登録する必要があるため、これが最善の策だと思います。また、Font.unregisterFont()メソッドはありません。このソリューションでは、少なくともその時点までのすべてを解放できます。

Font.enumerateFonts()がまだフォントをリストするかどうか、そしてそれがガベージコレクションのために本当に解放されるかどうかは興味がありますが...

于 2012-07-02T07:41:33.740 に答える
0

あまり深くは理解していませんが、登録されているフォントをアンロードすることはできないと思います。

私は2つのおそらく実行不可能な回避策しか考えられません:

  • デバイスフォントを使用するための精巧で信頼性の高い方法を考え出します。さまざまなシステムや国で利用可能/必要なフォントについてかなり広範囲にわたる調査を意味すると思いますが、非常にグラフィカルなものにフォントを使用していない場合は、それをやめることができると思います。

  • フォントを変更するときに、ムービー全体をリロードします。これは明らかにアプリケーションの状態に大きく依存しますが、アプリの状態を保存してjavascriptを介して再読み込みしたり、オンデマンドで読み込む別のオーバーレイされたswfを使用したりすることもできます(後者は別のアプリケーションでswfを読み込むことができます) / security domainですが、登録されたフォントが正しくサンドボックス化されるかどうかはわかりません)。

とにかく、Flexアプリであることは物事をかなり複雑にし、箱の外のものを役に立たなくするだろうと思います...

于 2012-07-06T09:17:27.550 に答える