我创建了一个简单的测试应用程序 使用以下代码
var i : int;
for (i=0; i<3000000; i++){
trace(i);
}
当我运行应用程序时,加载速度非常慢,这意味着“跟踪”正在运行。 我通过右键单击检查Flash播放器,调试器选项未启用。
所以我想知道是否有一个选项可以放入编译器来排除跟踪。 否则,我必须手动删除程序中的所有跟踪。
是否还有其他编译器选项可以最大限度地优化Flex应用程序?
答案 0 :(得分:3)
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);
这比正常的跟踪提供了几个好处:
答案 1 :(得分:3)
使用条件编译,更多here。
在您的代码集中:
CONFIG::debugging {
trace(i);
}
然后转到Project-&gt; Properties-&gt; Flex Compiler并添加
-define=CONFIG::debugging,false
or
-define=CONFIG::debugging,true
答案 2 :(得分:2)
您可以在整个项目中进行查找/替换。搜索'trace('并替换为'// trace(')。这样就足够快,很容易撤消。
答案 3 :(得分:2)
mxmlc参数debug
允许您从SWF文件添加或删除调试功能。默认情况下,命令行编译器的debug参数值为false,但在Flex Builder中,您必须手动创建非调试SWF。根据{{3}},添加到SWF的调试信息包括“所有源文件的行号和文件名”。没有提到trace()
函数调用,我认为没有办法通过编译器参数删除它们,但是欢迎您检查链接文档以获取整个可用参数列表。
答案 4 :(得分:2)
您应该设置两个编译器选项:-debug=false -optimize=true
。在Flex Builder或Eclipse中,查看Project-&gt; Properties-&gt; Flex Compiler,并填写标有“Additional compiler arguments”的框。
答案 5 :(得分:0)
转到灵活代码库目录(如果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-&gt; Properties-&gt; Flex Compiler-&gt;其他编译器参数中设置以下内容:
-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或其他块中,并且它是一个没有括号的裸块,那么无论它是否被编译出来,它都会抱怨。
答案 6 :(得分:0)
你可以做的其他事情是在某个地方定义一个名为debugMode的布尔值或外部常量.as文件中的某个东西,并在你使用的任何项目中包含这个文件。然后,在任何trace语句之前,您可以先检查此布尔值的状态。这类似于zdmytriv的回答。
不得不说,我喜欢edibleCode的回答,并期待尝试一段时间。