|
|
|||||
[+4 06.05.14]
|
Слот СПИН, плавность
Всем привет. Честно говоря даже неудобно спрашивать такие вопросы, так как данной работой я зарабатываю деньги уже как лет 8 почти, но с другой стороны, я никогда не претендовал на гения математики или оптимизации...
По делу : чтобы всем было понятно, возьмем готовый с интернета пример о чем идет речь http://snorkl.tv/dev/blitmask/slotDemo.html В нашем случае таких барабанов 5, по 3 символа на барабане, ну то есть масштаб чуть больше. Пишем мы на haxe, поэтому, если будете рассматривать твинеры и т.п. имеем только Actuate. Далее описываю алгоритм, как это работает у меня : сервер подает раскладки, у каждого барабана свое кол-во символов, от 20 до 500 например, то есть вариации приличные. Каждый символ некий класс на Bitmap (пускай просто картинка типа png). Каждый барабан хранит в себе маску, которая соответсвенно показывает на экране 3 символа, но держит за маской и остальные, например в 500 штук (общий контейнер). Спин происходит следующим образом, вешается таймер в 30-50 мс, с каждым тиком контейнер символов двигается на ровное кол-во px например на 20. Когда полоска символов доходит до конца, перекидывается на 0 и продолжается далее, чтобы не было швов 3 символа конца = 3 символам начала. В настойщий момент вешаю таймер в 1 мс и двигаю по 20пх (так выходит более плавно, чем таймер на 30мс и двигать по 60пх например). Вот собственно и все, в итоге конечно получается немного дерганно, не плавно, но как улучшить данный процесс, пока мозгов не хватило. Если же ранее мы могли использовать блитМаск, то теперь этого нет, да и не надо, не думаю, что все известные игроделы его юзают. П.с. какие у меня есть идеи, но применять их пока не хочу, так как думается мне прирост будет совсем минимальный, но вдруг вы скажите, что прирост будет приличный : 1) сделать ОБЩУЮ маску на все 5 барабанов, а не у каждого барабана свою маску. 2) сделать ОБЩИЙ таймер на все 5 барабанов, а не у каждого свой. П.п.с - само собой по скольку пишем на Хаксе, все это портируется как в swf так и в html5, так вот в html5, все то, что я описал выше работает очень плавно ( видимо там рендер по-другому пляшет , ну само собой ) Всем спасибо!
__________________
Марк Tween |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
а от чего бы не разбить на отдельные символы и для каждого барабана рисовать со смещением текущий+предыдущий+следующий символы? Это было бы оптимально с т.з. производительности.Листать портянку из 500 символов да еще и под маской никакой батарейки не хватит(если вы на мобилки собираетесь)
|
|
|||||
Цитата:
Цитата:
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
[+4 06.05.14]
|
Ну на мобилки не претендуем конечно.
undefined / caseyryan Плюсануть то можно, и это первоначальная идея была, когда я только начинал заниматься этим, однако смотрите сами : тут ты просто крутишь контейнер ничего другого не делая, а тут ты каждые 20 мс, будешь создавать новый битмап, ну или брать из массива ( по сути все равно в памяти будет висеть) то есть у тебя каждые 20 мс будет : bit = getImage("someNewPng"); хотите сказать это явно будет быстрее? Это перввый нюанс, второй нюанс : у нас на экране 20 картинок( по вашей логике), 4 на каждом, вот и смотри - как только 4й уходит за маску, его надо удалить со сцены или переместить наверх, затем сменить в нем Битмап( что я описал в первом нюансе) и продолжить движение, опять затраты производительности, ну и наконец!- самое печальное, что у тебя шанс того, что будет стык стремится к 100% , так как размер поля скажем 500, а двигать мы можем и по 14 пх, и по 13 пх, в зависимости от нужд, соответсвенно будут стыки, то есть не будет ровной проверки if(y == 500) будет проверка на if(y >= 500) - что скорее всего и произойдет в нескольких разах.
__________________
Марк Tween |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
Цитата:
Цитата:
Последний раз редактировалось undefined; 27.11.2017 в 22:08. |
|
|||||
[+4 06.05.14]
|
undefined - это всего лишь умозаключение - попробовал еще раз вернуться на старые грабли, потратил добрых 30 минут переписать все - плавности как не было так и нет, ниче не меняется.
__________________
Марк Tween |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Ты хочешь сказать что у тебя 15 битмап на экране тормозят?
Добавлено через 1 минуту Цитата:
|
|
|||||
in4core
странно, на самом деле, вертеть портянку. Я когда делал слоты, делал так - сначала математически "крутил" барабан из 500 слотов и сразу получал целевые слоты (допустим 3,7,0). Потом запускал анимацию, типа барабан крутится, все красиво, все довольны. Анимацию делал разными способами - один это просто размытое нечто пару-тройку секунд, второй - это подстановка вверх нового символа и прокрутка на слот вниз (для достижения именно такого эффекта, как в примере топикпастера). В общем, придолжном творческом подходе можно сделать очень даже симпатично и неотличимо от оригинала так сказать. Затем, по истечении заданного времени для анимации кручения, подставлял вверх три целевых слота и уже делал анимацию остановки твином там каким-нибудь. Помню, делал так тоже для того, чтобы добиться производительности. У меня все летало.
__________________
while(live()) { hope(); } |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
еще одна засада с таким подходом - можно упереться в максимальный размер DO,он,конечно,большой,но не бесконечный.
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
а я вертел портянку. 5 столбиков по 200 картинок, 8 строк под маской, крутил 1 раз. Крутил ТвинЛайтом с небольшой задержкой между стартами для каждой колонки, и ТвинЛайтом же управлял БлюрФильтром. Не знаю, как с точки зрения вашего перфекционизма, а как по мне вполне убедительно крутилось.
Мне кажется, как раз портянка — лучшее решение для быстродействия: в процессе движения никаких созданий и перетасовываний не происходит, скачкам и задержкам просто неоткуда взяться.
__________________
Reality.getBounds(this); |
Часовой пояс GMT +4, время: 06:23. |
|
« Предыдущая тема | Следующая тема » |
|
|