![]() |
|
||||||||||
|
|||||
|
Регистрация: Oct 2008
Адрес: Воронеж
Сообщений: 12
|
Можно сказать, что это наследие прошлого
. Иными словами, я начал делать каждый объект отдельным MovieClip (у каждого объекта много анимаций). И одежда внутри, тоже была отдельными клипами. Работало стабильно и без глюков. И было просто в реализации. Однако, когда одежды стало больше - стали появляться такие проблемы. Часть из них ушла, когда я все объекты привел к Shape и всю графику стал рисовать в один Shape. Рисовать в один Bitmap мне было неудобно, так как начало координат у него всегда в левом верхнем углу и плюс надо знать размер BitmapData, когда создаешь Bitmap. Добавлено через 4 минуты Цитата:
Нет, прямоугольники больше девушки, они вообще достаточно большие, где-то раза в два больше людей. P.S. Нет, масок у меня нет вообще. И порядок "не тем" быть не может абсолютно точно. Добавлено через 11 минут Цитата:
! Я свой код вылизал полностью - там нет ничего, влияющего на проблему. Больше всего ситуация похожа на то, что при большом количестве растровых изображений с прозрачностью в одной точке у плеера начинаются проблемы в определении пикселей под прозрачностью: например при выводе одного прозрачного пикселя он берет другой, который под ним. Но тот тоже оказывается прозрачным. После нескольких таких итераций плеер впадает в ступор и выбирает первый попавшийся не прозрачный .Координаты в конкретном случае очень незначительные, ни порог в 4к, ни тем более в 8к, не переходят. Сейчас все элементы находятся в пределах экранных координат от -1500 до +1500. Координаты тоже мною не считаются (ради этого я и использовал Sprite и Shape - чтобы не высчитывать где они должны быть относительно всего остального). |
|
|||||
|
хорошо.
тогда такой вопрос вы ссылки на каждый спрайт храните в каком-нибудь массиве или векторе? Потому, что если нет, если к ним доступ только через всякие getChildAt, то при большом кол-ве спрайтов может срабатывать сборщик мусора (?) И вообще. Сделайте вашу траву полупрозрачной и посмотрите есть под ней асфальт или нету. Если асфальта там нет, то код явно недолизан и выводится он "не туда". |
|
|||||
|
Цитата:
__________________
...вселенская грусть |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Было бы офигенно круто, если бы был минимальный код, где фигня проявляется. Просто тупо накидывающий на сцену с нужными координатами минимум нужных мувиков/шейпов, чтоб баг вылез.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Цитата:
даже генерил xml с размерами) просто пишите 0,0.
__________________
Отряд Котовскага |
|
|||||
|
Регистрация: Oct 2008
Адрес: Воронеж
Сообщений: 12
|
Цитата:
Убирал траву - смотрел. Тогда проступает то, что под травой. Асфальта нет, но тут я кодом повлиять не могу. Добавлено через 49 секунд Цитата:
Добавлено через 3 минуты Цитата:
Из библиотеки-то я легко забираю BitmapData .Добавлено через 10 часов 32 минуты Как было предложено -De-, сделал тестовую флэшку. Баг повторяется легко. [IMG]http://dl.************/u/3277184/Test.jpg[/IMG] И код небольшой: 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); } } Вообще, похоже, что это проблема моего извращенного способа собирания графики, а именно метода beginBitmapFill (ну, нету у graphics метода для рисования BitmapData, а оочень хотелось ). Может в Adobe сообщить ?Последний раз редактировалось amarenkov; 26.11.2010 в 11:34. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Это баг плеера. О нем Adobe знает и считает что это не совсем баг а так, немного недостаточная функциональность. Проявляется, когда в одной точке пересекаются 24 и более битмапа. В тесте их 25, поэтому артефакт и проявляется. Если поставить посвободнее человечков, все будет работать.
Ссылка на баг: баг FP-2566 Что можно:
|
|
|||||
|
Регистрация: Oct 2008
Адрес: Воронеж
Сообщений: 12
|
Цитата:
1. Поскольку там анимация и содержимое Shape постоянно меняется, cacheAsBitmap будет только замедлять отрисовку. С другой стороны, как временное решение очень даже подойдет. 2. Я планирую так и сделать. Но появляется вопрос: насколько это эффективно? А если флешка будет на весь экран распахнута? Не убется ли отрисовка такого большого BitmapData? 3. Так не получится - есть ряд технических трудностей. Думаю в итоге переделать все на один Bitmap. |
|
|||||
|
Квач
Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
|
Интересно. Спасибо maxkar за информацию. Возможно это поможет и мне справиться с одним старым багом в одном из проектов.
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Эффективность будет зависеть от того, сколько именно и что именно перерисовывать. Само по себе копирование большой картинки (выровненой строго по целочисленной координатной сетке) на современных машинах операция быстрая. Основное ограничение - подготовка картинки для отрисовки. Если на каждый кадр перерисовывать всю сцену, будет медленно. По хорошему, нужно вычислять области, которые требуется перерисовать и уже на них рисовать весь стэк объектов (не затрагивая области, которые точно не изменились). Фактически, это работа по вычислению repaint region, которую для обычно выполняет flash player.
А так - нужно смотреть конкретную реализацию. Я экспериментировал со скоростью через штатный "векторный" рендерер и свою отрисовку в битмапку через BitmapData.copyPixels. Пример был совершенно синтетический - какие-то квадратики меняющиеся. Если менялись картинки в противоположных углах экрана, отрисовка в битмапку была в несколько раз медленнее (точные цифры не помню), чем штатным рисовальщиком. Но в этом случае я перерисовывал всю картинку, у меня был очень тупой определяльщик repaint region. На локальных изменениях (изменения сосредоточены в одной небольшой области) своя отрисовка вроде бы была даже чуть быстрее, чем отрисовка плеером. Так что экспериментируйте. И не забывайте про BitmapData.lock() при отрисовке, он может улучшить производительность. |
![]() |
![]() |
Часовой пояс GMT +4, время: 13:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|