Форум 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=214780)

in4core 27.11.2017 20:32

Слот СПИН, плавность
 
Всем привет. Честно говоря даже неудобно спрашивать такие вопросы, так как данной работой я зарабатываю деньги уже как лет 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, все то, что я описал выше работает очень плавно ( видимо там рендер по-другому пляшет , ну само собой )

Всем спасибо!

undefined 27.11.2017 20:42

а от чего бы не разбить на отдельные символы и для каждого барабана рисовать со смещением текущий+предыдущий+следующий символы? Это было бы оптимально с т.з. производительности.Листать портянку из 500 символов да еще и под маской никакой батарейки не хватит(если вы на мобилки собираетесь)

caseyryan 27.11.2017 21:02

Цитата:

Сообщение от undefined (Сообщение 1203180)
а от чего бы не разбить на отдельные символы и для каждого барабана рисовать со смещением текущий+предыдущий+следующий символы? Это было бы оптимально с т.з. производительности.Листать портянку из 500 символов да еще и под маской никакой батарейки не хватит(если вы на мобилки собираетесь)

Пожалуй плюсану к этому ответу. Это единственный нормальный сопособ отрисовать такую махину без видимых фризов.
Цитата:

так вот в html5, все то, что я описал выше работает очень плавно
Давно уже известно, что JS, в среднем, в 6 раз быстрее флеша

in4core 27.11.2017 21:38

Ну на мобилки не претендуем конечно.
undefined / caseyryan Плюсануть то можно, и это первоначальная идея была, когда я только начинал заниматься этим, однако смотрите сами : тут ты просто крутишь контейнер ничего другого не делая, а тут ты каждые 20 мс, будешь создавать новый битмап, ну или брать из массива ( по сути все равно в памяти будет висеть) то есть у тебя каждые 20 мс будет : bit = getImage("someNewPng"); хотите сказать это явно будет быстрее? Это перввый нюанс, второй нюанс : у нас на экране 20 картинок( по вашей логике), 4 на каждом, вот и смотри - как только 4й уходит за маску, его надо удалить со сцены или переместить наверх, затем сменить в нем Битмап( что я описал в первом нюансе) и продолжить движение, опять затраты производительности, ну и наконец!- самое печальное, что у тебя шанс того, что будет стык стремится к 100% , так как размер поля скажем 500, а двигать мы можем и по 14 пх, и по 13 пх, в зависимости от нужд, соответсвенно будут стыки, то есть не будет ровной проверки if(y == 500) будет проверка на if(y >= 500) - что скорее всего и произойдет в нескольких разах.

undefined 27.11.2017 21:55

Цитата:

а тут ты каждые 20 мс, будешь создавать новый битмап, ну или брать из массива ( по сути все равно в памяти будет висеть)
Так они и сейчас в памяти висят
Цитата:

а тут ты каждые 20 мс, будешь создавать новый битмап, ну или брать из массива ( по сути все равно в памяти будет висеть)
Взятие из массива намноого быстрее,чем отрисовка битмапы.
Цитата:

ну и наконец!- самое печальное, что у тебя шанс того, что будет стык стремится к 100% , так как размер поля скажем 500, а двигать мы можем и по 14 пх, и по 13 пх, в зависимости от нужд, соответсвенно будут стыки, то есть не будет ровной проверки
Смотри,ты анимируешь некий параметр t от 0 до 1.Смещение вычисляешь как dy=t*symbolHeight все.Больше никаких проверок не требуется.В конце анимации тебе просто надо переставить битмапы и повторить анимацию снова.Никаких стыков заметно быть не должно

in4core 27.11.2017 22:18

undefined - это всего лишь умозаключение - попробовал еще раз вернуться на старые грабли, потратил добрых 30 минут переписать все - плавности как не было так и нет, ниче не меняется.

undefined 27.11.2017 22:33

Ты хочешь сказать что у тебя 15 битмап на экране тормозят?

Добавлено через 1 минуту
Цитата:

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

ZergMaster 27.11.2017 22:35

in4core
странно, на самом деле, вертеть портянку.
Я когда делал слоты, делал так - сначала математически "крутил" барабан из 500 слотов и сразу получал целевые слоты (допустим 3,7,0). Потом запускал анимацию, типа барабан крутится, все красиво, все довольны. Анимацию делал разными способами - один это просто размытое нечто пару-тройку секунд, второй - это подстановка вверх нового символа и прокрутка на слот вниз (для достижения именно такого эффекта, как в примере топикпастера). В общем, придолжном творческом подходе можно сделать очень даже симпатично и неотличимо от оригинала так сказать. Затем, по истечении заданного времени для анимации кручения, подставлял вверх три целевых слота и уже делал анимацию остановки твином там каким-нибудь.
Помню, делал так тоже для того, чтобы добиться производительности. У меня все летало.

undefined 27.11.2017 22:41

еще одна засада с таким подходом - можно упереться в максимальный размер DO,он,конечно,большой,но не бесконечный.

Wolsh 27.11.2017 23:08

а я вертел портянку. 5 столбиков по 200 картинок, 8 строк под маской, крутил 1 раз. Крутил ТвинЛайтом с небольшой задержкой между стартами для каждой колонки, и ТвинЛайтом же управлял БлюрФильтром. Не знаю, как с точки зрения вашего перфекционизма, а как по мне вполне убедительно крутилось.
Мне кажется, как раз портянка — лучшее решение для быстродействия: в процессе движения никаких созданий и перетасовываний не происходит, скачкам и задержкам просто неоткуда взяться.


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

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