Использование памяти текстуры Cocos2d

Я использую cocos2d и имею спрайт-лист 1024x1024.

Я загружаю текстуру в формате RGBA4444, и она занимает 2 МБ, отмеченных как «gfxAllocateTextureLevel».

Затем, когда я создаю CCSprites из таблицы спрайтов, он мгновенно потребляет дополнительные 4 МБ памяти, отмеченные как glsmLoadTextureLevelBuffer.

Всего 6 МБ, что довольно много по сравнению с моим приложением. Ожидается ли это? Нужно ли создавать такой буфер для каждого листа спрайтов или даже для CCSpriteBatchNode? Спасибо.


person FBryant87    schedule 02.01.2012    source источник
comment
Как вы создаете CCSprites? Вы используете initWithSpriteSheet?   -  person rsaxvc    schedule 03.01.2012
comment
Я создаю спрайт с помощью [CCSprite [email protected]]. Я загружаю сам лист спрайтов с помощью: [[CCTextureCache sharedTextureCache] addImageAsync:@x.png target:self selector:@selector(gameSpritesLoaded:)]; Затем добавьте их в кэш перед созданием пакетного узла: [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@x.plist];   -  person FBryant87    schedule 03.01.2012


Ответы (2)


Спецификация OpelGLES1.1 гласит:

«GL сохраняет результирующую текстуру с разрешением внутренних компонентов по своему выбору»

=> GPU/драйвер может преобразовывать ваши пиксели в размер по мере необходимости для GPU (GPU может изначально работать только с определенными форматами пикселей, поэтому все, что не является этим, будет преобразовано в один), поэтому я думаю, что у вас есть 2 МБ RGBA4444 и 4 МБ RGBA8888 того же листа спрайтов.

person rsaxvc    schedule 02.01.2012
comment
Спасибо, но я не уверен, что следую. Что я могу делать неправильно, чтобы он загружал его в обоих форматах пикселей? - person FBryant87; 03.01.2012
comment
gfxAllocateTextureLevel — это RGBA4444. Однако, прежде чем графический процессор сможет его использовать, он должен быть подготовлен для использования графическим процессором, что включает преобразование RGBA8888 (собственный формат графического процессора). - person rsaxvc; 03.01.2012
comment
Но тогда какой смысл когда-либо использовать формат RGBA4444? - person FBryant87; 03.01.2012
comment
Какой смысл в любом конкретном формате растрового изображения - возможно, для хранения изображения с наименьшим количеством требуемых битов. OpenGL ES не позволяет узнать внутренний формат графического процессора. Тем не менее, вы можете обмануть, потому что AFAICT каждый экземпляр реализации (все iPhone + IOS5) имеет один и тот же формат графического процессора, поэтому вы можете сделать так, чтобы он соответствовал этому, если хотите. Каждый GPU имеет разные форматы, в которых он лучше или хуже. - person rsaxvc; 04.01.2012

У меня точно такая же проблема! Я загружаю текстуру в формате RGBA8888, и она занимает 4 МБ, отмеченных как «gfxAllocateTextureLevel».

Затем, когда я создаю CCSprites из таблицы спрайтов, он мгновенно потребляет дополнительные 4 МБ памяти, отмеченные как glsmLoadTextureLevelBuffer.

person Db Xiong    schedule 21.05.2013