iPhone оригинал рендерит быстрее чем iPhone 3GS? - PullRequest
0 голосов
/ 05 ноября 2010

Я работаю над игрой для iPhone, которая использует библиотеки C ++ и OpenGL ES 1.x. Отлично работает на симуляторе. Но когда я установил его на настоящий iPhone, я обнаружил, что на оригинальном iPhone потребовалось около 20 миллисекунд для рендеринга кадра. Однако для рендеринга кадра на iPhone 3GS потребовалось 35 ~ 40 миллисекунд.

Я пробовал разные ОС, включая 3GS + iOS 3.1.2, 3G + iOS 4.0, 3GS + iOS 4.1, iPad + iOS 3.2. Все они воспроизводятся намного медленнее, чем оригинал iPhone, что звучит для меня очень смешно. Я попробовал Google для всего, что могу придумать, исправив все проблемы, с которыми это может быть связано, но ничего не изменилось.

У меня есть 2 машины, которые быстрее обрабатывают эти фрагменты кода: 1) iPhone оригинал с iOS 3.1.3, 2) iPod Touch с iOS 3.1.3. На рендеринг кадра у обоих ушло около 20 миллисекунд. И 4 машины, которые работают таинственно медленнее: 1) iPhone 3G с iOS 4.0, 2) iPhone 3GS с iOS 3.1.2, 3) iPhone 3GS с iOS 4.1, 4) iPad с iOS 3.2. iPhone потребовалось около 35-40 миллисекунд для рендеринга кадра, а iPad - около 25.

Я использую PVRTC для текстуры, которая сначала готовится и превращается в связку. Всего используется десять текстур 512x512, три текстуры 1024x1024. Кусок кода, привязка текстуры которого выглядит следующим образом:

 GLenum internalFormat = 0;
 GLenum pixelType      = 0;

 // resolve type
 ResetFlags_();
 assert(2==attr.Dimension && 1==attr.Depth);
 switch (attr.Format) 
 {
 case FORMAT_PVRTC2:
  assert(attr.Width==attr.Height);
  if (attr.AlphaBits>0)
   internalFormat = GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
  else
   internalFormat = GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
  break; 
 case FORMAT_PVRTC4:
  assert(attr.Width==attr.Height);
  if (attr.AlphaBits>0)
   internalFormat = GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
  else
   internalFormat = GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
  break;

  ... other formats ...

 }

 // prepare temp buffer to load
 MemoryBuffer tmpBuffer(true);
 uint8* buffer = tmpBuffer.GetWritePtr(attr.TextureSize);

 // read data
 stream.Read(buffer, attr.TextureSize);
 if (stream.Fail())
  return false;

 // init
 width_    = attr.Width;
 height_    = attr.Height;
 LODs_    = attr.LODs;
 alphaBits_ = attr.AlphaBits;

 // create and upload texture
 glGenTextures(1, &glTexture_);
 glBindTexture(GL_TEXTURE_2D, glTexture_);

 uint32 offset = 0;
 uint32 dim    = width_; // = height
 uint32 w, h;
 switch (internalFormat)
 {
 case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
 case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
 case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
 case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
  for (uint32 i=0; i<LODs_; ++i) {
   assert(offset<attr.TextureSize);
   w = dim >> ((FORMAT_PVRTC2==attr.Format) ? 3:2);
   h = dim >> 2;

   // Clamp to minimum number of blocks
   if (w<2) w = 2;
   if (h<2) h = 2;

   uint32 const image_size = w * h * 8; //  8 bytes for each block
   glCompressedTexImage2D(GL_TEXTURE_2D, i, internalFormat, dim, dim, 0, image_size, buffer+offset);
   dim >>= 1;
   offset += image_size;
   break;

  ... other formats ...

 }


 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); // tri-linear?
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

 SetContext_(&glTexture_);
 return true;

Рендеринг часть огромна, потому что она использует двигатель, разработанный другими. Насколько я могу судить, он использует glDrawArrays и шейдер не использовался.

Кто-нибудь сталкивался с такой же проблемой раньше? Я действительно не понимаю, почему iPhone рендерит намного быстрее, чем iPhone 3GS.

p.s. Я забыл сказать. Я рисую только 2D прямоугольники только с текстурами. В моей игре это около 20 прямоугольников (один фон и один пользовательский интерфейс размером 480x360. Другие обычно имеют размер 64x64).

1 Ответ

1 голос
/ 29 июля 2011

Такое поведение может происходить из-за возможной эмуляции конвейера с фиксированными функциями (FFP) через программируемый конвейер (например, шейдеры).

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

...