![]() |
Рендеринг воды и нечто вроде metaballs
Уже около месяца в свободное время от прошедшей сессии и поездки во Владикавказ к родне я пытаюсь запрогать воду. Сейчас передо мной стоит задача отображения воды на экране. Вода - 100-200 частиц, которые движутся, взаимодействую друг с другом.
Сейчас добился немного похожего на воду вида... но всё это происходит слишком медленно. Вот мои примеры: 100 частиц 150 частиц 200 частиц Тут есть примеры без прорисовки воды. Скорость заметно различается... Для рисования всего этого дела я поступаю так: Код AS3:
кто-нибудь может придумать быстрее? |
GlowFilter?
|
не, GlowFilter не тот результат даёт. Да и работает так же медленно..
|
|
последнее совсем не на ту тему...
|
|
Во флеш отрисовка очень медленная, а тем более работа с битмапой. Можно сильно ускорить алгоритм, если удастся решить задачу только математикой, без отрисовки. Т.е. аналитически находить границу воды и рисовать только ее. Можно попытаться немного ускорить алгоритм, использовав PixelBender, но не факт что ускорение будет иметь место.
|
Цитата:
Мысли были на тему metabal+marching squares. но тут опять проблема: если делать размер сетки мелким-получаем медленную прорисовку(много вычислений), если делать крупную-то marching squares будет рисовать некрасивые фигурки.. |
Можно получить небольшой прирост оптимизацией кода. Например не создавать каждый раз новую матрицу а использовать одну во всем цикле, ну и т.п.
|
уже сделал) то был набросок кода, но скорость заметно не изменилась. Ещё вместо рисования одного и того же кружка в разных местах
Код AS3:
ещё добавлю) может я не совсем понимаю, как работает прорисовка во флэше, т.е. вообще сами Bitmap'ы и все display object'ы, но как я понял скорость работы treshold зависит от того, нарисовано ли что-нито на битмапе или нет) |
А как она может не зависеть? Если все пиксели не проходят проверку, код будет выполняться быстрее, так как не выполняются операции над пикселями.
|
а там Bitmap устроен так, что если ничего на нём не нарисовать, то в нём не будет пикселей вообще?
|
Искал что-то свое, нашел случайно.
http://www.petrileskinen.fi/Actionscript/Metaballs.php Может пригодится? =/ Тормозит, правда, еще больше чем у тебя, но может это из-за освещения. |
Попробовал его способ(вместо treshold сделать ColorMatrixFilter), вышло раза в 3 медленней..
|
ну, нужно для начал определеить узкое место. Является ли им threshold, или все таки
Код:
bubbles.beginGradientFill(GradientType.RADIAL, [0xFF,0xFF], [1,0], [60, 255],m); //рисую полупрозрачные кружки от центра к краям |
от градиентов в цикле я избавился. Теперь его я 1 раз рисую до начала симуляции:
Код AS3:
потом уже при рисовании: Код AS3:
|
Тут, короче, оптимизировать нечего =) Ну кроме заменить for на while (i--) - говорят он быстрее. Или написать более быстрый программный аналог threshold =/
|
неее) щас посмотрел, что жрёт время.. цикл-50-60 мс, всё остальное 1-2 мс.
В чём тогда проблема? я не понимаю... вот это Код AS3:
|
Ну 50мс - это довольно много. Собственно - это падение до 20 fps.
|
сopyPixels быстрее
|
copyPixels, как я понял, тупо копирует значения пикселей. А мне надо именно накладывать одно на другое. Сама идея метода в том, что вокруг капли делается круг с растущей от центра прозрачностью. Когда 2 круга рядом, между ними изображение становится менее прозрачным. Получается слияние капелек. Может я неверно понял работу copyPixels, но я даже проверил и ничего дельного не получил..
|
copyPixels не совсем тупо копирует, он учитывает альфа-канал. То есть, вам надо нарисовать градиентный круг в альфа-канале, а RGB залить сплошным цветом.
|
Опа, я сильно ошибся про CopyPixels! Надо было просто FillRect сделать! fps вырос на 10!
|
покаж, покаж
|
|
это офигенно! Веса им только чуть-чуть добавить и вязкости.
|
Спасибо! это уже другая тема) А быстроты прорисовки я добился! Ура)
|
Круто, молодец! А можешь их уменьшить и больше кол-во сделать?
|
могу, и скорость работы только возрастает от этого) но симуляция становится менее стабильной. наверно завтра продолжу, сегодня уже устал..
|
Герыч, молодец.
Когда вы подняли тему 200 шариков у меня показывали 17FPS, теперь 108. Серьезно постарались, респект и удачи вам в дальнейших опытах. Оптимизация великая вещь :) |
Спасибо) у меня 108 не выдаёт.. у меня на 46 держится. Но может это и к лучшему, что у меня не оч быстрый комп)
|
У меня ~70-80 на Core2duo 2.4, винда
Сделано потрясно, респект. |
AL.exe, хм у меня как бы тоже самое, странный разброс :)
|
Возможно наврал, может быть, там 2.1. У меня столько компов, что я путаюсь :)
Добавлено через 1 минуту Вы, наверное, 200 шаров смотрите, а не 300 :) |
Цитата:
Кстати 300 шаров показывают так же как и у вас 70-80 :) |
Ну у вас и компы...) интересно, а у среднего пользователя, какая скорость?
А ещё сегодня возник вопрос. Сколько реально кадров в секунду на экране показывается? Т.е. есть ли смысл просчитывать графику для лишних кадров, если их никто не увидит? Вся моя симуляция фактически находится в ENTER_FRAME листенере. И в нём и физика считается и графика(то что было выше рассмотрено) |
Реально - зависит от монитора и того, как вы сделали синхронизацию. Если просто ENTER_FRAME, то частота ограничена установленным stage.frameRate. У современных TFT частота обновления экрана около 75 Гц, у CRT может быть все 150 (также зависит от разрешения).
|
>>Реально - зависит от монитора и того, как вы сделали синхронизацию. Если просто ENTER_FRAME, то частота ограничена установленным stage.frameRate. У современных TFT частота обновления экрана около 75 Гц, у CRT может быть все 150 (также зависит от разрешения).
На частоту монитора флешу пофонарю, так-же как и монитору на флеш плеер. Просто все раскидывается и отрисовуется ,только то, что в данный момент, а фреймы идут типа таймера. |
то есть я сделал правильно поместив просчёт физики и прорисовку в одном месте??
|
Цитата:
Цитата:
|
| Часовой пояс GMT +4, время: 06:21. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.