понедельник, 21 сентября 2009 г.
Странности больших чисел
Стал ставить эксперименты. Флекс, аппликейшин, спрайт-родитель на весь экран и 50.000 дочерних шейпов. mouseChildren=false. Всё умерло. Машина - Windows7,8гигов памяти, 4 ядра. Заработало всё где-то на 30.000 шейпов. Добавил возможность драгать по экрану родительский спрайт. Умирает как только начинаешь драгать.Т.е. если тащить ме-е-едленно, то фпс приличный. А если дёргать резко, когда мышка постоянно над разными местами этого "борща" из шейпов скачет - всё, пиши пропало. Ставлю 10.000 шейпов - всё опять летает, с драгом. 57 Fps (из 60 возможных). Сделал 4 родительских спрайта, каждый на четверть экрана, в каждом по 10.000 шейпов. Т.е. в сумме на экране 40.000 шейпов. 57 fps.
Там в плеере где-то вшита константа? :))) Или алгоритм такой, что до 10.000 чайлдов он работает быстро-быстро, а потом, резко так, включается ЭКСПОНЕНТА? или чо аще? а?
вторник, 8 сентября 2009 г.
ComplexRectangle во Flex4
воскресенье, 6 сентября 2009 г.
Свобода попугаев. Часть 1.
Рассказ о том, как я впервые компилил haxe-приложения в исполняемый файл(exe).
Дело было под Vista 32 bit.
- Сначала я скачал и установил haXe. По ходу установки соглашаемся на установку Neko. [под Windows7 64 bit устанавливаться он не захотел, а вот под Vista-32 встал нормально].
- Далее я поставил FlashDevelop
- На странице приветствия обнаружил New Project. Выбрал HaXe -> C++ Project. Ввёл имя проекта:
MyTestProject
. Поставил галку Create directory for project. Получил сгенерённую болванку проекта. - Открывыю src/Main.hx. Вижу там функцию
main
. Пишу в неё:
flash.Lib.Init("Test", 800, 600, false, true);
flash.Lib.SetBackgroundColour(0xffffff);
var sprite= new Sprite();
sprite.graphics.beginFill(0x00ff00,1);
sprite.graphics.drawRect(10,20,30,40);
sprite.graphics.endFill();
flash.Lib.current.addChild(sprite);
flash.Lib.Run();
При этом в импортах получилось два package:
import cpp.Lib;
import flash.display.Sprite;
Жму F5. Получаю сообщение об ошибке: You can't access the flash package with current compilation flags (for flash.display.Sprite) . Хм. Грубо говоря это означает: "Фигли ты флэшовые пэкэджи используешь в нефэлшовом проекте". Та-ак. Сейчас буду давать адекватный, но ассимметричный ответ на данное заявление. - Подключаю билиботеки
neash
иnme
, которые будут "эмулировать" флэш плеер. Сначала устанавливаю их. Захожу в папку установки haxe (по умолчанию это Program files/Motion-Tween/haxe/) и запускаю оттудаhaxelib.exe install nme
. Потомhaxelib.exe install neash
. И в заключениеhaxelib.exe install hxcpp
. Скачались и установились соответствующие библиотеки. Далее подключаю библиотеки к нашему проекту. Для этого захожу в FlashDevelop->Project->Properties->Compiler options. Тыкаю в Libraries и в открывшемся EditBox'е пишу две строки:
neash
nme - Теперь торжественно сообщаю компилятору, что он был в корне неправ. В этом же диалоге (FlashDevelop->Project->Properties->Compiler options) в Additional compiler options пишу две строки:
--remap flash:neash
--remap neko:cpp - Жму F5 с надеждой скомпилить-таки проект. Снова ошибка. Но в папочке ./bin/src нагенерировалась куча исходников. А что за ошибка? Не найден cl.exe? Ага, т.е. FlashDevelop попытался запустить внешний компилятор (у меня это Microsoft-компилятор от VisualStudio 2008), но так как окружение не настроено - из этого ничего не вышло. Будем настраивать.
- Настройка заключается в том, чтобы прописать в переменные окружения все пути для бинарников, инклюдов и библиотек необходимых для компиляции cpp приложения из командной строки. Самый простой вариант устроить это - залезть в файл vsvars32.bat (лежит в Program files/Miscrosoft Visual Studio 8(или 9)/Common7/Tools) и скопировать пути из строчек
@set PATH=
,@set INCLUDE=
и@set LIB=
в переменные среды PATH, INCLUDE и LIB соответственно (в Vista я это делал через Панель управдения->Система->Дополнительные параметры системы->Переменные среды) - Вот оно! Вижу зелёный квадратик! Ура! :))
P.S.
Для тех у кого нету установленного VisualStudio, Exey в комментах запостил план Б. За что и выражаю ему благодарность.
пятница, 4 сентября 2009 г.
Свобода попугаев. Предисловие.
Сегодня начал практически ковыряться в haXe и решил параллельно писать заметки по этому поводу.
Предисловие.
Вводную про haXe я давать не буду. Я лучше расскажу, что меня сподвигло на его изучение. Однажды, после долгих лет GUЯния на разных платформах, языках и фреймворках, я встретил Adobe Flex. С тех пор прошло уже два года. Тогда я только предполагал, что при всех своих недостатках Flash+Flex framework это лучшее, что есть для GUI-писателя. Сейчас я в этом уверен.
Мысль о вытаскивании Flash\Flex-приложения (в качестве красивой морды) за пределы его песочницы посещала меня давно, равно как и регулярно.(В предыдущих моих постах слышны отголоски этих посещений :)) Лейтмотивом мотивации являлось: "Какое было бы счастье забыть про Win32\MFC\wxWidgets\WinForms\Qt\Gtk\jQuery и прочее и прочее". И вот оно (счастье), кажется, медленно, но верно надвигается. Вы спрашиваете причём тут haXe?
А вот причём: ECMAScript-образный язык haXe (т.е. он похож на AS3\javascript) позволяет нам (кроме всего прочего) компилить один и тот же исходник как в swf, так и в executable файл. Специально подчеркну, что исполняемый файл получается путём совершенно легальной компиляции промежуточного cpp-кода, (полученного из haXe сорцов) и линковкой с библиотеками хакса(open-source между прочим). На данный момент библиотеки имплементированы для 4х разных платформ: Win32, Linux, Mac и (та-дам!) iPhone.
Приведу кусок haxe-кода:
class Application extends MovieClip
{
public var surface:Sprite;
public function new()
{
super();
surface = new Sprite();
this.addChild(surface);
timer = new Timer(50);
timer.addEventListener(TimerEvent.TIMER, handlerTimer);
surface.addEventListener(MouseEvent.CLICK, handlerClick);
sprite.graphics.beginFill(0x00ff00, 0.5);
sprite.graphics.drawEllipse(20, 30, 25, 35);
sprite.graphics.endFill();
trace(width);
}
Ничего не напоминает? :) Этот код може быть скомпилен в swf. И этот же код БЕЗ ИЗМЕНЕНИЙ компилится в EXE-шник (под виндой) и мало того, он ещё и работает! И для его работы никакой AdobeFlash-плеер не требуется! И в самом экзешнике ни про какого Adobe не знают и знать не хотят!!! Всё, здесь у меня начинается истерика:)).
Теперь можно задать такой вопрос: "Ну и чо? Ну есть, ну компилится, ну EXE-шник, а в чём радость-то ... profit где?!?". Нету! :) Пока - нету. Но есть мысли и я их хочу проверить, и если в том будет хоть капля смысла - реализовать. Вот парочка, в качестве затравки:
- Портануть neash под WinMobile и посмотреть как оно будет вертеться там
- Портировать на haXe (а значит и в native на разных плафтормах) его... FLEX SDK!
Кстати, если первое сложить со вторым, то получаем единственный вменяемый GUI фреймворк под WinMobile. Краткий обзор существующих там фреймворков: .NET CF+WinForms = 20 Mb DLLек и просто "никакая" кастомизация контролов. Qt=15 Mb DLLек и неюзабельные тормоза. Остальное - дикий и беспощадный хардкодинг. А в случае успеха затеи мы имеем 3 Mb DLLек и предположительно хорошее быстродействие(хотя тут конечно бабушка надвое)
Ну, это всё лирика. Переходим к практическим занятием. В следующей части расскажу как я настраивал FlashDevelop и окружение и как скомпилил первую пару swf-exe. Спасибо за внимание.