Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.07.2011, 13:26
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 11  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
zuxul это не самый быстрый способ. О чем я уже написал выше. Если слепить такую картинку из нескольких, то будет намного быстрее смещать ее по оси х, чем копировать пиксели
Цитата:
Причем, у copyPixels есть параметр merge, который позволяет рисовать полупрозрачные пиксели.
Не рисовать полупрозрачные пиксели, а сливать альфаканалы двух изображений

Старый 05.07.2011, 14:46
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 12  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
А давайте проверим?
Вот, есть битмапдата, размером 500 x 2000, Вы реализуете метод движения разрезнанных битмапов, а я реализую с помощью copyPixels.
Потом сольем их в "воркбенч", или как это называется, и замерим...

Старый 05.07.2011, 15:42
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 13  
Ответить с цитированием
goodguy
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.
Старый 05.07.2011, 17:06
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 14  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
У меня другие выводы.
Вот примерчик, так как загрузить комп не удавалось, чтобы упала фпс, добавлял дополнительные элементы в дисплей лист.
Двигать большую битмапу получается немного накладнее, чем копировать пиксели.
Во вложенни проект flashDelvelop-a.
Вложения
Тип файла: zip test_flash.zip (225.6 Кб, 46 просмотров)

Старый 05.07.2011, 17:19
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 15  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
В чем смысл этого теста? И где там результаты?
Ни сколько не убедительно.
Сейчас выложу свой тест, если найду

Старый 05.07.2011, 17:20
Nucer вне форума Посмотреть профиль Отправить личное сообщение для Nucer Посетить домашнюю страницу Nucer Найти все сообщения от Nucer
  № 16  
Ответить с цитированием
Nucer
[++]
 
Аватар для Nucer

Регистрация: Jan 2003
Адрес: Москва
Сообщений: 839
Отправить сообщение для Nucer с помощью ICQ
Навскидку могу сказать, что если делать как следует^
1. Нужно заранее подготавливать здоровый битмап (но не 20к пикселей конечно, примерно в 2 экрана).
2. Определяешь оптимальный размер фона. Рисуешь на нем свои горы в нужном количестве. Как правильно сказали, лучше юзать copyPixels , а не draw , если есть такая возможность.
3. Добавляешь получившийся битмап в список отображения и двигаешь его с нужной скоростью машинки.
4. Заранее подготавливаешь новый битмап, чтобы потом его добавить перед тем, как предыдущий "кончится". Учитывая, что во флэше многопоточности нету, то придётся извратиться и сделать что то вроде рисования гор поштучно по таймеру или на enter_frame (так вроде быстрее)). Если рисовать сразу кучу объектов - будут подвисоны)
5. Не забывай удалять битмапы, которые уже проехали безвозвратно и делать dispose()... )

В общих чертах как то так...)

Старый 05.07.2011, 17:34
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 17  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
1) Если сделать dispose() то повторно эти картинки уже не добавятся. О цикличности анимации можно будет забыть. Или каждый раз создавать новые экземпляры изображений.
2) dispose() не занулит картинку. Она так и останется висеть в памяти, пока не занулишь еще и ссылку на нее. Ну, в общем, суть не в этом.

Вот мой тест:
http://*********/31382066

В файле main меняем значение переменной useBuffer. Если оно true, то используется copyPixels(), если false, то простое смещение картинки.
В аутпут выводится потраченное время.
Код простейший, думаю, будет всем понятно и без комментариев

Старый 05.07.2011, 17:41
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 18  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
@goodguy
Код AS3:
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;
		}
	}
И чего тут тестируется? скорость создания новой Bitmap'ы?
__________________
...вселенская грусть

Старый 05.07.2011, 17:48
goodguy вне форума Посмотреть профиль Найти все сообщения от goodguy
  № 19  
Ответить с цитированием
goodguy
Banned
[+1 05.11.11]
[+1 09.08.11]

Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
Так вот суть то в том, что если bitmapData изображения перед копированием пикселей не уничтожить, то одна будет накладываться на другую. Все нормально, если фон не прозрачный. С прозрачным этот трюк не пройдет.
+, даже если отсюда убрать создание новой BitmapData, и оставить только copyPixels() все равно это будет работать медленее

Старый 05.07.2011, 17:48
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 20  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Код AS3:
var startTime:Number = getTimer();
image.x -= speed;
return getTimer() - startTime;
- вот это жесть, Вы не там меряете, здесь Вы просто изменили коориднату, а отрисовывать плеер потом будет...


Последний раз редактировалось zuxul; 05.07.2011 в 17:51.
Создать новую тему Ответ Часовой пояс GMT +4, время: 13:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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