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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.01.2015, 22:04
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 1  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
По умолчанию смысл растеризации изображений без анимации

Я читал, что если картинка имеет один кадр (иначе говоря, изображение не имеет анимации), то для производительности лучше, чтобы это был Sprite, а не MovieClip. Мувики же я перевожу в растр и кэширую в самом начале, опять же, в целях экономии потребляемой памяти. А вопрос такой: имеет ли смысл растеризовать статичные изображения без анимации? И если по каким-то причинам не получается растеризовать спрайт, что лучше: оставить спрайт в кривых или сделать его мувиклипом и растеризовать?

Старый 30.01.2015, 22:56
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 2  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Векторная графика кешируется автоматом, если стоит cacheAsBitmap, но проблема в том, что так или иначе эта опция работает не очень точно. Например, при перемещении может обновление кеша происходить не будет, но при вращении или скейле это будет сильно грузить процессор.
Однако до меня доходили слухи о том, что cacheAsBitmap работает и вовсе странно - всё равно обновляет кеш раз в какой-то промежуток времени. Зачем - неясно.

Поэтому кешировать лучше вручную, чтобы наверняка и гладко.
__________________
There is no thing in this world that is not simple.

Старый 30.01.2015, 23:32
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Мувики же я перевожу в растр и кэширую в самом начале, опять же, в целях экономии потребляемой памяти
Вы все перепутали. Растр занимает память, а вектор требует производительность (пересчет в растр для показа). Естественно, это не для крайних вариантов — растр может быть 2х2 пикселя и занимать памяти меньше, чем сложный вектор, отмасштабированный до такого же размера)))
Цитата:
И если по каким-то причинам не получается растеризовать спрайт
Программирование это не шаманизм. Sprite implements IBitmapDrawable и не может быть нерастеризуемым. МувиКлип, вообще-то, наследует Спрайт, является его дитём, и Ваша логика должна идти этим путем, а не наоборот. Правильно говорить: "Всегда используется минимальный контейнер — Спрайт. И только если мне нужна анимация, нарисованная руками в графическом редакторе Flash, то нет другого пути, кроме как использовать МувиКлип".
__________________
Reality.getBounds(this);

Старый 31.01.2015, 21:54
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 4  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от Wolsh Посмотреть сообщение
Вы все перепутали. Растр занимает память, а вектор требует производительность
Я это и имел ввиду, просто неправильно сформулировал, извините. В общем, грубо говоря, растр занимает больше места на винте, но менее требователен к ресурсам компа, а вектор - наоборот, так ведь?

А вопрос я немного уточню. Для растеризации МувиКлипов я использую соответствующий класс Антона Карлова, но почему-то при помощи него у меня получается кэшировать только МувиКлипы (видимо потому что класс заточен специально под растеризацию анимации). Поэтому я и думал, что лучше: делать спрайты МувиКлипами в Adobe Flash, чтобы их кэшировать при помощи этого класса (пусть даже там и всего один кадр), или оставлять спрайты спрайтами и создавать экземпляры прямо так вот: var _instance:Sprite_s=new Sprite_s ('Srpite_s'-имя, которое я в IDE присваиваю изображению в графе "export for AS"), и пускай они у меня остаются векторными. Пока что все изображения, имеющие несколько кадров, я без вариантов делаю МувиКлипами и кэширую, а те, где кадр только один - некоторые сделал мувиками и кэшировал по привычке, а некоторые оставил спрайтами и не кэширую.
Прошу не судить строго за недостаток знаний для толкового формулирования вопроса

Старый 31.01.2015, 23:23
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 5  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
https://github.com/AntKarlov/Anthill...mation.as#L128

Старый 02.02.2015, 13:43
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 6  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от nubideus Посмотреть сообщение
Спасибо за ссылку, но чтобы мне применить Anthill в своём проекте, придётся перелопатить весть код (например, "В Anthill реализована своя система отображения объектов отличающаяся от того как это сделано во Flash. То есть все визуальные объекты в Anthill не имеют никакого отношения к DisplayObject и тем более к Sprite или MovieClip."). Смысла в использовании этого фреймворка целиком нет, так как уже почти всё готово. В Anthill очень много взаимосвязанных классов, в отличие от его ранней версии, откуда я, вместо десятков классов взял три отдельных, под конкретные нужны: растеризация изображений. И в этих ранних версиях классов, видимо, предусмотрена растеризация только мувиклипов, но не спрайтов. Поэтому я и спрашивал, есть ли смысл для производительности делать спрайт мувиклипом только для того, чтобы его растеризовать.

Старый 02.02.2015, 14:31
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 7  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
Цитата:
делать спрайт мувиклипом
зачем тебе конвертировать спрайт в мувиклип, если ты можешь напрямую растеризовывать спрайт?

Цитата:
В Anthill реализована своя система отображения объектов отличающаяся от того как это сделано во Flash. То есть все визуальные объекты в Anthill не имеют никакого отношения к DisplayObject
бред

Цитата:
для производительности
смысл ровно такой же, как и при растеризации анимированного мувиклипа.
абсолютно никакой разницы, будет у тебя один мувиклип с 10 кадрами, или 10 спрайтов.

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

Старый 02.02.2015, 18:07
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 8  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от nubideus Посмотреть сообщение
зачем тебе конвертировать спрайт в мувиклип, если ты можешь напрямую растеризовывать спрайт?
Классы, которыми я растеризую мувиклипы, почему-то не растеризуют спрайты
Цитата:
Сообщение от nubideus Посмотреть сообщение
выложи свои классы-растеризароты и тебе их модифицируют что бы оно спрайты тоже понимало.
Прилагаются

Цитата:
Сообщение от nubideus Посмотреть сообщение
бред
Так этот бред - цитата из описания фреймворка, ссылку на который вы дали
Вложения
Тип файла: zip animation.zip (6.8 Кб, 20 просмотров)


Последний раз редактировалось a7s1h1; 02.02.2015 в 19:15.
Старый 02.02.2015, 20:38
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 9  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
a7s1h1, поздравляю, ты использовал сырой растеризатор.

Код AS3:
r = getFrameSize(object);
Код AS3:
var bmpd:BitmapData = new BitmapData(Math.ceil(r.width), Math.ceil(r.height), true, 0x000000);
Код AS3:
		/**
		 * Рассчитывает максимальный кадра на основе всех кадров клипа.
		 * 
		 * @param	mc	 Клип для которого необходимо получить максимальный размер кадра.
		 * @return		Возвращает максимальный размер кадра для указанного клипа.
		 */
		protected function getFrameSize(mc:MovieClip):Rectangle
		{
			var min:Point = new Point();
			var max:Point = new Point();
			var bounds:Rectangle;
 
			var n:int = mc.totalFrames;
			for (var i:int = 1; i <= n; i++)
			{
				mc.gotoAndStop(i);
				allChildGotoFrame(mc, i);
				bounds = mc.getBounds(mc);
				min.x = Math.min(bounds.topLeft.x, min.x);
				min.y = Math.min(bounds.topLeft.y, min.y);
				max.x = Math.max(bounds.bottomRight.x, max.x);
				max.y = Math.max(bounds.bottomRight.y, max.y);
			}
 
			mc.gotoAndStop(1);
			return new Rectangle(min.x, min.y, max.x - min.x, max.y - min.y);
		}
это значит что если в клипе все кадры маленькие, но один большой - в результате все кадры будут большими

забыдлопастил, попробуй http://pastebin.com/2AJz5dF8

еще раз:
Цитата:
В Anthill реализована своя система отображения объектов отличающаяся от того как это сделано во Flash. То есть все визуальные объекты в Anthill не имеют никакого отношения к DisplayObject
бред, не имеет значения где и кем это написано. вывести графику, не трогая при этом DisplayObject невозможно. есть stage3d, но anthill его не юзает.
>public class AntActor extends Sprite

Старый 03.02.2015, 10:34
a7s1h1 вне форума Посмотреть профиль Отправить личное сообщение для a7s1h1 Найти все сообщения от a7s1h1
  № 10  
Ответить с цитированием
a7s1h1

Регистрация: Oct 2013
Сообщений: 126
Цитата:
Сообщение от nubideus Посмотреть сообщение
забыдлопастил, попробуй http://pastebin.com/2AJz5dF8
Спасибо большое, попробую и отпишусь

Добавлено через 3 часа 12 минут
Всё работает, спасибо! правда пришлось в паре мест пришлось заставить метод воспринимать передаваемый аргумент как мувик
Код AS1/AS2:
/**
 * Кэширование из экземпляра клипа.
* 
* @param	clip	 Клип который необходимо растеризировать.
*/
public function cacheFromClip(cl:DisplayObject):void{
...
 
var clip:MovieClip=cl as MovieClip;
...
}
Теперь, когда я могу растеризовать всё на свете, я всё-равно, по-прежнему, не понимаю 2х вещей:
- Имеет ли смысл растеризовать неподвижный спрайт? (рисую всё в flsh cs, однокадровые изображения - спрайты, где кадров несколько - мувиклипы)
- Я думал, что растеризация изображений из библиотеки поможет мне уменьшить потребляемую память, а, судя по показаниям System.totalMemory, выходит наоборот: каждый раз, когда я добавляю в список для растеризации какой-нибудь клип (не новый, а просто ранее нерастеризованный), то System.totalMemory увеличивается на некоторую величину, в зависимости от размера изображения и количества кадров (имеется ввиду просто значение, а не динамика, т.е. речь не об утечке). При этом ни падения fps, ни подтормаживания не наблюдается. Что я делаю или понимаю не так? (Для отладки (fps, mem, etc.) использую класс Stats)


Последний раз редактировалось a7s1h1; 03.02.2015 в 13:52.
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:16.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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