0

我的应用程序处理 OpenGL ES 2.0;我使用颜色选择来识别在点击过程中触摸了哪个对象。

每次我第一次点击一个物体时,反应很慢,但第二次反应很快。例如,在特定屏幕上点击第一次需要 0.45 秒,第二次大约需要 0.01 秒。

在调试时,我发现麻烦的代码如下:

    [effectTmp prepareToDraw];
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(MaterialVertexData3D), &vertexDataMaterial[0].vertex);
    glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(MaterialVertexData3D), &vertexDataMaterial[0].normal);
    glDrawArrays(GL_TRIANGLES, 0, [drawObjectTmp getSizeFromVertexIndicesArray]);
    glDisableVertexAttribArray(GLKVertexAttribPosition);

我已经阅读了对象的屏幕外预加载会有所帮助。从日志中,我可以读到这些对象的预加载与上述第一次一样多,即 0.45 秒。但是,当我第一次点击时,也需要 0.45 秒。在预警之后,预期会花费第二次(0.01 秒)的时间。

令我困惑的另一件事是:第一个慢调用是颜色选择调用;这意味着每个对象都以一种有助于识别它们的特定颜色显示在屏幕外。这也意味着这些对象已经在屏幕上可见(带有它们的纹理),所以我会假设顶点会被预加载;并且当对象显示在屏幕上时,此类问题在加载对象时会很明显,而不是在颜色选择期间...

你们中有人遇到过这种行为吗?你是如何/将如何解决这个问题的?

干杯,-Stéphane

4

1 回答 1

0

即使计时器功能表明,问题也不是来自颜色选择算法。

在实现淡出/淡入屏幕功能时,我意识到颜色选择方法很快,因为屏幕正在快速淡出;但是下一个屏幕的淡入很慢。这是因为 textures ,即使已加载(此处使用 Glktextureloader),在第一次渲染时实际上会花费一些时间。

一种解决方法是在应用程序的初始化阶段将这些纹理对象显示在屏幕外。

于 2013-06-15T21:30:16.027 回答