![]() |
|
||||||||||
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
zuxul это не самый быстрый способ. О чем я уже написал выше. Если слепить такую картинку из нескольких, то будет намного быстрее смещать ее по оси х, чем копировать пиксели
Цитата:
|
|
|||||
|
А давайте проверим?
Вот, есть битмапдата, размером 500 x 2000, Вы реализуете метод движения разрезнанных битмапов, а я реализую с помощью copyPixels. Потом сольем их в "воркбенч", или как это называется, и замерим... |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Я уже замерял. Поэтому с уверенностью говорю, что смещение - намного быстрее. Я бы даже сказал, во много раз.
Передо мной тоже стояла подобная задача когда-то. Напиал тестовую прогу, в которую вставлялось одно и то же изображение (4000х4000). В первом случае оно смещалось на 1 пиксел по энтер фрейму, во втором была битмапка размером с видимую часть сцены, в которую копировались пиксели из большой картинки. По энтер фрейму лишь смещалось положение прямоугольника, из которого копировались пиксели. И там и там перед началом "маневра" происходил замер текущего времени getTimer() и по завершению от нового времени отнималось предыдущее. Так вот, разница в скорости составляла приерно 8 раз. Причемм в пользу простого смещения. copyPixels() хороший метод, но для других случаев. Последний раз редактировалось goodguy; 05.07.2011 в 15:48. |
|
|||||
|
У меня другие выводы.
Вот примерчик, так как загрузить комп не удавалось, чтобы упала фпс, добавлял дополнительные элементы в дисплей лист. Двигать большую битмапу получается немного накладнее, чем копировать пиксели. Во вложенни проект flashDelvelop-a. |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
В чем смысл этого теста? И где там результаты?
Ни сколько не убедительно. Сейчас выложу свой тест, если найду |
|
|||||
|
[++]
|
Навскидку могу сказать, что если делать как следует^
1. Нужно заранее подготавливать здоровый битмап (но не 20к пикселей конечно, примерно в 2 экрана). 2. Определяешь оптимальный размер фона. Рисуешь на нем свои горы в нужном количестве. Как правильно сказали, лучше юзать copyPixels , а не draw , если есть такая возможность. 3. Добавляешь получившийся битмап в список отображения и двигаешь его с нужной скоростью машинки. 4. Заранее подготавливаешь новый битмап, чтобы потом его добавить перед тем, как предыдущий "кончится". Учитывая, что во флэше многопоточности нету, то придётся извратиться и сделать что то вроде рисования гор поштучно по таймеру или на enter_frame (так вроде быстрее)). Если рисовать сразу кучу объектов - будут подвисоны) 5. Не забывай удалять битмапы, которые уже проехали безвозвратно и делать dispose()... ) В общих чертах как то так...) |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
1) Если сделать dispose() то повторно эти картинки уже не добавятся. О цикличности анимации можно будет забыть. Или каждый раз создавать новые экземпляры изображений.
2) dispose() не занулит картинку. Она так и останется висеть в памяти, пока не занулишь еще и ссылку на нее. Ну, в общем, суть не в этом. Вот мой тест: http://*********/31382066 В файле main меняем значение переменной useBuffer. Если оно true, то используется copyPixels(), если false, то простое смещение картинки. В аутпут выводится потраченное время. Код простейший, думаю, будет всем понятно и без комментариев |
|
|||||
|
@goodguy
public class Buffer extends Sprite { [Embed(source = "images/image.jpg")] private var Pic:Class; private var image:Bitmap = new Pic as Bitmap; private var canvas:Bitmap; private var copyX:Number = 0; public function Buffer() { if (stage) initialize(); else this.addEventListener(Event.ADDED_TO_STAGE, initialize); } private function initialize(e:Event = null):void { this.removeEventListener(Event.ADDED_TO_STAGE, initialize); canvas = new Bitmap(new BitmapData(800, 600, false, 0x808040)); stage.addChild(canvas); } public function getRenderTime(speed:Number):Number { copyX += speed; var startTime:Number = getTimer(); canvas.bitmapData.dispose(); canvas.bitmapData = new BitmapData(800, 600, false, 0x808040); canvas.bitmapData.copyPixels(image.bitmapData, new Rectangle(copyX, 0, 800, 600), new Point(0, 0)); return getTimer() - startTime; } }
__________________
...вселенская грусть |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Так вот суть то в том, что если bitmapData изображения перед копированием пикселей не уничтожить, то одна будет накладываться на другую. Все нормально, если фон не прозрачный. С прозрачным этот трюк не пройдет.
+, даже если отсюда убрать создание новой BitmapData, и оставить только copyPixels() все равно это будет работать медленее |
|
|||||
- вот это жесть, Вы не там меряете, здесь Вы просто изменили коориднату, а отрисовывать плеер потом будет...Последний раз редактировалось zuxul; 05.07.2011 в 17:51. |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:40. |
|
|
« Предыдущая тема | Следующая тема » |
|
|