Если вы хотите иметь тонны кнопок с текстом и графикой, используя наименьшее количество ОЗУ и вычислительной мощности, вы должны использовать растровые изображения.
Это становится намного более сложным и включает в себя собственную подготовку следующее:
- шрифт в виде спрайта листа.
- Классы, которые управляют визуализацией текста на растровое изображение, используя этот лист спрайтов.
- Растровые изображения не отвечают на MouseEvents, поэтому вам нужно будет создать собственную систему для управления вводом мышей на растровых изображениях.
Во-первых, давайте взглянем на потребление базовой памяти для некоторых объектов DisplayObject, которые, по вашему мнению, нам лучше всего использовать. Это наш метод тестирования:
function ram(type:Class):void
{
trace(getSize(new type()));
}
И это испытание:
ram(Sprite); // 408
ram(Shape); // 236
ram(TextField); // 1316
В вашем случае, рисунок 1000 кнопок приведет к более 1724000 байт памяти используется.
Теперь давайте посмотрим на то, что мы будем использовать:
- 1x Bitmap, действующий как Canvas, который содержит все кнопки: 236 байт.
- 1x BitmapData, представляющий начальное состояние каждой кнопки.
- 1x BitmapData, представляющий состояние опрокидывания каждой кнопки.
- 1x BitmapData сохраняет наш текст как лист спрайта для использования всеми кнопками.
Каждый BitmapData
будет довольно большим в потреблении памяти и сильно варьируется в зависимости от его содержимого. Но трюк заключается в том, что мы используем только один и ссылаемся на его содержимое для каждой кнопки, которую хотим рисовать.
Я создал небольшое количество кода, чтобы вы начали. Вам все равно нужно реализовать менеджер кликов, который перебирает все кнопки и работает, что наиболее важно для запуска щелчка, а также для отображения текста на кнопках.
Вот класс Button:
public class BitmapButton
{
private var _text:String;
private var _position:Point = new Point();
public function BitmapButton(text:String)
{
_text = text;
}
public function render(canvas:BitmapData, font:BitmapData, state:BitmapData):void
{
canvas.copyPixels(state, state.rect, _position);
// Use font argument to render text.
// For you to implement.
}
public function get position():Point{ return _position; }
}
А вот класс, который будет управлять рендеринга этих кнопок:
public class ButtonCanvas extends Bitmap
{
private var _fontSprite:BitmapData;
private var _baseState:BitmapData = new BitmapData(100, 30, false, 0xFF0000);
private var _overState:BitmapData = new BitmapData(100, 30, false, 0x00FF00);
private var _buttons:Vector.<BitmapButton> = new <BitmapButton>[];
private var _checkRect:Rectangle = new Rectangle();
public function ButtonCanvas(width:int, height:int)
{
bitmapData = new BitmapData(width, height, true, 0x00000000);
// Replace with actual loaded sprite sheet.
_fontSprite = new BitmapData(1, 1);
}
public function add(button:BitmapButton):void
{
_buttons.push(button);
}
public function render():void
{
if(stage === null) return;
bitmapData.lock();
for each(var i:BitmapButton in _buttons)
{
_checkRect.x = i.position.x;
_checkRect.y = i.position.y;
_checkRect.width = _baseState.width;
_checkRect.height = _baseState.height;
if(_checkRect.contains(mouseX, mouseY))
{
// Use roll over style.
// Need to implement depth check so you can't roll over buttons
// that fall behind others.
i.render(bitmapData, _fontSprite, _overState);
}
else
{
i.render(bitmapData, _fontSprite, _baseState);
}
}
bitmapData.unlock();
}
public function get buttons():Vector.<BitmapButton>{ return _buttons; }
}
и небольшой тест:
var canvas:ButtonCanvas = new ButtonCanvas(stage.stageWidth, stage.stageHeight);
addChild(canvas);
for(var i:int = 0; i < 20; i++)
{
var button:BitmapButton = new BitmapButton("Hello");
button.position.x = Math.random() * stage.stageWidth;
button.position.y = Math.random() * stage.stageHeight;
canvas.add(button);
}
stage.addEventListener(MouseEvent.MOUSE_MOVE, update);
function update(e:MouseEvent):void
{
canvas.render();
}
canvas.render();
Теперь, когда вы» я прочитал все это, я укажу, что это действительно маловероятно y ou нужно в любом месте рядом с этой экстрим, если у вас нет какой-либо игры, которая вращается вокруг кнопок и кнопок на самом деле частицы, которые генерируют каждый кадр в 100-х годах. Использование стандартного Sprite + TextField отлично подходит практически во всех случаях.
В вашем случае при рисовании 1000 кнопок будет получено более 1 724 000 байт - почему? Если я использую только текстовое поле, это будет 1,316,000. Но человек, это очень интересно. Не могли бы вы подробнее рассказать о функции getSize()? – ZuzEL
@ZuzEL Потому что вам нужно определить новый Sprite и TextField для каждой кнопки. В моем примере вам нужно только определить новый экземпляр «BitmapButton», который очень легкий. Кроме того, 'getSize()' сообщает вам, сколько памяти использует объект. – Marty
Мне не нужен Sprite в моем примере – ZuzEL