Лучше пропустить OpenGL 2. X и начинают изучать OpenGL 3. X? [закрытый]

Стек является памятью, отложенной как пространство царапины для потока выполнения. Когда функция вызвана, блок резервируется на вершине стека для локальных переменных и некоторых бухгалтерских данных. Когда та функция возвращается, блок становится неиспользованным и может использоваться в следующий раз, когда функция вызвана. Стек всегда резервируется в LIFO (метод "последним пришел - первым вышел") порядок; последний раз зарезервированный блок всегда является следующим блоком, который будет освобожден. Это делает действительно простым отслеживать стек; освобождение блока от стека является не чем иным как корректировкой одного указателя.

"куча" является памятью, отложенной для динамического выделения. В отличие от стека, нет никакого вынужденного шаблона к выделению и освобождению блоков от "кучи"; можно выделить блок в любое время и освободить его в любое время. Это делает это намного более сложным для отслеживания, которых части "кучи" выделяются или свободны в любой момент времени; существует много пользовательских средств выделения "кучи", доступных для настройки производительности "кучи" для различных шаблонов использования.

Каждый поток получает стек, в то время как существует обычно только одна "куча" для приложения (хотя это не редко, чтобы иметь несколько "кучи" для различных типов выделения).

Для ответа на вопросы непосредственно:

, До какой степени ими управляют время выполнения языка или ОС?

ОС выделяет стек для каждого потока системного уровня, когда поток создается. Обычно ОС называет время выполнения языка для выделения "кучи" для приложения.

, Каков их объем?

стек присоединен к потоку, поэтому когда поток выходит, стек исправлен. "Куча" обычно выделяется при запуске приложения временем выполнения и исправлена, когда приложение (технически процесс) выходит.

, Что определяет размер каждого из них?

размер стека установлен, когда поток создается. Размер "кучи" установлен на запуске приложения, но может вырасти, поскольку пространство необходимо (средство выделения запрашивает больше памяти от операционной системы).

, Что делает один быстрее?

стек быстрее, потому что схема доступа делает его тривиальным, чтобы выделить и освободить память от него (указатель/целое число просто увеличен или постепенно уменьшен), в то время как "куче" вовлекли намного более сложную бухгалтерию в выделение или освобождение. Кроме того, каждый байт в стеке имеет тенденцию снова использоваться очень часто, что означает, что он имеет тенденцию быть отображенным на кэше процессора, делая его очень быстро. Другой хит производительности для "кучи" состоит в том, что "куча", будучи главным образом глобальным ресурсом, обычно должна быть безопасной многопоточностью, т.е. каждое выделение, и освобождение должно быть - обычно - синхронизировался со "всеми" другими доступами "кучи" в программе.

А очищают демонстрацию:
Источник изображения: vikashazrati.wordpress.com

10
задан Per Arneng 15 August 2009 в 14:47
поделиться

3 ответа

Узнайте все, о чем написано в большинстве учебных материалов. Учебники NeHe - хорошее место для начала.

Я немного поработал с OpenGL несколько месяцев назад, и, хотя я не помню версию, на которую я программировал, могу сказать вам, что это концепции, которые являются наиболее важными. Это особенно верно, когда вы только начинаете и не имеете дело с шейдерами и прочим.

(См. Ответ Мальте Класена.)

-7
ответ дан 3 December 2019 в 13:17
поделиться

Они почти полностью обратно совместимы, поэтому все, что вы узнаете с помощью более старой версии, будет вполне применимо к более поздним версиям. Если вам нужно «нацелиться» на что-то конкретное, 2.0, вероятно, будет хорошим выбором. Если вы посмотрите страницу OpenGL Wikipedia , вы увидите, что было добавлено в различные версии, и решите для себя, какие функции, по вашему мнению, вам понадобятся.

10
ответ дан 3 December 2019 в 13:17
поделиться

Будьте осторожны. OpenGL 3 не поддерживает многие функции, особенно те, что были на заре OpenGL. Если вы начнете с устаревших руководств (например, с большей частью NeHe), вы, скорее всего, привыкнете к устаревшему стилю OpenGL 2.

В OpenGL 3 нет фиксированного конвейера функций (если вы не используете функции обратной совместимости) . Вы должны использовать шейдеры. Больше нет glBegin / glEnd. Вы должны использовать буферы вершин. Оба уже доступны в OpenGL 2, но большинство руководств начинается с glBegin / glEnd и установки свойств цвета OpenGL. Это очень важное различие.

OpenGL 2 предоставляет бесчисленное количество способов разместить что-либо на экране, каждый из которых рассматривается по крайней мере в одном популярном руководстве. OpenGL 3 отбрасывает многие из них, в том числе "подмножество новичков" OpenGL 2 (исправлена ​​функция glBegin / glEnd). Так что если вы хотите нацелиться на OpenGL 3 в долгосрочной перспективе, сделайте это с самого начала. Нет ничего более демотивирующего, чем застрять в тупике.

48
ответ дан 3 December 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: