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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.11.2010, 23:12
amarenkov вне форума Посмотреть профиль Отправить личное сообщение для amarenkov Найти все сообщения от amarenkov
  № 11  
Ответить с цитированием
amarenkov

Регистрация: Oct 2008
Адрес: Воронеж
Сообщений: 12
Цитата:
Сообщение от alatar Посмотреть сообщение
Кстати, зачем такие сложности? Почему просто не добавлять Bitmap?
Можно сказать, что это наследие прошлого . Иными словами, я начал делать каждый объект отдельным MovieClip (у каждого объекта много анимаций). И одежда внутри, тоже была отдельными клипами. Работало стабильно и без глюков. И было просто в реализации. Однако, когда одежды стало больше - стали появляться такие проблемы. Часть из них ушла, когда я все объекты привел к Shape и всю графику стал рисовать в один Shape.

Рисовать в один Bitmap мне было неудобно, так как начало координат у него всегда в левом верхнем углу и плюс надо знать размер BitmapData, когда создаешь Bitmap.

Добавлено через 4 минуты
Цитата:
Сообщение от alatar Посмотреть сообщение
Уточните пару моментов. Фоновые элементы у вас какого размера? Как половина большого зеленого квадрата возле девушки?
И как у вы заливаете траву? Тоже состоит из элементов или это просто битмапа в качестве фона?
Фоновый элемент - трава - это прямоугольное изображение, которым я делаю FillBitmap у Shape.graphics. И заливаю полигон в виде ромба.

Нет, прямоугольники больше девушки, они вообще достаточно большие, где-то раза в два больше людей.

P.S. Нет, масок у меня нет вообще. И порядок "не тем" быть не может абсолютно точно.

Добавлено через 11 минут
Цитата:
Сообщение от chabapok Посмотреть сообщение
значит координаты могут считаться не правильно. Порядок тот, но выводит "не туда".
например.
как правило, все же, если ошибка -- то она закралась в своем коде, а не во флешь плеере %)


Ограничение имеет место. то ли 4к, то ли 8к - точно не помню. помню, что подобная фича встречалась.
Если бы ! Я свой код вылизал полностью - там нет ничего, влияющего на проблему. Больше всего ситуация похожа на то, что при большом количестве растровых изображений с прозрачностью в одной точке у плеера начинаются проблемы в определении пикселей под прозрачностью: например при выводе одного прозрачного пикселя он берет другой, который под ним. Но тот тоже оказывается прозрачным. После нескольких таких итераций плеер впадает в ступор и выбирает первый попавшийся не прозрачный .

Координаты в конкретном случае очень незначительные, ни порог в 4к, ни тем более в 8к, не переходят. Сейчас все элементы находятся в пределах экранных координат от -1500 до +1500.

Координаты тоже мною не считаются (ради этого я и использовал Sprite и Shape - чтобы не высчитывать где они должны быть относительно всего остального).

Старый 26.11.2010, 00:27
chabapok вне форума Посмотреть профиль Отправить личное сообщение для chabapok Найти все сообщения от chabapok
  № 12  
Ответить с цитированием
chabapok

Регистрация: Jul 2009
Сообщений: 240
Записей в блоге: 1
хорошо.
тогда такой вопрос
вы ссылки на каждый спрайт храните в каком-нибудь массиве или векторе?
Потому, что если нет, если к ним доступ только через всякие getChildAt, то при большом кол-ве спрайтов может срабатывать сборщик мусора (?)

И вообще. Сделайте вашу траву полупрозрачной и посмотрите есть под ней асфальт или нету. Если асфальта там нет, то код явно недолизан и выводится он "не туда".

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

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
если к ним доступ только через всякие getChildAt, то при большом кол-ве спрайтов может срабатывать сборщик мусора (?)
Нет, не может. "всякие getChildAt" - это ссылка на объект => объект доступен => удалять его GC не будет
__________________
...вселенская грусть

Старый 26.11.2010, 00:34
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 14  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Было бы офигенно круто, если бы был минимальный код, где фигня проявляется. Просто тупо накидывающий на сцену с нужными координатами минимум нужных мувиков/шейпов, чтоб баг вылез.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 26.11.2010, 00:46
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 15  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Цитата:
плюс надо знать размер BitmapData,
Не надо. Тоже ловился на этот баг)
даже генерил xml с размерами)
просто пишите 0,0.
Код AS3:
bmpd:BitmapData = new BitmapDataFromLibrary(0,0);
__________________
Отряд Котовскага

Старый 26.11.2010, 01:01
amarenkov вне форума Посмотреть профиль Отправить личное сообщение для amarenkov Найти все сообщения от amarenkov
  № 16  
Ответить с цитированием
amarenkov

Регистрация: Oct 2008
Адрес: Воронеж
Сообщений: 12
Цитата:
Сообщение от chabapok Посмотреть сообщение
хорошо.
тогда такой вопрос
вы ссылки на каждый спрайт храните в каком-нибудь массиве или векторе?
Потому, что если нет, если к ним доступ только через всякие getChildAt, то при большом кол-ве спрайтов может срабатывать сборщик мусора (?)

И вообще. Сделайте вашу траву полупрозрачной и посмотрите есть под ней асфальт или нету. Если асфальта там нет, то код явно недолизан и выводится он "не туда".
Храню в массиве. Нет, сборщиком не убирается точно.

Убирал траву - смотрел. Тогда проступает то, что под травой. Асфальта нет, но тут я кодом повлиять не могу.

Добавлено через 49 секунд
Цитата:
Сообщение от -De- Посмотреть сообщение
Было бы офигенно круто, если бы был минимальный код, где фигня проявляется. Просто тупо накидывающий на сцену с нужными координатами минимум нужных мувиков/шейпов, чтоб баг вылез.
Да, вот это хорошая идея. Сделаю завтра.

Добавлено через 3 минуты
Цитата:
Сообщение от Котяра Посмотреть сообщение
Не надо. Тоже ловился на этот баг)
даже генерил xml с размерами)
просто пишите 0,0.
Код AS3:
bmpd:BitmapData = new BitmapDataFromLibrary(0,0);
Нет, я не про это. Суть в другом - у меня есть тело человека, есть разные части одежды на человеке. Я это все отрисовываю на BitmapData. Но с разным смещением и у них разные размеры. Соответственно, я должен их перебрать и определить результирующий размер BitmapData, а потом в него уже отрисовать.

Из библиотеки-то я легко забираю BitmapData .

Добавлено через 10 часов 32 минуты
Как было предложено -De-, сделал тестовую флэшку. Баг повторяется легко.

[IMG]http://dl.************/u/3277184/Test.jpg[/IMG]

И код небольшой:
Код AS3:
package
{
	import flash.display.MovieClip;
 
	public class Test extends MovieClip
	{
		// public
		public function Test()
		{
			super();
 
			addChild(new Police(100, 200));
			addChild(new Police(200, 200));
			addChild(new Police(200, 100));
			addChild(new Police(100, 100));
			addChild(new Police(250, 200));
		}
	}
}
 
import flash.geom.Rectangle;
import flash.geom.Matrix;
import flash.display.BitmapData;
import flash.display.Shape;
 
class Police extends Shape
{
	// private
	private function drawBitmapData(bitmapData : BitmapData, rect : Rectangle)
	{
		var matrix : Matrix = new Matrix();
		matrix.translate(rect.x, rect.y);
 
		graphics.beginBitmapFill(bitmapData, matrix, false, true);
		graphics.drawRect(rect.x, rect.y, rect.width, rect.height);
		graphics.endFill();
	}
 
	// public
	public function Police(x : Number, y : Number)
	{
		this.x = x;
		this.y = y;
 
		var man : Man = new Man(0, 0);
		var rect : Rectangle = new Rectangle(0, 0, man.width, man.height);
 
		drawBitmapData(man, rect);
		drawBitmapData(new Jacket(0, 0), rect);
		drawBitmapData(new Pants(0, 0), rect);
		drawBitmapData(new Boots(0, 0), rect);
		drawBitmapData(new Cap(0, 0), rect);
	}
}
Желающие могут попробовать у себя: Test.rar. Очень любопытно, что именно такое количество элементов приводит к такому багу. Меньше одежды или людей - баг отсутствует.

Вообще, похоже, что это проблема моего извращенного способа собирания графики, а именно метода beginBitmapFill (ну, нету у graphics метода для рисования BitmapData, а оочень хотелось ). Может в Adobe сообщить ?


Последний раз редактировалось amarenkov; 26.11.2010 в 11:34.
Старый 26.11.2010, 12:28
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 17  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Это баг плеера. О нем Adobe знает и считает что это не совсем баг а так, немного недостаточная функциональность. Проявляется, когда в одной точке пересекаются 24 и более битмапа. В тесте их 25, поэтому артефакт и проявляется. Если поставить посвободнее человечков, все будет работать.
Ссылка на баг: баг FP-2566

Что можно:
  1. Можно попробовать все отрисовывать в один BitmapData, а не в graphics shape'а. Или просто поставить в Police cacheAsBitmap = true. Полностью от бага это не избавит, но частоту появления снизит. Это я проверял.
  2. Можно попробовать вообще все в один bitmap отрисовывать, если механика игры позволяет. Вероятно, поможет, но я не проверял.
  3. Можно размер битмапок уменьшить до минимально необходимого и рисовать их с необходимым сдвигом.
Я бы сделал пункты 1 и 3 одновременно. Если толпы человечек не могут стоять "в одной клетке", этого будет достаточно.

Старый 26.11.2010, 12:47
amarenkov вне форума Посмотреть профиль Отправить личное сообщение для amarenkov Найти все сообщения от amarenkov
  № 18  
Ответить с цитированием
amarenkov

Регистрация: Oct 2008
Адрес: Воронеж
Сообщений: 12
Цитата:
Сообщение от maxkar Посмотреть сообщение
Это баг плеера. О нем Adobe знает и считает что это не совсем баг а так, немного недостаточная функциональность. Проявляется, когда в одной точке пересекаются 24 и более битмапа. В тесте их 25, поэтому артефакт и проявляется. Если поставить посвободнее человечков, все будет работать.
Ссылка на баг: баг FP-2566

Что можно:
  1. Можно попробовать все отрисовывать в один BitmapData, а не в graphics shape'а. Или просто поставить в Police cacheAsBitmap = true. Полностью от бага это не избавит, но частоту появления снизит. Это я проверял.
  2. Можно попробовать вообще все в один bitmap отрисовывать, если механика игры позволяет. Вероятно, поможет, но я не проверял.
  3. Можно размер битмапок уменьшить до минимально необходимого и рисовать их с необходимым сдвигом.
Я бы сделал пункты 1 и 3 одновременно. Если толпы человечек не могут стоять "в одной клетке", этого будет достаточно.
Спасибо большое, за такой подробный ответ, maxkar! Я уж было отправил Adobe отчет об ошибке...

1. Поскольку там анимация и содержимое Shape постоянно меняется, cacheAsBitmap будет только замедлять отрисовку. С другой стороны, как временное решение очень даже подойдет.
2. Я планирую так и сделать. Но появляется вопрос: насколько это эффективно? А если флешка будет на весь экран распахнута? Не убется ли отрисовка такого большого BitmapData?
3. Так не получится - есть ряд технических трудностей.

Думаю в итоге переделать все на один Bitmap.

Старый 26.11.2010, 13:48
Хемуль вне форума Посмотреть профиль Отправить личное сообщение для Хемуль Найти все сообщения от Хемуль
  № 19  
Ответить с цитированием
Хемуль
Квач
 
Аватар для Хемуль

Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
Интересно. Спасибо maxkar за информацию. Возможно это поможет и мне справиться с одним старым багом в одном из проектов.
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого

Старый 26.11.2010, 13:49
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 20  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Эффективность будет зависеть от того, сколько именно и что именно перерисовывать. Само по себе копирование большой картинки (выровненой строго по целочисленной координатной сетке) на современных машинах операция быстрая. Основное ограничение - подготовка картинки для отрисовки. Если на каждый кадр перерисовывать всю сцену, будет медленно. По хорошему, нужно вычислять области, которые требуется перерисовать и уже на них рисовать весь стэк объектов (не затрагивая области, которые точно не изменились). Фактически, это работа по вычислению repaint region, которую для обычно выполняет flash player.

А так - нужно смотреть конкретную реализацию. Я экспериментировал со скоростью через штатный "векторный" рендерер и свою отрисовку в битмапку через BitmapData.copyPixels. Пример был совершенно синтетический - какие-то квадратики меняющиеся. Если менялись картинки в противоположных углах экрана, отрисовка в битмапку была в несколько раз медленнее (точные цифры не помню), чем штатным рисовальщиком. Но в этом случае я перерисовывал всю картинку, у меня был очень тупой определяльщик repaint region. На локальных изменениях (изменения сосредоточены в одной небольшой области) своя отрисовка вроде бы была даже чуть быстрее, чем отрисовка плеером. Так что экспериментируйте. И не забывайте про BitmapData.lock() при отрисовке, он может улучшить производительность.

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

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

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


 


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


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