Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Starling] Замена BW фильтру (http://www.flasher.ru/forum/showthread.php?t=208592)

ShockWave512 02.08.2014 13:04

Замена BW фильтру
 
Есть около 100 Image-s на экране.
Нужен способ сделать всех чёрно-белыми (потом еще красными).
Фильтр не подходит, так как на довольно сильном десктоп гпу (i5-2500) падает до 17 кадров в секунду.
Для кеширования фильтров нужно создавать фильтр для каждого имажа.
Создание дополнительных текстур рассматривается в последнюю очередь.
Буду рад любым советам и ответам!

Tails 02.08.2014 13:14

Способ 1: Пишете на AGAL шейдер, который будет перекрашивать объекты на экране в реальном времени.
Способ 2: Пишете на PixelBender шейдер, который перед запуском сразу создаст перекрашенную текстуру.

Можно комбинировать, сначала создать одну чб текстуру перед запуском, а затем подкрашивать разные image разными цветами при помощи AGAL.

ShockWave512 02.08.2014 13:23

да, про агал не вспомнил, спасибо! ушел ковырять!

Tails 02.08.2014 13:31

BW фильтр на AGAL, что-бы проще было разбираться:
Код AS3:

package mvc.view.shaders 
{
        import starling.textures.Texture;
        import flash.display3D.Context3D;
        import flash.display3D.Program3D;
        import starling.animation.IAnimatable;
        import starling.filters.FragmentFilter;
        import flash.display3D.Context3DProgramType;
 
 
        /**
        * Чёрно-белый шейдер.
        * @author iiNode
        */

        public class NoColor extends FragmentFilter{
 
                // Приват
                private var _program:Program3D;                                                // Шейдер отрисовки
                private var _parameters:Vector.<Number>;                        // Вектор для передачи параметров фильтра
 
 
                /// Создать фильтр чёрно-белого вывода.
                public function NoColor() {
                        super();
 
 
                        _parameters                        = new Vector.<Number>(4, true);
                        _parameters[0]                = 3;
                        _parameters[1]                = 0;
                        _parameters[2]                = 0;
                        _parameters[3]                = 0;
                }
 
 
                // ОПРЕДЕЛЕНИЕ
                override protected function activate(pass:int, context:Context3D, texture:Texture):void {
                        context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT, 0, _parameters);
                        context.setProgram(_program);
                }
        protected override function createPrograms():void {
 
                        var fragmentProgramCode:String =
 
                                // Среднее арифметическое от суммы цветовых каналов.
                                // Чёрно-белый цвет.
 
                                "tex ft0, v0, fs0 <2d, clamp, linear, mipnone>        \n" +
                                "add ft1.x, ft0.x, ft0.y                                                \n" +
                                "add ft1.x, ft1.x, ft0.z                                                \n" +
                                "div ft0.x, ft1.x, fc0.x                                                \n" +
                                "mov ft0.yz, ft0.xx                                                        \n" +
                                "mov oc, ft0                                                                        \n";
 
                        _program                        = assembleAgal(fragmentProgramCode, STD_VERTEX_SHADER);
        }
 
 
                // УДАЛЕНИЕ
                public override function dispose():void{
                        _program.dispose();
                        super.dispose();
                }
        }
}


ShockWave512 02.08.2014 13:40

Уже +10 кадров есть с вашим классом!

А что там еще можно оптимизировать?

Tails 02.08.2014 13:45

Не знаю, вам виднее должно быть :)
Это зависит от конкретной задачи. Опишите более подробно во всех деталях, что именно вы хотите сделать.

ShockWave512 02.08.2014 13:54

тут хорошо видно - http://sk-express.ru/plantasia/ (выбрать любой уровень)

есть поле с цветами, 80 типов спрайта (20 типов цветов по 4 фазы каждый), в какой то момент все цветы могут стать серыми, затем красными

используется as3isolib портированный на старлинг, у каждого iso объекта есть свой спрайт цветка в контейнере

сейчас ко всем имажам применен фильтр, для теста

Tails 02.08.2014 14:29

Демка у меня летает. Правда, точно fps посмотреть не смог, датчик слишком мелкий, не разобрать. Вообщем, такое количество спрайтов не должно особо напрягать gpu.
С isolib не знаком, но могу дать несколько советов по Starling:
  • Используйте атласы текстур. (Ускорение производительности)
  • Используйте только целочисленные координаты для спрайтов. (Предотвращает размытие текстур и делает спрайты более чёткими)
  • Попробуйте отключить промежуточные mipMap автоматически создаваемые текстуры для меньших размеров. (Не уверен что есть польза от них в 2д)
  • Для покраски цветочков в цвет - попробуйте свойство color у Image. Только не забудьте отключить перед этим BW фильтр. Это должно быть быстрее любого фильтра.
  • Проведите анализ производительности с помощью AdobeScout. Так вы сможете точно понять, что и сколько тратит системных ресурсов.

ShockWave512 02.08.2014 14:36

ctrl - + на странице
или кнопка FullScreen там снизу на часах

Tails 02.08.2014 14:43

60 fps
Cpu: 4x 4.20 GHz
Gpu: Radeon R7 200

Провести мониторинг через AdobeScout очень рекомендую.

ShockWave512 02.08.2014 14:45

да и так ясно без скаута
до фильтров у меня тоже 60 на любом гпу, даже на планшете
при включении чб фильтра сразу падает до 10-20

Tails 02.08.2014 14:47

Попробуйте создать 1 экземпляр фильтра и один раз установить его в свойство filter всех дисплей объектов.
Попробуйте замерить fps 100 фильтров на чистом Starling.

ShockWave512 02.08.2014 14:56

пробовал, хуже

Tails 02.08.2014 15:56

У вас цветочки ведь не анимированные?
Тогда можно провернуть такой финт:
  1. Создаёте спрайтА и спрайтБ
  2. СпрайтБ - это контейнер, в котором отображается ваш цветочек. На этот контейнер вешаете любой фильтр, хоть даже самый тяжелый.
  3. Помещаете спрайтБ в спрайтА
  4. СпрайтуА вызываете метод flatten();

Таким образом, изменённая текстура цветочка кешируется и не перерисовывается каждый кадр заного. Когда нужно обновить отображение цветочка снова, вызываете спрайтуА flatten();

ShockWave512 02.08.2014 17:10

понял, попробую

Добавлено через 49 минут
так, а где у старлинговского Image flatten() ?

вроде был раньше ...


понял, там нужен контейнер отдельный

LifeIsRhythm 02.08.2014 18:29

4 fps...:(

ShockWave512 02.08.2014 18:46

2LifeIsRhythm - 4fps - это где?

2Tails - после flatten() перестает анимироваться покачивание, пробовал и на СпрайтА анимировать, такое может быть?

Tails 02.08.2014 18:51

Раскачивайте спрайтА, у которого flatten() вызываете. Проверьте ещё раз, вы где-то ошиблись, должно работать.

ShockWave512 02.08.2014 19:51

2Tails - Громадное спасибо! Теперь все в норме! выдает честные 60-50 кадров!
:drinks:

LifeIsRhythm 02.08.2014 22:52

Теперь до двух снизилось... У меня ноут, что-то типа 4ГБ оперативы, 3 ядра, но вот ускорение наверное не поддерживает.
Хотя я не верю, что Ваша игра потребляет ресурсов больше mortal combat последний, которая у меня играет.

ShockWave512 02.08.2014 23:06

если в хроме то понятно, есть там такой глюк

LifeIsRhythm 03.08.2014 01:18

В FF тоже..

Добавлено через 3 минуты
Это в ubuntu. Сейчас из-под windows зашел и 62 стабильно.

Добавлено через 3 минуты
Не знал, что есть разница.

ShockWave512 03.08.2014 01:22

о божечки, какой еще линукс
не издевайтесь

linux не поддерживается давно уже, ни флеш плеером, ни айр
странно что вообще запустилась флешка

LifeIsRhythm 03.08.2014 01:22

Правое дерево просто изумительно ! :)

ShockWave512 03.08.2014 01:24

там их два, вверху и внизу
какое из них?

LifeIsRhythm 03.08.2014 01:26

Я про то, что на самой грядке, в верху с права.

ShockWave512 03.08.2014 01:31

Цитата:

Сообщение от LifeIsRhythm (Сообщение 1170047)
Я про то, что на самой грядке, в верху с права.

вы еще не видели деревья в чародеях
вот там деревья
http://prntscr.com/48x0v5

LifeIsRhythm 03.08.2014 02:13

Цитата:

вы еще не видели деревья в чародеях
Не слов... Сколько интересно время уходит на написание такой иллюстрации?

ShockWave512 03.08.2014 10:52

Цитата:

Сообщение от LifeIsRhythm (Сообщение 1170050)
Не слов... Сколько интересно время уходит на написание такой иллюстрации?

зависит сильно от художника, от недели ...


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

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