Является ли OpenGL конечным автоматом?

OpenGL обычно называют «машиной состояний», потому что, насколько я знаю, он состоит из глобальных переменных, которые можно установить через его API, и они изменяют/определяют его поведение. Например, можно установить текущий цвет или матрицу преобразования. Многие из переменных состояния имеют непрерывный диапазон значений.

Однако, насколько я понимаю, «конечный автомат» или «конечный автомат» в информатике определяется как ориентированный граф состояний (как узлы) и переходов (как направленные ребра).

Является ли термин «машина состояний», используемый для описания OpenGL, тем же, что и «машина состояний», которая определена в общей информатике.


person Ali Shakiba    schedule 09.04.2016    source источник


Ответы (1)


Многие из переменных состояния имеют непрерывный диапазон значений.

GLfloat, как и обычный float, имеет фиксированный размер в битах. 32-битный IEEE-754 имеет только 32-битную память. Следовательно, он может принимать только 2^32 различных значения (хотя многие из этих значений будут считаться идентичными или несопоставимыми). И хотя 2^32 велико, оно все равно очень конечно.

Контекст OpenGL имеет четко определенный и конечный набор значений состояния. И каждое значение состояния может принимать конечный набор дискретных значений. Таким образом, контекст OpenGL можно смоделировать как конечный автомат, в котором изменение значений в состоянии просто является переходом между состояниями (хотя объекты OpenGL, особенно программные объекты, несколько усложняют это представление).


При всем при этом основной смысл утверждения «OpenGL — это конечный автомат» на самом деле не имеет ничего общего с реальным конечным автоматом. Утверждение обычно произносится как напоминание о том, что:

  1. OpenGL запомнит состояние, которое в последний раз было задано в контексте, даже если вы забыли, на какое оно было установлено в последний раз.

  2. OpenGL запомнит состояние, которое было последним задано в контексте, даже если вы забыли, на какое оно было установлено последним.

OpenGL — это конечный автомат, потому что он запоминает свое состояние. Если вы явно не выполните переход, он останется в том состоянии, в котором он был.

По сути, это напоминание либо отслеживать текущее состояние, либо просто установить все состояние в начале цикла рендеринга, чтобы убедиться, что оно именно то, что вы думаете.

person Nicol Bolas    schedule 09.04.2016
comment
Спасибо за ответ (и поправку). Я думаю, поскольку переменные с плавающей запятой на самом деле моделируют непрерывный диапазон, мы можем рассматривать их как непрерывные при обсуждении концепций высокого уровня, но в любом случае вторая часть полностью отвечает на мой вопрос. - person Ali Shakiba; 09.04.2016