CADisplayLink и магия статических переменных в Apple OpenGl ES Sample - PullRequest
0 голосов
/ 23 апреля 2011

Я бы хотел объяснить, почему работает образец XCode OpenGl ES Sample, пожалуйста.Для запуска метода 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.

Является ли здесь ключевое слово static?Может ли Objective C игнорировать все будущие объявления переменных после того, как что-то объявлено как статическое?

Спасибо за помощь!

1 Ответ

0 голосов
/ 23 апреля 2011

Статические переменные инициализируются во время компиляции в двоичном файле, поэтому только один раз, и по этой причине вам запрещено назначать динамические значения для их инициализации.Здесь переменная transY устанавливается не на 0.0 при каждом вызове метода, а только при запуске.Вот почему последующие вызовы метода могут получить старое значение.

...