Экран загрузки для игры openGL на iphone? - PullRequest
1 голос
/ 12 ноября 2009

Я работаю в openGL для iPhone, и хотя все работает отлично, мне нужно подождать около секунды в определенных разделах игры, которые используют тонну спрайтов. Есть ли способ создать загрузочный экран для таких разделов? Или любой способ узнать, закончилась ли загрузка определенной текстуры с openGL?

EDIT:

Я загружаю свои текстуры с помощью этой функции:

-(void)loadTexture:(NSString*)nombre {

CGImageRef textureImage = [UIImage imageNamed:nombre].CGImage;
if (textureImage == nil) {
    NSLog(@"Failed to load texture image");
    return;
}

textureWidth = NextPowerOfTwo(CGImageGetWidth(textureImage));   
textureHeight = NextPowerOfTwo(CGImageGetHeight(textureImage));

imageSizeX= CGImageGetWidth(textureImage);
imageSizeY= CGImageGetHeight(textureImage);

GLubyte *textureData = (GLubyte *)calloc(1,textureWidth * textureHeight * 4); // Por 4 pues cada pixel necesita 4 bytes, RGBA

CGContextRef textureContext = CGBitmapContextCreate(textureData, textureWidth,textureHeight,8, textureWidth * 4,CGImageGetColorSpace(textureImage),kCGImageAlphaPremultipliedLast );
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)textureWidth, (float)textureHeight), textureImage);

CGContextRelease(textureContext);

glGenTextures(1, &textures[0]);

glBindTexture(GL_TEXTURE_2D, textures[0]);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData);

free(textureData);


glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   

}

Я обычно загружаю текстуры, которые мне нужны, в зависимости от раздела игры, например, одной или двух текстур 1024x1024, которые служат мне в качестве листов спрайтов, достаточно для большинства уровней, но на определенных уровнях, таких как битвы с боссами, загрузить около 5 или 6 текстур (босс большой и имеет множество различных атак), и игре требуется около 2 или 3 секунд, чтобы загрузить все эти текстуры одновременно.

Ответы [ 3 ]

2 голосов
/ 13 ноября 2009

Как объяснил Тиль, поскольку вы загружаете текстуру синхронно, она будет загружена после выполнения "loadTexture".

Рендеринг на экран в другом потоке через OpenGL при загрузке через OpenGL может очень быстро запутаться.

A - довольно часто используется - хак для обновления экрана между загрузками текстур:

  1. визуализация 0% экрана
  2. LoadTexture
  3. Экран 10% визуализации
  4. LoadTexture
  5. повторите при необходимости

С небольшим количеством дополнительной работы легко создать небольшую таблицу, которая содержит информацию о времени загрузки, так что "x%" близок к правде;)

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

1 голос
/ 12 ноября 2009

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

РЕДАКТИРОВАТЬ / ДОПОЛНЕНИЯ: Есть несколько вещей, которые вы должны избегать / изменять в своем коде. Не то чтобы это действительно решило вашу реальную проблему, просто общий совет ....

1-й: Не используйте imageNamed для загрузки изображения текстуры - это вообще плохая идея. Используйте imageWithContentsOfFile, поскольку это не приводит к перегружению кэша изображений данными, которые вы не будете использовать повторно.

2-й: Как только текстура загружена, есть термин, который Apple называет «подогревом текстуры» - который в основном кратко использует эту текстуру для быстрой и грязной (даже закадровой) визуализации. Таким образом, вы можете быть уверены, что текстура будет полностью доступна, и при первом «реальном» рендеринге не будет налагаться никаких дополнительных штрафов. Мы говорим о миллисекундах штрафа - так что ничего страшного, но заметного.

3-й: Попробуйте сместить загрузку текстуры в точку, где приложение все равно не используется - например. ожидание пользовательского ввода на экране запуска - но воздержитесь от этого в методе applicationDidFinishLaunching.

Здесь возникает вопрос - почему вы загружаете текстуры при рендеринге / внутри уровня. Почему бы не загрузить все необходимое? Вы можете использовать до 24 Мб памяти текстур без каких-либо штрафов (ну, за исключением памяти fbo).

0 голосов
/ 21 ноября 2010

В качестве альтернативы, вы можете просто отобразить анимацию UIImageView во время загрузки текстур. Это имеет особое преимущество - рисовать в виде отдельной угрозы ... это особый случай, как и UIActivityIndicatorView (spinner). Я не уверен, как Apple достигает этого технически, но он прекрасно работает.

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

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIImageView_Class/Reference/Reference.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...