我使用以下代码创建了一个简单的测试应用程序
var i : int;
for (i=0; i<3000000; i++){
trace(i);
}
当我运行应用程序时,加载速度很慢,这意味着“跟踪”正在运行。我通过右键单击检查 Flash 播放器,调试器选项未启用。
所以我想知道是否有一个选项可以在编译器中排除跟踪。否则,我必须手动删除程序中的所有跟踪。
是否有任何其他编译器选项可以最大限度地优化 flex 应用程序?
我使用以下代码创建了一个简单的测试应用程序
var i : int;
for (i=0; i<3000000; i++){
trace(i);
}
当我运行应用程序时,加载速度很慢,这意味着“跟踪”正在运行。我通过右键单击检查 Flash 播放器,调试器选项未启用。
所以我想知道是否有一个选项可以在编译器中排除跟踪。否则,我必须手动删除程序中的所有跟踪。
是否有任何其他编译器选项可以最大限度地优化 flex 应用程序?
Flex 中内置了一个非常棒的功能,称为日志记录 API(您可以在此处阅读有关它的更多信息http://livedocs.adobe.com/flex/3/html/logging_09.html)。
基本上,您以不同的方式记录(跟踪)事物,诚然,其代码比标准跟踪略多,但它使您具有更大的灵活性。这是一个例子:
import mx.logging.Log;
Log.getLogger("com.edibleCode.logDemo").info("This is some info");
Log.getLogger("com.edibleCode.logDemo").error("This is an error");
然后您需要做的就是在您的主应用程序文件中创建一个跟踪目标,例如:
<mx:TraceTarget id="logTarget" fieldSeparator=" - " includeCategory="true" includeLevel="true" includeTime="true">
<mx:filters>
<mx:Array>
<mx:String>*</mx:String>
</mx:Array>
</mx:filters>
<!--
0 = ALL, 2 = DEBUG, 4 = INFO, 6 = WARN, 8 = ERROR, 1000 = FATAL
-->
<mx:level>0</mx:level>
</mx:TraceTarget>
并使用以下命令注册跟踪:
Log.addTarget(logTarget);
与正常跟踪相比,这提供了几个好处:
使用条件编译,更多在这里。
在您的代码集中:
CONFIG::debugging {
trace(i);
}
然后转到 Project->Properties->Flex Compiler 并添加
-define=CONFIG::debugging,false
or
-define=CONFIG::debugging,true
您可以对整个项目进行查找/替换。搜索 'trace(' 并替换为 '//trace('。这将足够快并且很容易撤消。
mxmlc 参数debug
允许您在 SWF 文件中添加或删除调试功能。对于命令行编译器,debug 参数的值默认为 false,但在 Flex Builder 中,您必须手动创建非调试 SWF。根据有关编译器参数的文档,添加到 SWF 的调试信息包括“所有源文件的行号和文件名”。没有提到trace()
函数调用,我认为没有办法通过编译器参数删除它们,但欢迎您查看链接文档以获取可用参数的整个列表。
您应该设置两个编译器选项:-debug=false -optimize=true
. 在 Flex Builder 或 Eclipse 中,查看 Project->Properties->Flex Compiler 并填写标有“Additional compiler arguments”的框。
转到您的 flex 代码库目录(如果 Flex Builder 正在运行,则关闭它 - 如果您在运行时更改内容,它会变得很自大)。运行此命令以更改所有跟踪语句。我建议先将树检查到 git 或其他东西中,然后再运行 diff (或 cp -r 树来执行 diff -r 或其他东西)。唯一会搞砸的主要情况是跟踪字符串中有分号:
find . -name '*.as' -exec perl -pe 'BEGIN{ undef $/; }s/trace([^;]*);/CONFIG::debugging { trace $1 ; };/smg;' -i {} \;
find . -name '*.mxml' -exec perl -pe 'BEGIN{ undef $/; }s/trace([^;]*);/CONFIG::debugging { trace $1 ; };/smg;' -i {} \;
然后在你的 Project->Properties->Flex Compiler->Additional compiler arguments 中设置以下内容:
-define=CONFIG::debugging,true -define=CONFIG::release,false
并使用:
CONFIG::release { /* code */ }
对于“#else”子句。这是我在阅读此问答集后选择的解决方案。
还要注意这一点:
if( foo )
{
/*code*/
}
else
CONFIG::debugging { trace("whoops no braces around else-clause"); };
即,如果您在 if 或 else 或任何块中只有其中一个,并且它是一个没有大括号的裸块,那么无论它是否被编译出来,它都会抱怨。
Something else you could do is define a boolean named debugMode or something in an external constants .as file somewhere and include this file in any project you use. Then, before any trace statement, you could check the status of this boolean first. This is similar to zdmytriv's answer.
Have to say, I like edibleCode's answer and look forward to trying it some time.