3

我的 Flex 应用程序允许人们输入文本。有多种字体可供选择。因为它是一个多语言应用程序,其中一些字体(例如中文)确实非常大 - 太大而无法嵌入所有字体。

我知道我可以在运行时通过样式表加载字体- 我计划在人们选择字体时执行此操作(在字体加载时稍等片刻不是问题)。我想要做的是再次卸载这些字体,这样如果人们选择一种字体然后另一种字体,应用程序就不会消耗大量内存。

不过,我看不出有什么办法。我可以在运行时加载字体,但不能卸载它们。有任何想法吗?

我确实在 SO 上看到了这个问题,它提到将字体加载为模块的一部分——我猜每个模块一个字体。优点是可以卸载模块。但是,正如提问者指出的那样,在模块之外无法访问该字体。所以这似乎是一个死胡同。

如果不可能,我会 - 遗憾地 - 接受一个答案,告诉我这是不可能的,但更有用的是另一种策略!这一定是人们以前遇到过的一个很常见的场景......

4

3 回答 3

2

正如你的直觉所暗示的,这对于 flex 开发人员来说是一个相对常见的场景——必须有一个解决方案!

正如您所建议的,我会将样式表编译为模块,并在每个模块中嵌入字体(对于中文,我建议您尽可能考虑指定 unicode 范围以节省字体大小: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 的内置分析器吗?在 flex 应用程序上强制垃圾收集很烦人(据我记得,你必须调用System.gc()两次或类似的一些奇怪的巫毒魔法)。

于 2012-07-06T09:13:56.767 回答
1

以下是一些有用的链接:

您可以将字体从外部嵌入 SWF 文件(每种字体一个),根据需要加载它们,并使用与 SWF Embed 的“fontName”相同的值作为 CSS 的“fontFamily”。

当用户完成操作并且您已清除对字体的所有引用时,您可以卸载 SWF (Loader.unloadAndStop()) 并将其设置为 null。我认为这会提示它进行垃圾收集并释放内存。

我认为这是你最好的选择,因为要使用一种字体,它必须注册,无论你是如何做到这一点的。并且没有 Font.unregisterFont() 方法。该解决方案至少可以让您释放到那时为止的所有内容。

虽然我很好奇 Font.enumerateFonts() 是否仍会列出字体,以及它是否真的被释放用于垃圾收集......

于 2012-07-02T07:41:33.740 回答
0

我没有深入了解它,但我也认为不可能卸载已注册的字体。

我只能想到两个可能不可行的解决方法:

  • 想出一种精心设计且可靠的方式来使用设备字体。我想这意味着对不同系统和国家/地区可用/需要的字体进行相当广泛的调查,但如果你没有将字体用于非常图形化的东西,我认为它可能会被取消。

  • 更改字体时重新加载整部电影。这显然很大程度上取决于您的应用程序是什么样的,但也许您可以保存应用程序状态并通过 javascript 重新加载它,或者甚至可以有一个单独的覆盖 swf 供您按需加载(也许后者可以在单独的应用程序中加载 swf /security 域,但我不确定注册的字体是否会被正确沙盒化)。

无论如何,我猜它是一个 Flex 应用程序会使事情变得相当复杂,并使任何开箱即用的东西都变得毫无用处......

于 2012-07-06T09:17:27.550 回答