Ios 粒子引擎在设备上比在模拟器上慢得多
我已经为一款iPad游戏实现了一个粒子引擎。在iPad模拟器上,我得到了一个非常好的帧率,超过500个粒子(远远超过我的需要)。然而,在iPad上,我得到了完全不同的结果。因为只有10个粒子(我需要更多的粒子),所以我的帧率很低 作为基础,我采用本教程来实现我的粒子发射器类: (使用OpenGL ES 1) 因为我使用OpenGL ES 2.0,所以我编写了自己的渲染方法:Ios 粒子引擎在设备上比在模拟器上慢得多,ios,ipad,opengl-es,opengl-es-2.0,Ios,Ipad,Opengl Es,Opengl Es 2.0,我已经为一款iPad游戏实现了一个粒子引擎。在iPad模拟器上,我得到了一个非常好的帧率,超过500个粒子(远远超过我的需要)。然而,在iPad上,我得到了完全不同的结果。因为只有10个粒子(我需要更多的粒子),所以我的帧率很低 作为基础,我采用本教程来实现我的粒子发射器类: (使用OpenGL ES 1) 因为我使用OpenGL ES 2.0,所以我编写了自己的渲染方法: - (void) renderParticles:(RenderMode)renderMode ofParticleEmi
- (void) renderParticles:(RenderMode)renderMode ofParticleEmitter:(ParticleEmitter*)particleEmitter xOffset:(int)xoffset yOffset:(int)yoffset
{
PointSprite *vertices = [particleEmitter getVertices];
for (int p = 0; p < particleEmitter.particleCount; p++) {
CC3GLMatrix *modelView = [CC3GLMatrix matrix];
// Translate the Modelviewmatrix
[modelView populateFromTranslation:CC3VectorMake(_cameraX, _cameraY, -5.0)];
[modelView translateByX:vertices[p].x + xoffset];
[modelView translateByY:vertices[p].y + yoffset];
[modelView translateByZ:101.0];
[modelView scaleByX:2.0];
[modelView scaleByY:2.0];
glUniformMatrix4fv(_modelViewUniformT, 1, 0, modelView.glMatrix);
glBindTexture(GL_TEXTURE_2D, [particleEmitter getTexture]);
// Create and Bind a rectangular VBO
[self calcCharacterVBOwithCols:1 rows:1 currentCol:1 currentRow:1];
glVertexAttribPointer(_positionSlotT, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) 0);
glEnableVertexAttribArray(_positionSlotT);
// Fragment Shader value
float opacity = 1.0;
glUniform1f(_opacity, opacity);
// Normal render, add Texture coordinates
// Activate Texturing Pipeline and Bind Texture
glVertexAttribPointer(_texCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));
glEnableVertexAttribArray(_texCoordSlot);
glDrawElements(GL_TRIANGLES, sizeof(IndicesLayer)/sizeof(IndicesLayer[0]), GL_UNSIGNED_BYTE, 0);
glDisableVertexAttribArray(_texCoordSlot);
glDisableVertexAttribArray(_positionSlotT);
[self destroyCharacterVBO];
}
}
-(void)renderParticles:(RenderMode)粒子发射器的RenderMode:(ParticleEmitter*)ParticleEmitter xOffset:(int)xOffset yOffset:(int)yOffset
{
PointSprite*顶点=[particleEmitter getVertices];
for(int p=0;p
我是否遗漏了粒子的一些要点?如何才能在设备上获得更好的帧速率?问题似乎是为每个粒子一次又一次地指定粒子纹理,即使它们都使用相同的纹理 所以通过绑定纹理
glBindTexture(GL_TEXTURE_2D, [particleEmitter getTexture]);
在循环所有粒子之前,我得到了一个比模拟器快得多的帧速率 您的代码中是否有许多NSLog,这些NSLog会发送到控制台?据我所知,模拟器不会模拟实际设备的处理器速度。因此,如果您的计算机比设备更强大(几乎可以肯定是这样),那么模拟器的性能会更好。您应该始终在设备本身上进行性能测试。仅在应用程序初始化期间(加载纹理、声音等)。在runloop本身的运行过程中,没有NSLog被垃圾发送到控制台。模拟器的工作速度和你的Mac CPU相当——比iPad快得多。模拟器的GPU也比iPad的GPU快得多。