上一篇详细介绍debug.as的文章发了以后,发现一个小问题。因为对textField对象的text属性直接作+=操作会严重影响速度(这应该是flash的bug),故对代码作了些改进。改动主要在textField的onSetFocus()函数中。修正后读入日志速度比原来快了两倍。
另外用Array.join()方法替代了原来循环连接字符串的操作,比原有代码速度提高了一倍。
经过测试,在P4 2.4上,现在可以处理20多万行日志而不会弹出速度慢的警告窗口。
//
Debug.as
//
written by foreverflying
//
class Debug
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
//=========================================================
//in player trace===============================Version 1.2
static public function CreateTrace( depth, x, y, width, height, lineCount, mc )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( _logObj != undefined )...{
return;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( mc == undefined )...{
mc = _level0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( lineCount == undefined )...{
lineCount = 12;
}
_logObj = new Array();
_logObj.allowChange = true;
_logObj.isPart = false;
_logObj.lineCount = lineCount;
mc.createTextField( '__traceText__', depth, x, y, width, height );
_logObj.traceText = mc['__traceText__'];
var traceText = _logObj.traceText;
var str = ' ';
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
while( traceText.maxscroll < 2 )...{
traceText.text = str;
str += str;
}
traceText.maxRow = traceText.bottomScroll - traceText.scroll + 1;
traceText.text = '';
traceText._visible = _traceVisible;
traceText.border = true;
traceText.background = true;
traceText.backgroundColor = 0xFFFFFF;
traceText.onSetFocus = function( oldFocus )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_logObj.allowChange = false;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( !_logObj.isPart )...{
return;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( _logObj[0] == undefined )...{
return;
}
var s = _logObj[_logObj.length-1];
s = s.charAt( s.length-1 );
s = s == ' ' ? '' : ' ';
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for( var i=0; i < this.maxRow - lineCount; i++ )...{
s += ' ';
}
this.text = _logObj.join( ' ' ) + s;
_logObj.isPart = false;
this.scroll = this.maxscroll;
}
traceText.onKillFocus = function( newFocus )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_logObj.allowChange = true;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( _logObj.isPart )...{
var myText = _logObj.traceText;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( !_logObj.lineCount )...{
myText.text = '';
return;
}
var i = _logObj.length > lineCount ? _logObj.length - lineCount : 0;
var str:String = _logObj[i];
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for( ++i; i<_logObj.length; i++ )...{
str += ' ' + _logObj[i];
}
myText.text = str;
myText.scroll = myText.maxscroll;
}
}
SetTraceFunc( _traceFunc );
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static public function SetTraceVisible( isVisible )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_traceVisible = isVisible == true;
_logObj.traceText._visible = _traceVisible;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( !_logObj.lineCount || !_logObj.allowChange || !_traceVisible || _logObj.length == 0 )...{
return;
}
var myText = _logObj.traceText;
var lineCount = _logObj.lineCount;
var i = _logObj.length > lineCount ? _logObj.length - lineCount : 0;
var str:String = _logObj[i];
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for( ++i; i<_logObj.length; i++ )...{
str += ' ' + _logObj[i];
}
myText.text = str;
myText.scroll = myText.maxscroll;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static public function SetTraceFunc( traceFunc )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_traceFunc = traceFunc == undefined ? Trace : traceFunc;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static public function xtrace( msg:Object )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
var indent = '';
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for( var i=0; i<_indent; i++ )...{
indent += '| ';
}
_traceFunc( indent + msg );
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static private function Trace( msg:String )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( _logObj == undefined )...{
return;
}
var myText = _logObj.traceText;
var lineCount = _logObj.lineCount;
_logObj.push( msg );
_logObj.isPart = true;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( !_logObj.lineCount || !_logObj.allowChange || !_traceVisible )...{
return;
}
var i = _logObj.length > lineCount ? _logObj.length - lineCount : 0;
var str:String = _logObj[i];
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for( ++i; i<_logObj.length; i++ )...{
str += ' ' + _logObj[i];
}
myText.text = str;
myText.scroll = myText.maxscroll;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static private var _traceFunc = Trace;
static private var _traceVisible = false;
static private var _indent = 0;
static private var _logObj;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//=========================================================
//TraceClass====================================Version 1.1
static public function TraceClass( name, obj, info )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( _classTraceOn == false )...{
return;
}
xtrace( '[ ' + name + ' ] class created -----' + ( info == undefined ? '' : info ) );
_global.ASSetPropFlags( obj.__proto__, null, 6, 1 );
var control;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for( var i in obj )...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( i != 'constructor' && typeof(obj[i]) == 'function' )...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( control == undefined )...{
control = new Object();
control.exclusiveCount = 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( obj[i] != undefined && obj[i].control == undefined )...{
obj[i] = createRecallFunc( obj[i], name + '.' + i, control, info );
}
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static public function SwitchClassTrace( classTraceOn )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_classTraceOn = classTraceOn == true;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 1 : only trace func
// 2 : not trace func
// 4 : not print trace info for func, but indent changes
static public function SetFunctionTag( func, tag )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( func.tag == undefined )...{
return;
}
func.tag |= tag;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( ( tag & 1 ) != 0 )...{
func.control.exclusiveCount++;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
//clear the tag setted, if tag is 0, clear all tags
static public function ClearFunctionTag( func, tag )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( func.tag == undefined )...{
return;
}
tag = tag == 0 ? func.tag : tag;
func.tag &= ~tag;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( ( tag & 1 ) != 0 )...{
func.control.exclusiveCount--;
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static private function createRecallFunc( orgFunc, funcName, control, info ):Function
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
var ret = new Function(
function()
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
return TraceCall( this, arguments );
}
);
ret.orgFunc = orgFunc;
ret.funcName = funcName;
ret.control = control;
ret.info = info;
ret.tag = 0;
return ret;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static private function TraceCall( thisObj, arg )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
var callee = arg.callee;
var callTrace = true;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( callee.control.exclusiveCount > 0 )...{
callTrace = ( callee.tag & 1 ) != 0;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}else if( ( callee.tag & 2 ) != 0 )...{
callTrace = false;
}
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( callTrace )...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( ( callee.tag & 4 ) != 0 )...{
_indent++;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}else...{
OnCallBegin( callee.funcName, callee.info );
}
}
var ret = callee.orgFunc.apply( thisObj, arg );
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( callTrace )...{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( ( callee.tag & 4 ) != 0 )...{
_indent--;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
}else...{
OnCallEnd( callee.funcName, callee.info, ret );
}
}
return ret;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static private function OnCallBegin( funcName, info )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
xtrace( '/---' + funcName + '-----' + ( info == undefined ? '' : info ) );
_indent++;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static private function OnCallEnd( funcName, info, ret )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
_indent--;
var type = typeof( ret );
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
if( type == 'string' || type == 'number' || type == 'boolean' )...{
xtrace( '|---( ' + ret + ' )' );
}
xtrace( '/---' + funcName + '-----' + ( info == undefined ? '' : info ) );
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
static private var _classTraceOn = false;
}