Техническое примечание TN2178

Профилирование реального мира с Профилировщиком OpenGL

Профилировщик OpenGL является очень мощным инструментом для отладки и оптимизации OpenGL в Mac OS X. Этот technote описывает основное использование Профилировщика OpenGL, а также некоторых методов реального мира для анализа приложений и более усовершенствованных тем для более определенного тестирования и профилирования. Содержание этого документа описывает Профилировщика OpenGL v.4, который включен в Mac OS X Leopard, но должен помочь Вам использовать предыдущие версии также.

Начало работы
Методы реального мира
Управление Programatic Профилировщика OpenGL
Предпочтения профилировщика OpenGL
История версии документа

Начало работы

Профилировщик OpenGL расположен в/Developer/Applications/Graphics Инструментах.

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

Если Вы щелкаете, включают Профилировщику, установит GL_ENABLE_DEBUG_ATTACH переменная окружения, которая вступит в силу в следующем входе в систему. Идите вперед и включите его.

Рисунок 1  , разрешающий профилировщику, присоединяющему.

Запуск Главного окна или присоединение

Существует 2 способа проанализировать приложение путем присоединения к рабочему экземпляру или путем запуска в Профилировщике.

Запуск приложения с Профилировщиком

Главное окно с приложением Запуска, выбранным как показано на рисунке 2, - то, где можно перетащить комплект приложений, или можно нажать «+» кнопка для добавления его в открытой панели. Выберите имя приложения в таблице и нажмите кнопку Launch для запущения приложения. Кроме того, можно щелкнуть по полю Launch Arguments и добавить любые параметры, необходимые для приложения до запуска его.

Как только выполнение Вас может начать видеть мгновенную и пиковую Частоту кадров.

Время обновления по умолчанию 5 secs для дисплея частоты кадров может быть изменено в Предпочтениях как показано в Предпочтениях Профилировщика OpenGL.

Рисунок 2  , Запускающий приложение в Профилировщике.

Присоединение к запущенному приложению

Могли бы быть времена, когда присоединение к запущенному приложению более удобно, и это может быть сделано путем выбора Attach к приложению, выбора надлежащего процесса и нажатия кнопки Attach как показано на рисунке 3.

  Присоединение рисунка 3 к запущенному приложению.
  Запуск рисунка 4 или ошибка присоединения

Сбор трассировки вызовов OpenGL

Как только Вы запустили или присоединили к приложению, можно собрать статистические данные и проследить представление команд OpenGL, представленных приложением.

Для сбора трассировки OpenGL просто выбирают Trace в соответствии с меню Views или нажимают Command-Option-T.

Представление трассировки очень полезно, чтобы проанализировать последовательность операций, а также идентифицировать избыточные вызовы или плохое обращение состояния.

Рисунок 5 показывает окно трассировки с # Строк, Контексты и выбранная Информация синхронизации.

  Окно Figure 5 Trace.

Можно также собрать следы путем выбора Include Backtraces на главном окне Профилировщика.

Это соберет следы с именами функций, таким образом, Вы будете видеть, кто вызывает особенно медленный вызов путем щелчка по имени функции как показано на рисунке 6. Можно щелкнуть правой кнопкой по нему и принять решение просмотреть исходное изображение в новом окне или вкладке.

  Представление Trace рисунка 6 со стеком вызовов

Сохранение Трассировки к текстовому файлу

Трассировка вызовов может быть сохранена к текстовому файлу для обработки сообщения путем щелчка по Save As Text

Трассировки могут быть длинными и могли бы занять время, чтобы закончить сохранять текстовый файл, который может стать действительно большим.

С # Строки Контекст и Синхронизация выбрали сгенерированный текстовый файл, похож:

1: 0x00a2d400     0.18 µs glBegin(GL_QUADS);
2: 0x00a2d400     0.08 µs glTexCoord2f(0.025, 0.025);
3: 0x00a2d400     0.08 µs glNormal3f(0, 0, 1);
4: 0x00a2d400     1.19 µs glVertex3f(0, 0.03, 3.15);
5: 0x00a2d400     0.10 µs glVertex3f(0.03, 0, 3.15);
6: 0x00a2d400     0.10 µs glVertex3f(0, -0.03, 3.15);
7: 0x00a2d400     0.08 µs glVertex3f(-0.03, 0, 3.15);
8: 0x00a2d400     0.07 µs glNormal3f(0, 0, -1);
9: 0x00a2d400     0.10 µs glVertex3f(-0.03, 0, 0);
10: 0x00a2d400     0.08 µs glVertex3f(0, -0.03, 0);
11: 0x00a2d400     0.08 µs glVertex3f(0.03, 0, 0);
12: 0x00a2d400     0.09 µs glVertex3f(0, 0.03, 0);

Для получения информации о Сохранении Используя Фильтр посмотрите раздел Trace Filtering

Сбор статистики вызовов OpenGL

Для собирания статистических данных просто выбирают Statistics в соответствии с меню Views или нажимают Command-Option-S.

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

Представление статистики является большим видеть предполагаемый % времени, проведенного в GL как общее количество, проценты времени, проведенного в Гл на вызов и проценте времени Приложения, когда определенный вызов берет, а также сколько раз вызывается функция.

«Поле» Времени Приложения % показывает оценку того, сколько времени приложение проводит в определенной функции. Это вычисляется путем синхронизации каждого вызова GL и подводного плавания совокупных результатов к общему времени выполнения приложения. Управление синхронизацией вызовов GL могло бы скосить числа несколько процентных пунктов, но результаты являются все еще представительными. Акула могла бы дать Вам более точное число.

«% Время GL» является оценкой на основе времени определенная функция, берет в связи с общим временем, проведенным в OpenGL.

Также статистика может быть прокручена в различных интервалах времени при помощи части Шоу у основания окна.

Рисунок 7 показывает окно статистики, сортированное самым большим Общим Временем, проведенным в функции.

  Окно Figure 7 Statistics

Сохранение статистики к текстовому файлу

Таким же образом можно сохранить трассировку вызовов к текстовому файлу, можно сделать то же для статистики, и текстовый файл принимает форму:

GL Function;# of Calls;Total Time (µsec);Avg Time (µsec);% GL Time;% App Time ...

Проверка формата пикселя

Иногда полезно исследовать формат пикселя контекста, и Профилировщик позволяет Вам делать просто, что в выборе Формата пикселя в соответствии с меню Views или нажимают Command-Option-P

Если существуют многократные контексты, тот черного цвета цвета является текущим контекстом.

Среди прочего это - то, где Вы надеетесь видеть, буферизуется ли контекст OpenGL дважды, сглаживается и т.д.

Рисунок 8 показывает то, на что похоже окно Pixel Format.

  Представление формата пикселя рисунка 8

Существует также способ переопределить формат пикселя, который просит приложение с пользовательским временным форматом пикселя, и это показано в Запуске с пользовательским форматом пикселя

Установка точек останова

Одной из наиболее мощных функций Профилировщика OpenGL является возможность установить точки останова, в которых ресурсах (текстуры...), состояние GL, могут быть выполнены сценарии, многопоточный механизм может быть включен, или даже видеть, собирается ли текущая установка работать в CPU или GPU.

Профилировщик также позволяет Вам управлять выполнением (или обход) на функциональном уровне OpenGL.

Можно установить точки останова путем выбора опции Breakpoints меню Views, или можно нажать Command-Option-B.

Рисунок 9 показывает окно точек останова.

Точки останова могут быть установлены прежде или после выполнения определенного вызова, в ошибке GL, ошибке VAR, конфликте потока и нейтрализации программного обеспечения.

Для установки точки останова в определенном вызове щелкните под прежде или после на строке определенной функции интереса. Для быстрой прокрутки к определенному вызову GL, можно ввести первые несколько букв определенной функции Ваш, интересуются.

Для установки точки останова по любым ошибкам GL просто щелкают по кнопке Break on Error, так же для Повреждения на ошибке VAR, Повреждения на конфликте потока и Повреждения на нейтрализации SW.

  Окно Figure 9 Breakpoint.

Как только приложение поражает точку останова стек вызовов, контекст, kCGLCPGPUFragmentProcessing (обработка фрагмента на GPU), kCGLCPGPUVertexProcessing (обработка вершины на GPU) и kCGLCPCurrentRendererID (см./System/Library/Frameworks/OpenGL.framework/Headers/CGLRenderers.h), представлены.

В случае повреждения для ошибки GL, ошибки VAR или конфликта потока там полезное сообщение о состоянии у основания представления Call Stack.

Всплывающее окно Действий позволяет Вам набор и сбросило все точки останова. Это также позволяет Вам присоединять сценарии для выполнения в точке останова. Эта функция обсуждена при Присоединении и рабочих сценариях в точках останова.

Рисунок 10 показывает, что приложение остановилось в CGLFlushDrawable со всем работающим на GPU в той точке.

Рисунок 10  остановился в CGLFlushDrawable.

Управление выполнением

Выполнение определенного вызова сделано выбором, Выполняются на строке того определенного вызова. По умолчанию все вызовы OpenGL установлены выполниться. Всплывающее окно Действий позволяет Вам устанавливать или сбрасывать глобальное выполнение.

Если вызов установлен не выполниться, это становится noop, и последствия этого варьируются значительно в зависимости от многих факторов. Когда код, трассировки, и т.д. понят, эта функциональность должна только использоваться.

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

Для продолжения выполнения щелкают по кнопке Continue в правом нижнем углу окна Breakpoints.

Проверка состояния OpenGL

Текущее состояние OpenGL может быть проверено в точках останова путем щелчка по вкладке State окна точек останова.

Когда с представляющими аномалиями встречаются для идей сортировки состояния, и т.д., это очень полезно.

Рисунок 11 показывает состояние прямо прежде a CGLFlushDrawable, синее выделенное состояние является состоянием, изменившимся От состояния по умолчанию.

Рисунок 11  Выделенные изменения от состояния GL по умолчанию.

Несмотря на то, что не изображенный, если бы, Так как последняя точка останова выбрана, изменения состояния GL были бы выделены в красном. если и опции выбраны, состояние GL, выделенное в фиолетовом, показывает изменения от значения по умолчанию и начиная с последней точки останова.

Просмотр ресурсов

В то время как остановлено во множестве точки останова ресурсов может тогда быть исследован.

Представление ресурса может быть открыто путем выбора Resources из меню Views, или можно нажать Command-Option-R.

Текстуры

Вкладка Textures представляет список объектов текстур, сортированных их текстурой ID.

Те выделились в красном еще, не загружаются в Профилировщика, но простой щелчок по любому из них должен произвести текстуру.

В этом представлении текстуры могут быть исследованы, их цель, внутренний формат, исходный формат, исходный тип, и размерности показаны.

Ползунок Уровня Множественного отображения в нижней части позволит Вам выбрать другие уровни множественных отображений, если определено, ползунок Уровня Изменения масштаба позволяет увеличивать и уменьшать масштаб текстуры в представлении, Исходный Режим смешивания и Целевой Режим смешивания могут быть скорректированы при необходимости для надлежащего просмотра, средство выбора Цвета фона и Непрозрачности позволит Вам выбрать цвет и непрозрачность фона, и кнопка Flip Texture зеркально отразит текстуру вертикально.

Рисунок 12 показывает представление ресурса текстуры.

Рисунок 12  , Исследующий текстуры в представлении ресурса

Программы ARB

Программы ARB могут быть исследованы в окне Resources под вкладкой Programs. Как с любым ресурсом удостоверяются, что приложение в контрольной точке.

Программы построения теней GLSL

Профилировщик OpenGL очень полезен для исследования и даже отредактировать программы построения теней в Вашем приложении. Если Вы уже не имеете и выбираете вкладку Shaders, для получения там удостоверяются, что остановились в точке останова, открыли Resources в меню View. Здесь Профилировщик представляет список программы построения теней, и программа возражает для проверки.

Для редактирования или тонкой настройки программ построения теней в Вашем приложении этот путь см. программы построения теней раздела Editing.

Рисунок 13 показывает то, на что мог бы быть похожим объект программы.

  Объект программы рисунка 13.

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

  Вершинный шейдер рисунка 14

Рисунок 15 показывает то, на что мог бы быть похожим объект программы построения теней с программой построения теней фрагмента.

  Программа построения теней фрагмента рисунка 15.

FBOs

Объекты кадрового буфера могут быть исследованы в окне Resources под вкладкой FBOs. Как с любым ресурсом удостоверяются, что приложение в контрольной точке. Здесь Профилировщик представляет список FBOs, о котором он знает.

Здесь можно идентифицировать цвет, глубину, и получить присоединения с помощью шаблона FBO и использовать вкладки Texture или Renderbuffers для проверки их содержания.

Рисунок 16 показывает структуру и присоединения FBO.

Рисунок 16  структура FBO в представлении ресурса

Renderbuffers

Renderbuffers может быть исследован в окне Resources под вкладкой Renderbuffers. Как с любым ресурсом удостоверяются, что приложение в контрольной точке.

Функциональность здесь очень подобна вкладке Texture, как описано выше. Существуют корректировки к изменению масштаба, источнику и целевому смешению, цвету фона и непрозрачности и возможности вертикально зеркально отразить изображение.

Рисунок 17 показывает содержание Renderbuffer.

Рисунок 17  Renderbuffer в представлении ресурса.

VBOs

Буферные Объекты вершины могут быть исследованы в окне Resources под вкладкой VBOs. Как с любым ресурсом удостоверяются, что приложение в контрольной точке.

Профилировщик показывает Вам свойства, связанные с VBO.

Рисунок 18 показывает содержание Renderbuffer.

  Представление Figure 18 Vertex Buffer Object

VAOs

Объекты Массива вершины могут быть исследованы в окне Resources под вкладкой VAOs. Как с любым ресурсом удостоверяются, что приложение в контрольной точке.

Буферные представления

В соответствии с меню представления, несколько буферов могут быть исследованы, когда остановлено в точке останова. Ниже некоторые снимки экрана из программы построения теней частицы в примере GLSLShowpiece.

Обратный буфер

Рисунок 19  Текущий задний буфер

Буфер глубины

  
Буфер глубины viewFigure 21 буфера глубины Начальной буквы рисунка 20
  просматривает с минимальным диапазоном и макс.

Альфа-буфер

  Альфа-буфер рисунка 22

Буфер шаблонов

  Буфер шаблонов рисунка 23

Методы реального мира

Проверка приложения для ошибок

Профилировщик OpenGL может помочь быстро проверить приложение на ошибки путем установки точек останова ошибок GL, ошибок потока, и т.д.

  • На окне точки останова, набор надлежащая точка останова для ошибок GL

  • Запуск или присоединение к приложению, если Вы не сделали так

  • Контролируйте окно точки останова, чтобы видеть, фиксирует ли ошибку

Рисунок 24 показывает Профилировщику, фиксирующему ошибку.

  Повреждение рисунка 24 на ошибке

Проверка GPU или выполнения CPU текущего состояния

Самый простой способ зарегистрироваться в Профилировщике OpenGL, если приложение действительно выполняется на GPU, состоит в том, чтобы позволить Профилировщику повредиться на нейтрализациях программного обеспечения.

  • На окне точки останова проверьте опцию нейтрализации SW

  • Запуск или присоединение к приложению, если Вы не сделали так

  • Контролируйте окно точки останова, чтобы видеть если выгоды обратный вызов программного обеспечения

Рисунок 25 показывает Профилировщику, ловящему обратный вызов программного обеспечения. Обратите внимание на то, что kCGLCPGPUFragmentProcessing и kCGLCPGPUVertexProcessing и GL_FALSE в точке, указывая, что обработка фрагмента и обработка вершины в настоящее время обрабатываются механизмом восстановления программного обеспечения. Значение kCGLCPCurrentRendererID также становится отличным.

  Повреждение рисунка 25 на нейтрализации программного обеспечения

Сбор Трассировки и Статистики для единственного кадра

Сбор трассировки и статистики единственного кадра может дать Вам быстрое (если несколько узкий) представление того, что делает приложение.

  • Запуск или присоединение к приложению интереса

  • Переместитесь по приложению к подозрительной области

  • Установите точку останова в CGLFlushDrawable для двойных буферизированных контекстов или glFlush для единственных буферизированных

  • После того, как остановленный, открытый (или ясный) трассировка и окна статистики

  • Нажмите Continue один раз у основания окна точек останова

Вот несколько вещей рассмотреть в трассировке:

Вы видите какие-либо двойные или избыточные вызовы?

На этом единственном кадре ищут управление состоянием, он может быть улучшен сортировкой состояния?

Вы видите, что какой-либо единственный вызов занимает значительно больше времени, чем другие?

Разве кадр не сделан, представив? Возможно больше чем один CGLFlushDrawable / glFlush отправляются на кадр.

Включение Многопоточного выполнения Платформы OpenGL

Некоторые приложения могли бы получить преимущества от включения многопоточного выполнения Платформы OpenGL.

Профилировщик OpenGL позволяет Вам тестировать эту опцию без любого кодирования.

  • Запуск или присоединение к приложению интереса

  • Отметьте частоту кадров в несколько повторимой точке

  • Установите любую точку останова. CGLFlushDrawable характерно для двойных буферизированных контекстов.

  • После того, как остановленный выбирают Force на в управлении Мультипотока

  • Очистите точку останова и

  • Нажмите Continue один раз у основания окна точек останова

  • Отметьте частоту кадров при многопоточном выполнении

Контроль VRAM с монитором драйвера

Несмотря на то, что отдельное приложение от Профилировщика OpenGL, Монитор Драйвера OpenGL является другим ключевым инструментом при отладке и оптимизации приложений OpenGL.

Существует утес производительности, когда VRAM становится полным, настолько знающим, как Ваш VRAM использования приложения важен.

  • В OpenGL Профилировщик выбирают Driver Monitor в соответствии с меню View для запуска Монитора Драйвера OpenGL

  • В OpenGL Монитор Драйвера выбирают надлежащий драйвер. Обычно это - accomplised путем нажатия Cmd-1 на машинах с единственной видеокартой, или можно выбрать его под Мониторами Драйвера в меню Monitors

  • На драйвере окно монитора нажимает Parameters и дважды щелкает по Current Free Video Memory

Пэйдж Оффс и Пэйдж Онс текстур и поверхностей являются другими, которых Вы могли бы хотеть контролировать в связи с VRAM.

Редактирование программ построения теней

С Mac OS X Leopard Профилировщик OpenGL предоставляет возможность для изменения программ построения теней на лету.

  • Запуск или присоединение к приложению интереса

  • Установите точку останова и ожидайте приложения для остановки

  • Откройте Resources View и выберите вкладку Shaders

  • Выберите желаемый объект программы построения теней слева. Посмотрите рисунок 14

  • Отредактируйте программу построения теней на вкладке Source и нажмите Compile

  • Если компиляция перестала работать, можно использовать вкладку Log. Можно использовать кнопку Revert, чтобы возвратиться к исходному коду и затем поразить Компиляцию снова

  • если компиляция была успешна, тогда выпускают точку останова и совершают нападки, Продолжают представление точек останова

Отключение выполнения OpenGL

При некоторых обстоятельствах Вы могли бы хотеть отключить процессию функций OpenGL. Это возможно в Профилировщике путем выбора Execute ни один при Действиях в представлении Breakpoints. Для восстановления выполнения выбирают Execute все

Присоединение и рабочие сценарии в точках останова

Профилировщик OpenGL позволяет Вам вставлять (по стоимости производительности) мелкие суммы кода GL или Сценариев, которые будут выполняться, в то время как остановлено в точке останова.

Сначала необходимо создать сценарий. Откройте представление Scripts и щелкните «+» кнопка. Это генерирует пустой сценарий, который можно переименовать. На правой стороне можно отредактировать содержание сценария как показано на рисунке 26.

Рисунок 26  представление сценариев

После того, как создаваемый этот сценарий может быть выполнен вручную, в то время как остановлено в точке останова. Для автоматического выполнения сценария присоедините его к точке останова путем выбора Attach Script... при Действиях в представлении Breakpoints. Можно принять решение выполнить сценарий прежде или после повреждения и продолжаться автоматически или не после выполнения, как показано на рисунке 27.

Рисунок 27  , Присоединяющий сценарий к точке останова.

Фильтрация трассировки

Профилировщик OpenGL позволяет Вам создавать пользовательский фильтр, берущий stdin и помещающий что-то в stdout для сохранения трассировки.

Возможный пример мог бы находить самые медленные вызовы. Рассмотрите простой сценарий оболочки в Перечислении 1 и изображение в рисунке 28.

Сценарий генерирует сортированный (все более и более медленнее) вывод трассировки, как только Вы нажимаете кнопку Filter. Тогда Вы могли использовать номер строки вывода для прослеживания до среды, где вызов фактически имел место. Это поможет в выяснении, какие определенные кадры могли бы замедлять Вашу сцену.

Перечисление 1  sortedByTime.sh.

#!/bin/tcsh -f  awk '{ print $3" "$0 }' | sort -n
Рисунок 28  Используя sortedByTime.sh

Запуск с пользовательским форматом пикселя

Профилировщик OpenGL позволяет Вам Запускать приложение с пользовательским форматом пикселя. Путем выбора Launch Settings в главном окне как показано на рисунке 29

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

Рисунок 29  Пользовательский Формат пикселя.

Управление Programatic Профилировщика OpenGL

Профилировщик OpenGL также обеспечивает некоторое программируемое управление..

Управление точками останова

Это - очень мощная функция, позволяющая Вашему приложению устанавливать и очищать точки останова, когда присоединено к Профилировщику OpenGL.

Можно установить точку останова путем создания массива с 3 Вспышками:

  • Параметр 0: функционируйте ID (см. CGLProfilerFunctionEnum.h),

  • Параметр 1: логический OR kCGLProfBreakBefore или kCGLProfBreakAfter, указывая, как Вы хотите, чтобы остановилась точка останова: прежде, чем ввести OpenGL, по возврату из OpenGL или обоих

  • Параметр 2: используется как булевская переменная, включающая или выключающая точку останова

и затем передавая этот массив CGLSetOption().

Перечисление 2 показывает, как программно установить точку останова в CGLFlushDrawable.

Перечисление 2  , Устанавливающее точку останова в CGLFlushDrawable.

#include "OpenGL/CGLProfiler.h"
#include "OpenGL/CGLProfilerFunctionEnum.h"
...
   GLint myBreakpoint[] = { kCGLFECGLFlushDrawable, kCGLProfBreakBefore, 1;}
   CGLSetOption( kCGLGOEnableBreakpoint, myBreakpoint );
...

Вставка комментариев в представлении Trace

Комментарии могут быть распечатаны в окне Trace с помощью метода, проиллюстрированного в Перечислении 3

Перечисление 3  , Вставляющее комментарии в трассировку.

#include <OpenGL/CGLProfiler.h> ...     CGLSetOption(kCGLGOComment, (long) "***** My Comment is here *****"); ...

Получающийся комментарий похож на это в трассировке:

21561: 0.00 µs /* ***** My Comment is here ***** */

Управление журналированием трассировки

Вы, которыми может также управлять приложение, когда запустить/остановить трассировку, регистрирующую как показано в Перечислении 4

Это дает Вам мелкозернистый контроль над какой трассировки собраться в определенном разделе или время, например.

  Передача перечисления 4 GL_TRUE для запуска и GL_FALSE, чтобы прекратить прослеживать.

#include <OpenGL/CGLProfiler.h> ...     CGLSetOption(kCGLGOEnableFunctionTrace, GL_TRUE); ...

Перечисление 5  , Очищающее окно трассировки.

#include <OpenGL/CGLProfiler.h> ...     CGLSetOption(kCGLGOResetFunctionTrace, NULL); ...

Управление набором статистики

Вы, которыми может также управлять приложение, когда запустить/остановить набор статистики как показано в Перечислении 6.

Удостоверьтесь, что открыли окно статистики сначала.

Перечисление 6  , Управляющее статистикой.

#include <OpenGL/CGLProfiler.h>
...
    // To start
    CGLSetOption(kCGLGOResetFunctionStatistics, NULL); // if you want to reset counters to zero
    CGLSetOption(kCGLGOEnableFunctionStatistics, GL_TRUE);
...
    // To stop the counters
    CGLSetOption(kCGLGOEnableFunctionStatistics, GL_FALSE);
...

Предпочтения профилировщика OpenGL

  Окно Figure 30 Preferences


История версии документа


ДатаПримечания
16.09.2008

Новый документ, который описывает этот документ, как использовать Профилировщика OpenGL, очень мощный инструмент для Вашей разработки OpenGL.