2011-04-22 41 views
0

我想請解釋爲什麼XCode的OpenGl ES樣本能夠正常工作。它執行以下操作來啓動並條機方法(在blablaViewController.m - 名稱取決於項目的名稱):Apple OpenGl ES中的顯示鏈接和靜態變量魔術樣本

//sets up a CADisplayLink to do a regular (draw & update) call like this 
CADisplayLink *aDisplayLink = [[UIScreen mainScreen] displayLinkWithTarget:self 
    selector:@selector(drawFrame)]; 
[aDisplayLink setFrameInterval:animationFrameInterval]; 
[aDisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

和並條機方法裏面執行以下操作:

//start of method 
... 
static float transY = 0.0f; 
... 
//Quite a lot of OpenGl code, I am showing only parts of the OpenGL ES1 version: 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(0.0f, (GLfloat)(sinf(transY)/2.0f), 0.0f); 
transY += 0.075f; 
... 
//end of method 

我目前還不知道很多Objective C,但是這種transY變量被重置的方式,然後在同一個方法中增加是非常奇怪的。由於GL_MODELVIEW矩陣在被移位之前被重置爲身份,我不認爲它可以在某處保留opengl中的累積值。

static關鍵字是這裏的詭計嗎? Objective C忽略了所有將來的變量聲明,一旦聲明瞭靜態的一次?

感謝您的幫助!

回答

0

靜態變量在編譯時在二進制文件中被初始化,所以只有一次,因此你被禁止爲其初始化分配動態值。這裏,變量transY在每個方法調用中都沒有設置爲0.0,而是在啓動時。這就是爲什麼該方法的後續調用可以檢索舊值。

+0

感謝您的快速回復。 – rdrey 2011-04-22 22:01:25

+0

我會期望這是一個實例變量,但我想這樣的方法中包含的方法特定變量也很整潔。 – rdrey 2011-04-22 22:11:21

+0

在一個方法中本地聲明靜態變量可以用於這樣的簡單示例和其他特殊情況。但請記住,這意味着變量將存在於整個應用程序生命週期中,並且也將在同一類的所有實例中共享。這並不總是你想要的。 – eugeniodepalo 2011-04-22 22:19:44