Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Система частиц (http://www.flasher.ru/forum/showthread.php?t=142051)

petyakurochkin 11.07.2010 15:11

Система частиц
 
Вложений: 1
В общем, захотелось мне написать что-то красивое. Подумал, что система частиц - это самое оно. Решил сделать подобие огня, но так и не доделал, ибо лаги аццкие. На 50-и частицах у меня начинаются неимоверные тормоза и подбирать параметры при таком рендеринге я как-то не могу.
http://petya-kurochkin.narod.ru/particles.html - это то, что получилось.
Исходники во вложении.

Немного о том, как я это делал:
1. Создаётся Bitmap. С помощью AddChild он добавляется к экземпляру класса документа.
2. Загружается картинка с файла, и используется как текстура при создании сис-мы частиц.
3. Система частиц (ParticlesSystem) создаёт массив Particles, даёт им случайные текстуры (но в примере я использовал только одну) и рандомизирует всякие параметры: скороть, угловая скорость, угол, начальные координаты, первое время жизни и т.п.
4. Подписываемся на ENTER_FRAME, в котором вызываем метод Render() сис-мы частиц. Та, в свою очередь вызывает метод Render() у каждой частички. Particle.Render обновляет данные о частице (скорость и т.п.) и делает метод Bitmap.Draw() с соответствующими цветовыми и пространственными преобразованиями. Метод наложения multiply.
5. После этого копируем с вспомогательного Bitmap'а всё на основной.

Но при такой схеме всё достаточно сильно тормозит. Как можно оптимизировать? Я избавился от всех лишних операций с памятью, пересмотрел код и т.п., но мысли приходит только три:
1. Делать не Draw(...), а использовать какие-то другие средства для рисования, возможно, более быстрые.
2. Избавится от цикла вызовов Particle.Render, а в цикле пройтись по его параметрам из внешнего класса таким образом сократив время на вызов функции. Но мне кажется, что это левое решение, ибо портит архтитектуру + неизвестно, сколько времени потратится на обращение к данным класса Particles.
3. Ждать аппаратного ускорения.

petyakurochkin 11.07.2010 18:17

Никто систему частиц не делал никогда, что ли?(

VVall 11.07.2010 19:12

При рисовании через copyPixels и с общим обработчиком для всех частиц (без объекта "частица" и вызовов её методов) будет существенно быстрее. draw и постоянные вызовы методов тормозят. Если надо частицы разных цветов и размеров, можно подготовить их заранее (программно) во всех нужных вариантах.

Сайлас 11.07.2010 19:30

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

petyakurochkin 11.07.2010 19:54

VVAll при наличии у частиц альфа-канала уже не получится использовать CopyPixels, очевидно же. Вариант программной подготовки всех возможных вариантов частиц тоже как-то не впечатляет: чел. глаз может видеть, как я помню несколько миллиардов цветов. Да черт с ним, даже, если сделать 65535 цветов еще остаётся трансформация поворота. Т.е. еще минимум 300 вариантов. Перемножаем. Мде. Нехило так выходит. А ведь еще несколько текстур на одну частицу планируется.

Сайлас:
Цитата:

То, что вы сейчас делаете - это отрисовывание программное многоразовое перерисовывание кучи пикселов.
А в том случае, когда битмапы будут ездить, их будет расчитывать специальная плата для расчёта пикселей, что ли? У флеша же нет аппаратного ускорения, откуда пойдёт прирост прозводительности?

VVall 11.07.2010 20:15

А не надо замахиваться на такое количество вариантов частиц и прочие навороты. Проблема с альфа-каналом решается точно так же, как и с цветами. Просто надо помнить, что Flash медленный по всем параметрам, и не пытаться использовать его не по назначению.

Сайлас 11.07.2010 20:16

Я думаю мало кто расскажет, как обрабатывает флеш движение своих элементов (хотя, на этом форуме, есть знатоки внутренностей флеша). Но хотя бы достаточно того, что те библиотеки написаны не на экшнскрипте, а ниже на с++ скорее всего.

Ну и не говоря, о том, что вы с этими пикселями еще лишние действия делаете. Ну попробуйте крутить и двигать 50 битмапов и посмотрите на результат.

Котяра 11.07.2010 23:26

вот хорошие демки по работе с партиклями:
http://www.nulldesign.de/category/ex...nts/particles/

движки

* FLiNT
http://flintparticles.org/
* Partigen (Not free)
http://desuade.com/products/partigen/
* Pulse Particle System - A general purpose AS3 particle system.
http://www.rogue-development.com/pulseParticles.html
* Emitter - ActionScript 3.0 particle FX engine.
http://code.google.com/p/emitter/
* Stardust - ActionScript 3.0 Particle engine.
http://code.google.com/p/stardust-particle-engine/
* Orion - An all around simple and flexible particle generator.
http://blog.coursevector.com/orion
* particlesun - A 3D or 2D Particle Engine for Actionscript 3.0
http://code.google.com/p/particlesun/

i.o. 12.07.2010 00:23

petyakurochkin, проверяете ли вы, перед тем как вызвать draw, попадает ли отрисовываемая частицу в "поле зрение" битмапы, на которой вы рисуете? Если частица выходит за ее границы - то неотрисовка частицы может серьезно увеличить производительность

formid 05.12.2010 01:41

А кто-нибудь может хотя бы в общем описать плюсы/минусы этих движков. В частности интересует самый быстрый и самый легковесный.


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

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