加载和卸载多语言Flex应用程序的字体

时间:2012-06-28 23:46:07

标签: actionscript-3 flash flex fonts

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

我知道我可以load fonts at runtime via stylesheets - 我计划这样做,因为人们选择一种字体(在字体加载时没有问题的小等待)。我想要做的是再次卸载这些字体,这样如果人们选择一种字体而不是另一种字体,应用程序不会消耗大量内存。

但是,我找不到办法。我可以在运行时加载字体,但不能卸载它们。有任何想法吗?

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

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

3 个答案:

答案 0 :(得分:2)

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

正如你所建议的那样,我会将样式表编译为模块,每个样式都嵌入了字体(对于中文,我建议你看看如果可能的话,指定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()或者像那样奇怪的伏都教魔法。)

答案 1 :(得分:1)

以下是一些有用的链接:

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

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

我认为这是你最好的选择,因为对于要使用的字体,必须注册,无论你怎么做到这一点。并且没有Font.unregisterFont()方法。这个解决方案至少可以让你解决所有问题。

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

答案 2 :(得分:0)

我没有太深入,但我也认为无法卸载已注册的字体。

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

  • 想出一种精心可靠的方法来使用设备字体。一世 猜测这意味着对字体的广泛调查 在不同的系统和国家/地区可用/需要,但如果您是 不使用字体的非常图形的东西,我认为它可能是 拉下来了。

  • 更改字体时重新加载整部电影。这个 显然很大程度上取决于你的应用程序是什么样的,但也许 你可以保存应用程序状态并通过javascript重新加载,或 甚至可能有一个单独的重叠swf,你按需加载 (也许后者可以单独装载瑞士法郎 应用程序/安全域,但我不确定注册的字体 将正确沙箱)。

无论如何,我猜这是一个Flex应用程序会使事情变得复杂,并且在框外渲染任何东西都没用......