iOS и Cocos2d - изменение образа CCSprite И новые размеры = FAIL - PullRequest
0 голосов
/ 24 ноября 2011

Одним из бонусов в моей игре является уменьшение размера основного спрайта. Таким образом, ради памяти, вместо того, чтобы перебирать sprite.scale через каждый кадр, я сохранил спрайт в процентном размере ниже исходного спрайта и просто хочу его заменить. Затем, когда происходит «смерть» или таймер истекает, возвращается оригинальный спрайт.

Итак, я использую этот код, чтобы сделать его маленьким:

[player setTexture:[[CCTextureCache sharedTextureCache] addImage:@"player-small.png"]];

и этот код для возврата к нормальному состоянию:

[player setTexture:[[CCTextureCache sharedTextureCache] addImage:@"player-orig.png"]];

однако оригинальное изображение (как в init, так и при сбросе) выглядит нормально. Но когда я изменяю его на новый спрайт (который имеет размеры ровно 75% от исходного), он меняет его, но показывает только квадрант нового спрайта, но с исходными размерами.

Я пытался изменить sprite.contentsize перед повторным текстированием спрайта, но все, что было сделано, это изменило размер, но не повлияло на проблему с испорчением изображения.

Вот несколько наглядных примеров:

Оригинал:

Original


Retextured Image с модификацией contentSize:

Retextured Image with contentSize modification


Восстановлено изображение в исходном изображении с некорректным сбросом contentSize (упс, но это совсем не проблема - я просто забыл прочитать код размера):

Retexted image to the Original image with the contentSize not reset properly (oops, but this isn't a problem at all - i just forgot to readd the size code):

PS - у меня есть версии "-hd.png" всех моих спрайтов, так что я просто хотел добавить то, что хотел знать каждый (изображения и тестирование до сих пор проводились только на симуляторе "nonretina").

СПАСИБО!


РЕДАКТИРОВАТЬ: проблема возникает также во время тестирования на симуляторе сетчатки.

1 Ответ

2 голосов
/ 24 ноября 2011

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

Я скопировал ваше исходное изображение в программу для редактирования изображений, чтобы увидеть его размеры. Изображение имеет размер 73x71 пикселей, что означает, что оно сохраняется в памяти в виде текстуры с размерами 128x128, поскольку текстуры будут иметь степень двух измерений. При этом текстура будет использовать 64 КБ памяти (при условии глубины цвета 32 бита). С помощью атласа текстур вы сможете упаковать ваши текстуры более плотно, а также можете изменить отображаемый кадр с помощью метода CCSprite setDisplayFrame .

Кроме того, вы используете кеш текстуры:

[CCTextureCache sharedTextureCache] addImage:@"player-small.png"]
[CCTextureCache sharedTextureCache] addImage:@"player-orig.png"]

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

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

Наконец, мы говорим не более о 64 КБ памяти. Если вы беспокоитесь об использовании памяти и производительности, вам следует вместо этого загрузить PVR-текстуры, которые являются частью размера файла PNG как в памяти, так и на диске (но при этом теряются некоторые цветовые колебания).

Посмотрите TexturePacker для создания текстурных атласов и изображений PVR.

...