Показать сообщение отдельно
Старый 11.07.2010, 15:11
petyakurochkin вне форума Посмотреть профиль Отправить личное сообщение для petyakurochkin Найти все сообщения от petyakurochkin
  № 1  
Ответить с цитированием
petyakurochkin

Регистрация: Jun 2010
Сообщений: 9
По умолчанию Система частиц

В общем, захотелось мне написать что-то красивое. Подумал, что система частиц - это самое оно. Решил сделать подобие огня, но так и не доделал, ибо лаги аццкие. На 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. Ждать аппаратного ускорения.
Вложения
Тип файла: zip particles.zip (20.7 Кб, 419 просмотров)