Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   старый добрый swap() — возможен вообще? (http://www.flasher.ru/forum/showthread.php?t=150730)

Zebestov 17.02.2011 00:27

старый добрый swap() — возможен вообще?
 
У меня код как рулон обоев только из-за того, что я не вижу никакой возможности вынести конструкцию типа
Код AS3:

swap = a;
a = b;
b = swap;

в отдельную функцию, которая меняла бы значения двух переменных типа Number.
Такое вообще возможно на AS3? Скорость работы критична — таких операций десятки тысяч на кадр.

semenyakinVS 17.02.2011 01:12

А чего нельзя обернуть операцию в функцию статического класса?

Zebestov 17.02.2011 01:29

Немножечко поумничаю: вроде как нет такого понятия "статический класс" в AS3, и функции класса принято называть методами.
Но не суть — а что это даст? Метод не работает с числовым аргументом как со ссылкой. Он его... как бы это сказать... локализует автоматом. Поэтому если ты передашь какой-то a:Number = 10.5 в какой-то метод, внутри которого происходит коварное a = 5.5, это не возымеет никакого эффекта снаружи. Там a по прежнему будет равняться 10.5
Если бы все было так просто ;)

i.o. 17.02.2011 01:50

вариант - хранить 2 числа как объект или массив, тогда при передаче в функцию свап становится возможным )

Zebestov 17.02.2011 01:57

Скорость доступа к динамическому полю объекта или к элементу массива расценивается как неудовлетворительная.

i.o. 17.02.2011 02:11

дык задай жестко, классом с паблик переменными - так очень даже удовлетворительно )
хотя конечно сама идея вызывать функцию, чтобы она меняла... Сам по-себе вызов функции дорогой.. Это если конечно настолько критично по скоростям.

Zebestov 17.02.2011 03:01

Менять надо походу четыре пары по одному условию. И если задуматься об организации swap-а для 12 переменных, с явным указанием на конкретную пару... как-то лучше как у меня сейчас:

Код AS3:

// сортируем вершины
if (sy0 > sy1) {
        swap = sy0;
        sy0 = sy1;
        sy1 = swap;
 
        swap = sx0;
        sx0 = sx1;
        sx1 = swap;
 
        swap = u0;
        u0 = u1;
        u1 = swap;
 
        swap = v0;
        v0 = v1;
        v1 = swap;
}
if (sy1 > sy2) {
        swap = sy1;
        sy1 = sy2;
        sy2 = swap;
 
        swap = sx1;
        sx1 = sx2;
        sx2 = swap;
 
        swap = u1;
        u1 = u2;
        u2 = swap;
 
        swap = v1;
        v1 = v2;
        v2 = swap;
}
if (sy0 > sy1) {
        swap = sy0;
        sy0 = sy1;
        sy1 = swap;
 
        swap = sx0;
        sx0 = sx1;
        sx1 = swap;
 
        swap = u0;
        u0 = u1;
        u1 = swap;
 
        swap = v0;
        v0 = v1;
        v1 = swap;
}

По крайней мере свернул и забыл ;) а быстрее точно не будет.

i.o. 17.02.2011 03:28

в байткоде кстати есть операция swap.. но это так, к слову :)

Bgg 17.02.2011 03:53

В функцию фиг знает как обернуть, но вобще можно обойтись и без 3 переменной.
Код AS3:

var a:Number = 123456;
var b:Number = 355321;
 
trace(a,b);
 
a = a + b;
b = a - b;
a = a - b;
 
trace(a,b);


Zebestov 17.02.2011 04:48

@i.o. тогда это свинство! ))
@Bgg хочешь сказать, что это быстрее? или так, к общей пьянке? )


Часовой пояс GMT +4, время: 15:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.