Форум 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 очень рекомендую.


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

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