пятница, 30 января 2009 г.

Очередь асинхронных ShaderJob не работает никак, потому что она не существует.

...По крайней мере, в документации я на сей счет ничего вразумительного не обнаружил, а на вопрос из моей предыдущей заметки не смогли ответить даже на форуме Adobe. Таким образом, я пришел к выводу, что очередь нужно реализовывать самому.

Задача оказалась довольно простой.

Вот пример класса, реализующего очередь:

package ru.dmitrykrasnov.service.shader {
  import flash.display.ShaderJob;
  import flash.events.ShaderEvent;

  public class ShaderJobQueue {
      public static const INSTANCE:ShaderJobQueue = new ShaderJobQueue();

      private var queue:Vector.<ShaderJob>;
      private var inProgress:Boolean;

      public function ShaderJobQueue() {
          if (INSTANCE != null) throw new Error("Сonstructor is locked.");
          queue = new Vector.<ShaderJob>();
      }

      public function addToQueue(shaderJob:ShaderJob):void {
          queue.push(shaderJob);
          if (!inProgress) {
              inProgress = true;
              run();
          }
      }

      private function run():void {
          var shaderJob:ShaderJob = queue.shift();
          shaderJob.addEventListener(ShaderEvent.COMPLETE, shaderJobCompleteHandler);
          shaderJob.start();
      }

      private function shaderJobCompleteHandler(event:ShaderEvent):void {
          event.target.removeEventListener(ShaderEvent.COMPLETE, shaderJobCompleteHandler);
          if (queue.length > 0) {
              run();
          } else {
              inProgress = false;
          }
      }
  }
}

При необходимости, этот класс можно использовать самостоятельно, вставив в свой код строку:

ShaderJobQueue.INSTANCE.addToQueue(shaderJob);

Но это некрасиво. Эстетики ради, можно немного усовершенствовать класс ShaderJob:

package ru.dmitrykrasnov.service.shader {
  import flash.display.Shader;
  import flash.display.ShaderJob;

  public class ShaderJobEnhanced extends ShaderJob{
      private var addedToQueue:Boolean;

      public function ShaderJobEnhanced(shader:Shader = null, target:Object = null, width:int = 0, height:int = 0) {
          super(shader, target, width, height);
      }

      public override function start(waitForCompletion:Boolean = false):void {
          if (waitForCompletion || addedToQueue) {
              super.start(waitForCompletion);
          } else {
              addedToQueue = true;
              ShaderJobQueue.INSTANCE.addToQueue(this);
          }
      }
  }
}

Тогда метод ShaderJobEnhanced.start() будет полностью соответствовать документации метода ShaderJob.start().

Честно говоря, сейчас я даже рад, что Adobe не предоставила готовую реализацию очереди т.к. у нас есть возможность сделать эту реализацию сколь угодно специфичной (например, сейчас мне нужна очередь с динамической сортировкой). Только надо было как-то более адекватно отразить это в документации.

среда, 14 января 2009 г.

Как работает очередь асинхронных ShaderJob?

То ли  я недостаточно сообразителен, то ли документация не совсем соответствует действительности. Вобщем, суть проблемы такова:

В документации по ShaderJob.start() сказано:

Русская версия: "Одновременно может выполняться только одна фоновая операция ShaderJob. Все операции затенения помещаются в очередь и выполняются последовательно. При вызове метода start() во время выполнения операции затенения еще одна операция добавляется в конец очереди. Впоследствии, когда наступает очередь, она выполняется."

Английская версия: "Only one background ShaderJob operation executes at a time. Shader operations are held in a queue until they execute. If you call the start() method while a shader operation is executing, the additional operation is added to the end of the queue. Later, when its turn comes, it executes."

Но в реальности, при запуске нескольких ShaderJob...

shaderJob1.start();
shaderJob2.start();
shaderJob3.start();

...выполняется только shaderJob1 и все. Никакой очереди и последовательного выполнения.

В чем дело? Что может быть не так?

Буду весьма признателен вам за любую помощь.

пятница, 26 декабря 2008 г.

Об именовании Flash-специалистов.

Меня всегда сильно смущало, принятое в нашем сообществе, деление Flash-специалистов на "флешеров" и "флексеров" по странному, на мой взгляд, принципу: если в твоей работе много графики и анимации и немного (технически несложной, но иногда весьма впечатляющей) интерактивности, то ты - "флешер". А если ты создаешь бизнес-приложения, клиент-серверные решения, сервисы и прочие "большие и серьезные вещи", изобилующие сотнями килобайт кода и ветвистыми объектными структурами, то ты - "флексер", и точка.

Когда-то Flash был лишь технологией ограниченно программируемой векторной графики и анимации. Любой работающий с ней человек, спустя короткое время, получал полный и исчерпывающий пакет знаний по этой технологии. Если этот человек обладал, ко всему, еще и способностями художника или дизайнера, то он мог с чистой совестью называть себя Flash-специалистом или попросту "флешером". Он знал о Flash почти все и умел этим пользоваться. Чем не специалист-то? Для того времени - специалист - не вопрос. Но сейчас-то ситуация совсем другая. Flash, сохранив свои прежние возможности, развился до мощной клиентской платформы с полноценным языком программирования, оброс кучей библиотек и фреймворков, а "флешеры" до сих пор владеют лишь технологией ограниченно программируемой векторной графики и анимации. Так может им следует называть себя как-то иначе? Flash-художник/аниматор/дизайнер. И для посторонних людей будет звучать понятно и солидно.

Flex - фреймворк (или технология, как угодно), позволяющий быстро создавать развитый GUI для приложений на базе Flash-платформы. Именно появление Flex позволило всерьез говорить о Flash, как о платформе для бизнес-приложений. И вот, люди, освоившие этот фреймворк, стали называть себя "флексерами". Сделали они это, по всей видимости, для того, чтобы выбиться из массы "флешеров" и заявить о своей "серьезности". Любопытно то, что они продолжают так себя называть даже сейчас, после того как поняли, что Flex - один из многих фреймворков, которые приходится использовать в работе.

На мой взгляд, все это очень глупо. Глупо называть себя по имени платформы, когда не собираешься (и не в состоянии) изучать и использовать все ее возможности. Это, как и "компьютерщик", пахнет дилетантством. Глупо программисту называть себя по имени одного из фреймворков, используемых в повседневной работе. Представте, к примеру, что Java-программисты начнут называть себя "свингерами". Думаю, ряд, весьма забавных и даже пикантных, недоразумений им гарантирован.

Если бы этим заблуждением страдали только новички и дилетанты, это было бы простительно, хотя и опасно. Но ведь и серьезные специалисты (возможно, не осознавая этого) нередко сами несут эту чушь в массы своими высказываниями в блогах, подкастах и форумах. Слова этих людей имеют ощутимый вес, как в сообществе, так и за его пределами. К ним прислушиваются, в том числе и люди, принимающие бизнес-решения т.е. наши потенциальные заказчики и работодатели. Они не склонны к разбору тонкостей терминологии и могут по-разному толковать сложившеюся неоднозначность. Будьте уверенны, в большинстве случаев, толкование будет самым неправильным. Замечу, что для этих людей это не вопрос о том, кто и как называется, это вопрос об имидже и возможностях специалистов, и платформы в целом.

Нужно что-то менять.

понедельник, 9 июня 2008 г.

Очередное обновление технологической демо-версии проекта CYCLOPicture

  • Увеличена скорость обработки панорамы. Прирост составил около 50%.
  • Ликвидирована загрузка процессора во время простоя. Перерисовка теперь происходит только при необходимости.
  • Изменена подсистема динамического сглаживания и перспективной коррекции.
  • Угол зрения (FOV) теперь составляет 90 градусов.

Ознакомиться с технологической демо-версией можно на странице проекта.

понедельник, 26 мая 2008 г.

Обновлена технологическая демо-версия проекта CYCLOPicture

  • На 70% увеличено разрешение панорамы на выходе текстурного преобразователя. По моим данным, это математический максимум того, что можно выжать из текстурного преобразователя без потери качества.
  • Изменен алгоритм интерполяции. Качество панорамы на выходе текстурного преобразователя теперь не уступает оному таких профессиональных продуктов как PTGui Pro и пр.
  • На 30% повышена скорость обработки панорамы.

Ознакомиться с технологической демо-версией можно на странице проекта.

вторник, 13 мая 2008 г.

Старт проекта CYCLOPicture

Простите, я довольно долго ничего здесь не писал. Дело в том, что недавно я озадачился парой идей: Во-первых, мне захотелось создать проигрыватель интерактивных панорам и виртуальных туров, обладающий рядом полезных для потенциального заказчика функций, но отсутствующих в других продуктах этого класса. А во-вторых, я хотел успеть сделать хоть что-нибудь до конца приема работ на Russian Flash Awards.

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

Теперь бы попасть в каталог Russian Flash Awards и моему счастью не будет предела.

Мысли, посещавшие меня по ходу разработки, а также планы по развитию этого проекта будут опубликованы позже.

понедельник, 18 февраля 2008 г.

Трансформация объекта относительно произвольной точки

Недавно столкнулся с задачей трансформации (масштабирование, поворот или наклон) объекта относительно произвольной точки. Предлагаю к ознакомлению свое решение этой задачи.

package com.dmitrykrasnov.research {
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.geom.Matrix;
    import flash.geom.Point;

    public class TransformationAboutPoint extends Sprite {
        public function TransformationAboutPoint() {

            // Для примера, нарисуем квадрат.
            var myBox : Shape = new Shape();
            myBox.graphics.lineStyle(1, 0x000000);
            myBox.graphics.beginFill(0x000000);
            myBox.graphics.drawRect(16, 16, 32, 32);
            myBox.graphics.endFill();

            // Возьмем его матрицу трансформации и повернем ее на 45 градусов.
            // Заметьте, поворот произойдет относительно начала координат.
            var myMatrix : Matrix = myBox.transform.matrix;
            myMatrix.rotate(Math.PI / 4);

            // Выберем точку вращения (пусть это будет центр нашего квадрата).
            var axisPoint : Point = new Point(32, 32);

            // Выясним, куда она сместилась в результате поворота.
            var newPoint : Point = myMatrix.transformPoint(axisPoint);

            // Вычислим относительное смещение.
            var deltaX : Number = axisPoint.x - newPoint.x;
            var deltaY : Number = axisPoint.y - newPoint.y;

            // Компенсируем относительное смещение.
            myMatrix.translate(deltaX, deltaY);

            // Применим трансформации к нашему квадрату.
            myBox.transform.matrix = myMatrix;

            // Посмотрим на результат.
            addChild(myBox);

            // На всякий случай, нарисуем проверочные направляющие.
            var guideLines : Shape = new Shape();
            guideLines.graphics.lineStyle(1, 0xFF0000);
            guideLines.graphics.moveTo(0, axisPoint.y);
            guideLines.graphics.lineTo(64, axisPoint.y);
            guideLines.graphics.moveTo(axisPoint.x, 0);
            guideLines.graphics.lineTo(axisPoint.x, 64);
            addChild(guideLines);
        }
    }
}

Если кому-то известно более изящное решение, пожалуйста, опишите его в комментариях.

воскресенье, 17 февраля 2008 г.

Впечатления от 3-й встречи RAFPUG

Сегодня я посетил 3-ю встречу RAFPUG, которая проходила в московском офисе Adobe. Так что спешу поделиться впечатлениями от этого мероприятия. Они, скажу сразу, не особо положительные, но уж какие есть.

Началось все с того, что я пришел несколько раньше положенного, спросил, где можно повесить куртку и где у них курят, после чего вышел на улицу, покурить. Через какое-то время следом за мной вышел молодой человек (я сознательно не буду называть его имени, давая ему возможность извиниться) и, обращаясь ко мне на "ты", с нескрываемым удивлением приподняв брови, спросил: "А ты что, тоже программист?" Выяснив, что он разговаривает все-таки с разумной особью, молодой человек оборвал беседу и спешно удалился. Я, конечно, могу его понять, так же как и те люди, которые меня знают, или хотя бы видели, но, по-моему, подобное поведение является как минимум бестактностью граничащей с хамством, и уж точно не свидетельствует о большом уме человека.

Первым в программе встречи был анонс конкурса Russian Flash Awards, в ходе которого был продемонстрирован видеоролик, смонтированный из работ участников конкурса прошлого года. Все бы ничего, только впечатление портило то, что многие работы были вставлены в ролик вместе с окном браузера, в котором они работали. На мой взгляд - это не профессионально.

Далее был катастрофически занудный доклад Александра Козловского в котором он пытался продемонстрировать построение несложного AIR-приложения с использованием Papervision3D. Не знаю, сколько он готовился к этому докладу, но в процессе, то и дело случались какие-то заминки и сбои, что приводило к частым длительным паузам, во время которых скучающая аудитория была вынуждена наблюдать судорожные метания Александра в попытках сделать хоть что-нибудь. Сути и общих принципов в этом докладе было минут на 5, а хоть сколько-нибудь вдохновляющего результата я вообще не увидел, если не считать 3-х тормозных кубиков, которые предлагалось использовать в качестве меню. В общем, во время этого безобразия я постоянно клевал носом, а под конец и вовсе задремал и чуть не упал с кресла. Положение спасал только Артемий Малков (если я не ошибаюсь), который периодически коротко объяснял суть того, что в данный момент происходило или, по крайней мере, должно было происходить.

Вдохновенность Артемия Малкова, который во время "Hands-on" повествовал о layout-ах и binding-ах, могла бы, как минимум, удивить человека, хотя бы раз видевшего Delphi. Ну а я лишь невесело усмехнулся, встал и ушел.

суббота, 16 февраля 2008 г.

computeSpectrum - двигатель всего

Вдохновившись алхимическими опытами Татьяны Белой (огромное ей спасибо) и перекопав некоторое количество документации, я создал это:

Боюсь, что какую-то ценность это имеет только для меня, т.к. ничего нового не изобретено, но получен опыт, да и похвастать очень хочется.

PS: Градиенты в AS3 меня не обрадовали - излишняя сложность и дефицит возможностей. Вот если бы, скажем, можно было строить градиент вдоль кривой...

понедельник, 4 февраля 2008 г.

MODx - серверная составляющая Flash-сайта

MODx - функциональная, расширяемая и удобная система управления сайтом (Content Management System, CMS), свободно распространяемая по лицензии GNU GPL. Сами разработчики позиционируют ее даже как систему разработки сайтов (Content Management Framework , CMF).

Почему MODx кажется мне удачной серверной составляющей Flash-сайтов? Поясню по пунктам:

  • Система разработана на языке PHP и для хранения данных использует СУБД MySQL. Это значит, не возникнет проблем с выбором хостинга.
  • Гибкая система плагинов, сниппетов, шаблонов и чанков позволяет выводить документы практически в любом формате. Не является исключением и XML-формат, удобный для обмена данными с Flash. К примеру, можно получить XML, содержащий информацию об актуальной структуре сайта и использовать его при формировании навигационного меню. Или получите XML со списком графических файлов в папке и организуйте, легко обновляемую, галерею. И это лишь часть возможностей.
  • Инструменты MODx позволяют легко и быстро создать HTML-версию сайта, обновление которой будет происходить автоматически и синхронно с Flash-версией. Таким образом, можно решить проблему поисковой индексации и угодить пользователям не желающим (или не имеющим возможности) установить Flash-плеер.
  • Простая установка и настройка. Не менее простое сопровождение и расширение. И все это не требует каких-то особых навыков. Ну а если вы хорошо разбираетесь в PHP, то сможете творить чудеса.

Есть у MODx и недостаток - падение производительности при росте числа документов. Это становится заметно, когда количество документов приближается к 5000. Но такое количество документов свойственно крупным и очень крупным проектам.

Таким образом, я бы рекомендовал использовать MODx при создании малых и средних Flash-сайтов, требующих регулярного обновления. Таковыми могут быть портфолио дизайнеров или художников, сайты промо-поддержки, корпоративные сайты малых и средних компаний и т.п.

Информации о MODx в интернете довольно много, даже на русском языке. Достаточно воспользоваться Яndex по слову "MODx". А официальный сайт находится по адресу: modxcms.com