Архів для категорії ‘ActionScript 3.0’

Парадокс з NaN

, 10, 2007

НеЧисло є Числом:

trace(NaN is Number); // true

Так, про це пишуть в документації, але це трохи не логічно :)

Має місце тільки в ActionScript 3.0

Загадка про getQualifiedClassName() та Function

, 10, 2007

Що поверне такий вираз?

getQualifiedClassName(function():void{});

(more…)

Оператор in в кілька разів швидше hasOwnProperty()

, 7, 2007

Олег (він же a_[w]) потішив іще однією швидкісною блохою:

var obj:Object = {p:true};
var r:Boolean = false;
var pn:String = 'p';
var t:Number = getTimer();
var i:uint;
for(i=0; i<1000000; i++) r = obj.hasOwnProperty('p');
trace("hasOwnProperty('p'): " + (getTimer()-t)); // 275
t = getTimer();
for(i=0; i<1000000; i++) r = obj.hasOwnProperty(pn);
trace("hasOwnProperty(pn): " + (getTimer()-t)); // 271
t = getTimer();
for(i=0; i<1000000; i++) r = 'p' in obj;
trace("'p' in : " + (getTimer()-t)); // 96
t = getTimer();
for(i=0; i<1000000; i++) r = pn in obj;
trace("pn in : " + (getTimer()-t)); // 97

Результат: майже в 3 рази.

TextField.appendText() набагато швидше простого додавання

, 6, 2007

Ви, напевно, помічали попередження Flash IDE “Warning: 3551: Appending text to a TextField using += is many times slower than using the TextField.appendText() method.”, коли Ви намагались додати текст таким чином:

tf.text = tf.text + "some text";
// або tf.text += "some text";

Так от, він не бреше :)

var tf:TextField = new TextField();
tf.textColor = 0x000000;
tf.width = stage.stageWidth;
tf.multiline = true;
tf.autoSize = TextFieldAutoSize.LEFT;
tf.wordWrap = true;
addChild(tf);
tf.text = "";
var textToAppend:String = "Warning: 3551: Appending text to a TextField using += is many times slower than using the TextField.appendText() method.";
var iterations:uint = 200;
var i:uint;

var startTime:int = getTimer();

for(i=0; i<iterations; i++){
	tf.text = tf.text + textToAppend;
}
trace(getTimer() - startTime); // 1313

tf.text = "";
startTime = getTimer();

for(i=0; i<iterations; i++){
	tf.appendText(textToAppend);
}
trace(getTimer() - startTime); // 92

Як видно з трейсів, функція appendText() робить свою справу більш ніж в 14 разів швидше! Хоча, якщо зменшити прорахунки на wordWrap, то результат буде – більш ніж в два рази. Таке станеться, наприклад, якщо ви додасте, в наведеному вище прикладі, “\n” до змінної textToAppend. Але це теж не погано ;)

Не правильне використання ExternalIntarface призводить до його, майже непомітного, падіння

, 5, 2007

Маємо (завантажити приклад):

  1. Дві функції в JavaSript: jsFunc_1 та jsFunc_2.
  2. Дві функції в ActionScript: asFunc_1 та asFunc_2.
  3. Для ActionScript функції додано колбеки через ExternalInterface.addCallback().
  4. В функції jsFunc_1 є виклик asFunc_1.
    В функції asFunc_1 є виклик jsFunc_2.
    В функції jsFunc_2 є виклик asFunc_2.
    Тобто якщо викликати jsFunc_1, то повинен бути такий ланцюг викликів: jsFunc_1 > asFunc_1 > jsFunc_2 > asFunc_2.

Блоха з’являється на другій ланці. При спробі викликати jsFunc_2 нічого не відбувається. Ніякої помилки ні в ActionScript ані в JavaScript немає. І тільки ExternalInterface.call() при цьому Вам поверне null. Але якщо JavaScript функція нічого не повинна повертати, то цей результат не викличе підозри на помилку.

Вирішення:

Уникайте подібних ланцюгів викликів використовуючи, наприклад, setTimeout(), як в цьому прикладі.
Але й тут будьте обережні! Викликати ExternalInterface.call() через setTimeout() не можливо. Отримаєте помилку “SecurityError: Error #2000: No active security context.”. Тож Вам треба буде створити ще одну функцію.