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

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

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

Регистрация: Sep 2010
Сообщений: 167
По умолчанию Большое количество текстовых полей - оптимизация

Добрый вечер! Всех с праздником!

Посоветуйте пожалуйста. Вот у меня во флешке создаётся несколько сотен объектов Sprite, в каждом из которых до двадцати текстовых полей. В данный момент используется TextField, и это очень сильно сжирает производительность. Я поставил каждому такому спрайту кеширование cacheAsBitmap, и в целом, когда я перемещаю общий спрайт с сотнями таких объектов, производительность стабильна, на уровне примерно 55-60 fps. Но при изменении масштаба - во время увеличения, производительность падает до 10 fps. Я понимаю, что тут заново кешируются подложки под спрайты. Но проблема в том, что без кеширования я получаю при перемещении холста 25 fps, а при зуме те же 10.

Я выяснил, что проблема именно с текстовыми полями. Кеширование с ними не даёт никакого результата. Преобразование в Bitmap даёт говёное качество. И ещё заметил, что при изменении масштаба, ширина текстовых полей сильно меняется, и бывает так, что текст выходит за границы нарисованных рамок спрайта при большом отдалении. Вот сижу тут и не знаю уже, что делать, и чем заменить текстовые поля. Поделитесь опытом, плиз.

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

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,921
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
Преобразование в Bitmap даёт говёное качество
А программное преобразование + smoothing=true?
Подробнее, что именно вы делаете?
__________________
There is no thing in this world that is not simple.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Информация в текстовых полях должна меняться? Или остается та же, которая добавлена изначально?
Если не должна, то самый лучший способ - это врисовать их в подложку через bitmapData#draw(), после чего просто удалить.
Но это если подложка представляет из себя растровую картинку

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

Регистрация: Sep 2010
Сообщений: 167
Я делаю просмотрщик схем для визуального языка программирования.

Текст всегда статичен, в том-то и проблема. А текстовые поля весьма тяжёлые. Если через BitmapData.Draw, получается хрень с низким качеством.

Старый 10.05.2015, 10:01
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 5  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
1. включил схему (текст, картинки, вектор, вот это всё), сделал BitmapData#draw() видимой части схемы, выключил схему
2. масштабируешь этот битмап, в процессе — пофиг на качество или пустые поля вокруг
3. после завершения масштабирования — п.1

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

P.S.
И да, если таки сильно не нравятся поля при масштабе/перетаскивании, можно растрировать "с запасом". Размер запаса — дело вкуса, ограниченное расходом памятью.
__________________
Поймай яблоко 2!

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

Регистрация: Sep 2010
Сообщений: 167
Меня ещё пугает скорость этого прорисовывания в Bitmap. Подвисает почище, чем просто при отрисовке векторов и масштабировании.

Старый 11.05.2015, 00:10
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 7  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Для начала попробуй сделать отрисовку только видимой части. Уже должно быть побыстрее.
__________________
Поймай яблоко 2!

Старый 11.05.2015, 00:28
Alex626 вне форума Посмотреть профиль Отправить личное сообщение для Alex626 Найти все сообщения от Alex626
  № 8  
Ответить с цитированием
Alex626

Регистрация: Sep 2010
Сообщений: 167
Я так понимаю, что нужно использовать систему событий для оповещения каждого такого блока в схеме, что он был перемещён.


Попробую конечно, но ИМХО каждое растрирование сотни таких объектов будет лагать сильнее. Я заметил, что текст при масштабировании перестраивается, и именно это и жрёт всю память - происходит здоровенный лаг в момент применения зума. Эх, вот если бы как-то графикой отрисовать тексты, что-то вроде LineTo и так далее.

Добавлено через 3 часа 18 минут
Цитата:
Сообщение от Zebestov Посмотреть сообщение
1. включил схему (текст, картинки, вектор, вот это всё), сделал BitmapData#draw() видимой части схемы, выключил схему
2. масштабируешь этот битмап, в процессе — пофиг на качество или пустые поля вокруг
3. после завершения масштабирования — п.1

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

P.S.
И да, если таки сильно не нравятся поля при масштабе/перетаскивании, можно растрировать "с запасом". Размер запаса — дело вкуса, ограниченное расходом памятью.

Кажется стал понимать. Мне в данном, описанном случае, выгоднее всего делать снимок именно спрайта, в который вложены эти сотни других блоков. Скажите, как определить видимые поля?

Старый 11.05.2015, 11:53
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 9  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Ну, масштабировать саму схему не нужно. При растеризации используй матрицу, которая натянет нужный кусочек в нужном масштабе на битмапу размером с экран.
__________________
Поймай яблоко 2!

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

Регистрация: Sep 2010
Сообщений: 167
Я уже проще сделал, скриншот всей схемы целиком. Знаете, хорошо получается. При прокрутке мышкой (зум назначен на колесо) я убираю child'ы настоящих векторов из главного спрайта и добавляю туда child скриншота (Bitmap). А через секунду после окончания прокрутки снова добавляются элементы векторов и убирается битмап. Так вот 60 fps!

Но вот в чём загвоздка. У меня схема интерактивна. Можно перетаскивать блоки мышкой, при этом обновляются все связи в цепочках данных. И вот после перетаскивания нужно каждый раз обновлять скриншот всей схемы, чтобы во время прокрутки изображение соответствовало оригиналу. Но скриншот всей области делается с подлагиванием. Вот я и думаю, как бы всё это сделать "непрерывным".

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 14:29.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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