Тестирование Z-глубины в OpenGL

Цитата взята из; Professional SQL Server 2012 Внутренние компоненты и устранение неполадок

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

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

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

Temporary Tables versus Table Variables

ПЕРЕМЕННЫЕ ТАБЛИЦЫ НЕ СОЗДАЮТСЯ В ПАМЯТИ

Существует распространенное заблуждение, что переменные таблицы находятся в структуры памяти и как таковые будут выполняться быстрее, чем временные таблицы . Благодаря DMV под названием sys. dm _ db _ session _ space _ Использование, которое показывает использование tempdb сессией, , вы можете доказать, что это не так . После перезапуска SQL Server для очистки DMV запустите следующий сценарий, чтобы подтвердить, что ваш идентификатор сеанса возвращает 0 для пользователя _ объекты _ alloc _ page _ count:

SELECT session_id,
database_id,
user_objects_alloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id > 50 ;

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

CREATE TABLE #TempTable ( ID INT ) ;
INSERT INTO #TempTable ( ID )
VALUES ( 1 ) ;
GO
SELECT session_id,
database_id,
user_objects_alloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id > 50 ;

Результаты на моем сервере показывают, что таблице была выделена одна страница в базе данных tempdb. Теперь запустите тот же сценарий, но на этот раз используйте переменную таблицы:

DECLARE @TempTable TABLE ( ID INT ) ;
INSERT INTO @TempTable ( ID )
VALUES ( 1 ) ;
GO
SELECT session_id,
database_id,
user_objects_alloc_page_count
FROM sys.dm_db_session_space_usage
WHERE session_id > 50 ;

Какой использовать?

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

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

8
задан 27 June 2009 в 02:15
поделиться

3 ответа

Хороший вопрос.

Краткое Ответ заключается в том, что Z-буфер хранит одно значение (только) для каждого пикселя в буфере кадра. Учитывая «обычный» режим работы (для непрозрачных объектов - GL_DEPTH_TEST включен, glDepthFunc установлен на GL_LESS ), это значение будет глубиной ближайшего фрагмент, который отображается на этот пиксель.

Буфер кадра - это «глупое» устройство - каждый фрагмент растрируется и проверяется на глубину независимо от всех остальных и отделен от любой концепции примитива, который его произвел. Таким образом, нет места для хранения информации о предыдущих примитивах, сортировке по глубине и т. Д., как это потребовалось бы для реализации вашей функции «автоматической прозрачности».

Возможно, вы захотите заглянуть в «графы сцены» для помощи с сортировкой по глубине. Это библиотеки, которые добавляют функциональность «более высокого уровня» помимо базовых функций T&L, которые предоставляет OpenGL.

Надеюсь, это поможет.

11
ответ дан 5 December 2019 в 10:43
поделиться

Я не слышал об отключении проверки глубины. Вам нужна проверка глубины прозрачных объектов.

Вы просто не хотите, чтобы прозрачные объекты записывались в z-буфер, потому что тогда они пробивали бы дыры во всем, что было нарисовано позади них.

2
ответ дан 5 December 2019 в 10:43
поделиться

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

Кроме того, материалы не t связаны непосредственно с треугольниками в API, поэтому OpenGL действительно не имеет возможности узнать, какие из них прозрачны, а какие - непрозрачны, до того момента, пока они не будут отрисованы.

Хороший способ справиться с этим - нарисовать все сначала ваши непрозрачные треугольники, а затем нарисуйте все свои прозрачные / смешанные треугольники в последнюю очередь. Обычно вам нужно включить тестирование глубины, но отключить запись глубины, и отсортировать прозрачные треугольники от заднего к переднему для правильного смешивания. Обычно я делаю это с помощью графа сцены с несколькими сегментами, и когда я добавляю треугольники в граф сцены, он автоматически разделяет их на соответствующие сегменты, которые будут отображаться в правильном порядке.

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

Хороший способ справиться с этим - сначала нарисовать все ваши непрозрачные треугольники, а затем все ваших прозрачных / смешанных треугольников в последнюю очередь. Обычно вам нужно включить тестирование глубины, но отключить запись глубины, и отсортировать прозрачные треугольники от заднего к переднему для правильного смешивания. Обычно я делаю это с помощью графа сцены с несколькими сегментами, и когда я добавляю треугольники в граф сцены, он автоматически разделяет их на соответствующие сегменты, которые будут отображаться в правильном порядке.

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

Хороший способ справиться с этим - сначала нарисовать все ваши непрозрачные треугольники, а затем все ваших прозрачных / смешанных треугольников в последнюю очередь. Обычно вам нужно включить тестирование глубины, но отключить запись глубины, и отсортировать прозрачные треугольники от заднего к переднему для правильного смешивания. Обычно я делаю это с помощью графа сцены с несколькими сегментами, и когда я добавляю треугольники в граф сцены, он автоматически разделяет их на соответствующие сегменты, которые будут отображаться в правильном порядке.

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

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

3
ответ дан 5 December 2019 в 10:43
поделиться
Другие вопросы по тегам:

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