Является ли OpenGL "конечным автоматом"?
OpenGL обычно описывается как "конечный автомат", потому что, насколько я знаю, он состоит из глобальных переменных, которые могут быть установлены через его API, и они изменяют / определяют его поведение. Например, можно установить текущий цвет или матрицу преобразования. Многие из переменных состояния имеют непрерывный диапазон значений.
Однако, насколько я понимаю, "конечный автомат" или "конечный автомат" в информатике определяется как ориентированный граф состояний (как узлы) и переходов (как направленные ребра).
Является ли термин "конечный автомат", используемый для описания OpenGL, таким же, как термин "конечный автомат", который определен в общей компьютерной науке.
1 ответ
Многие из переменных состояния имеют непрерывный диапазон значений.
GLfloat
, как обычный float
, имеет фиксированный размер в битах. 32-разрядный IEEE-754 имеет только 32-разрядное хранилище. Следовательно, он может принимать только 2^32 различных значения (хотя довольно многие из этих значений будут считаться идентичными или несопоставимыми). И хотя 2^32 велико, оно все еще очень конечно.
Контекст OpenGL имеет четко определенный и конечный набор значений состояний. И каждое значение состояния может принимать конечный набор дискретных значений. Таким образом, можно смоделировать контекст OpenGL как конечный автомат с изменением значений в состоянии, просто делая переходы состояния (хотя объекты OpenGL, особенно программные объекты, несколько усложняют это представление).
Все это, как говорится, суть утверждения "OpenGL - это конечный автомат" на самом деле не имеет ничего общего с фактическим конечным автоматом. Заявление обычно упоминается как напоминание о том, что:
OpenGL запомнит состояние, которое в последний раз было задано в контексте, даже если вы забыли, что устанавливали в последний раз.
OpenGL запомнит состояние, которое в последний раз было задано в контексте, даже если вы забыли, что устанавливали в последний раз.
OpenGL является конечным автоматом, потому что он запоминает свое состояние. Если вы явно не выполните переход, он останется в том состоянии, в котором он был.
По сути, это напоминание, чтобы либо отслеживать текущее состояние, либо просто установить все состояние в начале цикла рендеринга, чтобы убедиться, что это то, что вы думаете.