Рендеринг тайловой карты AS3 (с тысячами тайлов)

Прежде всего, я скажу, что контекст здесь — это Actionscript 3.0 (IDE: Flashbuilder) вместе с Starling Framework.

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

Я хочу использовать плитки 8x8 пикселей на сцене 800x600 пикселей, и проблема, с которой я столкнулся, заключается в том, что я не знаю, как добавить эти 7500+ плиток на сцену без резкого снижения частоты кадров.

Я обнаружил, что падение производительности связано с добавлением каждой плитки на сцену, а не с инициализацией каждого объекта Tile.

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

Обновление:

После всей вашей помощи я нашел то, что кажется отличным решением. Сначала я хотел реализовать решение Эми, используя copyPixels() и draw(), чтобы создать одно большое растровое изображение для всей карты, а затем отобразить его на экране. Затем, однако, я хотел знать, есть ли эквивалент Starling для этого, потому что все было бы намного проще, если бы мне не приходилось смешивать Starling с Native Flash.

Еще раз спасибо Эми, я немного больше изучил класс Starling RenderTexture и обнаружил, что, используя его методы «drawBundled()» и «draw()», я могу легко нарисовать все плитки в RenderTexture, а затем поместить RenderTexture. в изображение (класс изображения Старлинга), а затем просто добавьте это изображение на экран.

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

Единственное, что я хочу проверить, это легко ли обновлять графику плитки во время игры. Скажем, если вода распространяется из источника (или чего-то еще), а тайл «Трава» должен стать тайлом «Вода», сможет ли RenderTexture и его изображение изменить свой внешний вид без какого-либо скачка задержки или сбоя производительности. Я проверю это в ближайшее время.

Спасибо за вашу помощь!


person Brucef    schedule 12.08.2012    source источник


Ответы (2)


Не добавляйте так много объектов на сцену. Вместо этого создайте BitmpaData размером с вашу сцену и используйте copyPixels() или draw() для рисования на нем. Вот статья, которая поможет вам начать работу. Затем вы можете взять концепции, которые вы узнали в этом посте, и узнать что-то конкретное, что вам нужно сделать, что не описано (на сайте flashandmath.com есть много хороших руководств по манипулированию пикселями).

person Amy Blankenship    schedule 12.08.2012
comment
Спасибо, такая отправная точка, которая подталкивает меня в правильном направлении, как раз то, что мне было нужно! - person Brucef; 12.08.2012
comment
теперь мне просто нужно выяснить, как использование собственных объектов отображения флэш-памяти работает со Starling Framework... - person Brucef; 12.08.2012
comment
Starling.current.nativeOverlay.addChild(ваш_native_displaylist_object_здесь); поместит обычный объект списка отображения поверх текущего содержимого скворца. - person fideldonson; 13.08.2012
comment
есть ли у скворца собственная версия растрового класса Flash? Есть ли способ объединить текстуры плиток в одну большую текстуру скворца и отобразить ее как изображение? - person Brucef; 14.08.2012
comment
В Starling нужно делать все на 100%? Есть ли способ совместить его с обычным ActionScript? - person Amy Blankenship; 14.08.2012
comment
Мне не нужно делать это на 100% в starling, как сказал Dennis, есть встроенная функциональность flash, которую можно использовать даже с фреймворком starling. Я просто не знаю, насколько хорошо обычный флэш-список отображения работает со списком отображения Starling. Я думаю, что единственный способ узнать это проверить это. - person Brucef; 14.08.2012
comment
Быстрый поиск в Интернете по запросу starling bitmapdata copypixels дал результат forum.starling-framework.org/topic /bitmapdata-copypixels - person Amy Blankenship; 14.08.2012

Вам нужно управлять плитками, которые необходимо добавлять и удалять по мере перемещения по игре. Добавляйте в рабочую область только те плитки, которые находятся в 800 пикселях от центра экрана. Как только плитка выйдет за пределы 800 пикселей от центра, удалите ее. Это должно поддерживать все плавно. Удачи.

или посмотрите на рисование / копирование ваших плиток в одно растровое изображение. Вы будете в основном штамповать свои плитки на новом растровом изображении. Вот пример из Adobe:

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;

var bmd1:BitmapData = new BitmapData(40, 40, false, 0x000000FF);
var bmd2:BitmapData = new BitmapData(80, 40, false, 0x0000CC44);

var rect:Rectangle = new Rectangle(0, 0, 20, 20);
var pt:Point = new Point(10, 10);
bmd2.copyPixels(bmd1, rect, pt);

var bm1:Bitmap = new Bitmap(bmd1);
this.addChild(bm1);
var bm2:Bitmap = new Bitmap(bmd2);
this.addChild(bm2);
bm2.x = 50;

Дополнительная информация о растровых данных класс. Я думаю, что copyPixels — это то, что вам нужно.

person Boyd    schedule 12.08.2012
comment
Это сработало бы в другой ситуации, но здесь проблема не в том, что мне нужно добавлять/удалять плитки по мере движения камеры, а в том, что плитки настолько малы, что я не знаю, как создать число, необходимое для заполнения экран (7500) без значительного снижения производительности. - person Brucef; 12.08.2012
comment
сколько существует различных уникальных плиток? Не могли бы вы взять образцы битовых данных плитки и скопировать их все в одно растровое изображение. Таким образом, вы просто создаете одно изображение, но из нескольких источников тайлов. - person Boyd; 12.08.2012
comment
Уникальных плиток очень мало (менее 16), и похоже, что это может сработать, но я не совсем понимаю, как реализовать что-то подобное. - person Brucef; 12.08.2012
comment
Я добавил код для использования класса растрового изображения. Я бы порекомендовал объединить все ваши 16 плиток в одно плоское изображение, это будет называться вашим листом спрайтов, и вы просто вытащите изображение из этого листа спрайтов и скопируете необходимый раздел плитки на изображение игры. - person Boyd; 12.08.2012
comment
спасибо за ваше редактирование, ваши посты и посты Эми очень полезны! - person Brucef; 12.08.2012