шота меня мучают сомнения, что это поможет. да и мувиклипы тормозны. вон в соседней теме делал демпку. 2000 клипов жутко тормозят, а 2000 спрайтов дают 10 фпс.
ИПавлов
> 2000 клипов жутко тормозят, а 2000 спрайтов дают 10 фпс.
Рендерить нужно через копипикселз из битмапдаты. Тогда тормозить не будет.
Antilegent
очень смешно.
ИПавлов
> очень смешно.
Смех без причины... Ну ты понял.
ну что тут сказать. видимо вы думаете, что можете меня чему-то научить во флэшэ. ну...
http://www.gamedev.ru/code/forum/?id=156947&page=9
сделайте, чтобы не тормозило.
Всем доброго дня!
Вот решил вчера реализовать перемещение по карте. Пока сделал это так, чтобы он всегда карту прокручивал вправо автоматически. Для этого вызывается функция:
public function Time(_timeTask:TimeTask):void { mapScrollRect.x+=5; scrollRect=mapScrollRect; }
Дело в том, что я всю карту (а она у меня предоставляет класс RenderMap и наследуется от класса Sprite) засовываю в прямоугольник прокрутки (scrollRect). То есть типа не будет обрабатываться то, что вне прямоугольника. И при перемещение по карте изменяю значение прокрутки и обновляю. Саму же функцию я вызываю по событию Event.ENTER_FRAME для одного из главных MovieClip (почти самый верхний). При срабатывании я обновляю менеджер времени:
// Вошли в кадр private function OnEnterFrame(_event:Event):void { if ( mapManager != null && mapManager.GetRenderOnName( mapName) != null) { mapManager.GetRenderOnName( mapName).Update( ); } if( timeManager) timeManager.Update( ); }
А сам менеджер времени устроен так, что у него есть список задач времени и он при вызове функции Update() просматривает все задачи и определяет какая выполнила условия и вызывает её функцию. А сами задачи ориентированы на время, задаются следующие параметры:
public var timeName:String=null; // Имя задачи времени public var timeLast:uint=0; // Последнее время public var timeNeedCount:uint=0; // Нужное количество срабатываний public var timeCurrentCount:uint=0; // Текущее количество срабатываний public var timePeriod:uint=0; // Время срабатывания public var timeFunction:Function=null; // Функция срабатывания
Ну и сам менеджер:
Собственно потом я добавляю задачу:
Game.timeManager.Add(new TimeTask( "Move",0,20,Time));
Так то всё работает, но бывает иногда видны подёргивания при перемещении. Как можно это устранить?
s3dworld
а вы то сами как думаете, что нужно сделать, чтобы не подрагивало?
ИПавлов
> а вы то сами как думаете, что нужно сделать, чтобы не подрагивало?
Чёрт его знает. Я уже разные интервалы и разное количество смещения перепробовал.
var newTimeTasks:Vector.<TimeTask>=new Vector.<TimeTask>(); for(var i:uint=0;i<timeTasks.length;i++) { var timeTask:TimeTask=timeTasks[i]; if(timeTask.timeName!=_name) newTimeTasks.push(timeTask); } timeTasks=newTimeTasks;
Facepalm.jpg. Как давно ты занялся программированием?
ИПавлов
> сделайте, чтобы не тормозило.
Я делал. И не только я. Попробуй погуглить по словам "copyPixels флеш тест производительности". Флеш может рендерить десятки тысяч спрайтов (в классическом понимании этого слова).
Впрочем, копипикселз - не единственный вариант создания быстрого рендера. Можно сделать попиксельный рендер. Я как-то раз пробовал - получилось тоже неплохо. Правда, такой движок лучше на ХаКсе писать - там и быстрая память, и инлайны.
Antilegent
> Как давно ты занялся программированием?
Ну да самому смешно. Но я так и не понял как из вектора удалить нужный элемент.
s3dworld
Я дам тебе несколько бесплатных советов.
1. Массивы и векторы - не единственные структуры данных. В данном случае тебе, скорее всего, нужен обычный Object. Он позволяет находить значения по строковому ключу.
2. Удаление со сдвигом - это то-ли splice, то-ли split. Не помню точно.
3. Значение свойства length во время цикла не изменяется. Его нужно занести в локальную переменную.
4. Не нужно так часто создавать объекты. Флешу от этого очень больно.
5. Класс Date в играх не используют. Точнее, используют, но для других целей. Лучше сделать счётчик кадров. Если всё-же важно, чтобы игровое время шло с той же скоростью, что и реальное, можно использовать getTimer.
Antilegent
ну раз так, то в той теме тебе будут очень рады, особенно писатели движков на цпу. о то не надо мне тут чесать
команда .splice() если что.
ну думаю автор сам когда-нибудь дойдёт до оптимизации.
Antilegent
Спасибо! Сейчас буду переделывать.
Хотел бы спросить на счёт MovieClip, Sprite и Bitmap. Слышал что MovieClip очень тормозные. Есть ли смысл грузить Bitmap'ы и вручную их выводить с правильной последовательности для иллюзии анимации? Будет ли это быстрее работать?
А то есть идея в SWF хранить Bitmap'ы, подгружать и вытаскивать их от туда и выводить уже самому.
На счёт uint и int. Значит int быстрее uint. И что, это сильно критично? Большинство Flash функций Number возвращают. Уж не думаю что он был бы быстрее, так как он хранит любой тип числа.
s3dworld
я таже отвечать не хочу. читай моё сообщение вчерашнее. вот нихрена не понятно что ты делал. если это уже вчерашний вопрос и уже решённый.
ИПавлов
Да, я вчера вытаскивал из SWF рисунки. Но делал это для того чтобы найти вхождение мышки. А видимо надо было чисто их и оставить, а SWF потом выгрузить?
Беда вот в чём была. У некого объекта было 801 кадр. И когда я хотел чисто экспериментально создать из них вектор рисунков, у меня рушилась программа с сообщением что не верные BitmapData данные.
Тема в архиве.