我正在开发一款使用C ++和OpenGL ES 1.x库的iPhone游戏。 它在模拟器上工作正常。但是当我在真正的iPhone上安装它时,我发现在iPhone原版上,渲染帧需要大约20毫秒。但是,在iPhone 3GS上渲染帧需要35~40毫秒。
我尝试了各种操作系统,包括3GS + iOS 3.1.2,3G + iOS 4.0,3G + iOS 4.1,iPad + iOS 3.2。所有这些都比iPhone原版慢得多,这对我来说听起来真的很荒谬。我尝试了谷歌我可以想到的任何事情,解决它可能与之相关的所有问题,但没有任何改变。
我有2台机器,这些代码片段渲染速度更快:1)iPhone原装iOS 3.1.3,2)iPod Touch和iOS 3.1.3。两者都需要大约20毫秒来渲染帧。 令人神秘地变慢的4台机器:1)带有iOS 4.0的iPhone 3G,2)带有iOS 3.1.2的iPhone 3GS,带有iOS 4.1的iPhone 3GS,带iOS 3.2的iPad。 iPhone花了大约35-40毫秒来渲染一个框架,iPad花了大约25个。
我使用PVRTC作为纹理,首先将其煮熟并制成束。它总共使用了10个512x512纹理,3个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的UI。其他通常是64x64单位。)
答案 0 :(得分:1)
您获得的行为可能是因为可通过可编程管道(即着色器)模拟固定功能管道(FFP)。
你可以执行一个测试,它将以某种方式加载和显示你的纹理,完全没有你的引擎。