CADisplayLink и статична променлива магия в Apple OpenGl ES Sample

Бих искал обяснение защо OpenGl ES Sample на XCode работи, моля. Той прави следното, за да стартира метода drawFrame (в blablaViewController.m - името зависи от името на проекта):

//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];

и вътре в метода drawFrame прави следното:

//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 някъде.

Статичната ключова дума ли е номерът тук? Objective C игнорира ли всички бъдещи декларации на променливи, след като нещо е декларирано статично веднъж?

Благодаря за помощта!


person rdrey    schedule 22.04.2011    source източник


Отговори (1)


Статичните променливи се инициализират по време на компилиране в двоичния файл, така че само веднъж и поради тази причина ви е забранено да присвоявате динамични стойности за тяхната инициализация. Тук променливата transY не е зададена на 0.0 при всяко извикване на метод, а само при стартиране. Ето защо следващите извиквания на метода могат да извлекат старата стойност.

person eugeniodepalo    schedule 22.04.2011
comment
Бих очаквал това да е променлива на екземпляр, но предполагам, че запазването на специфични за метода променливи, съдържащи се в метода като това, също е добре. - person rdrey; 23.04.2011
comment
Декларирането на статични променливи локално в един метод може да работи за прости примери като този и за други специални случаи. Но имайте предвид, че това означава, че променливата ще съществува през целия живот на приложението и ще бъде споделена между всички екземпляри от същия клас. Това не винаги е това, което искате. - person eugeniodepalo; 23.04.2011