Bottleneck (Узкое место)
Вся современная графическая аппаратура представляет процесс рендеринга как конвейер для более эффективного использования блоков ускорителя. На практике все блоки не могут использоваться одинаково интенсивно, некоторые стадии выполняются быстрее и простаивают в ожидании результата обработки более медленных. Для сглаживания этого эффекта используется кеш, однако он не всегда может помочь. В итоге, на результирующую скорость работы приложения влияют только несколько (возможно, одна) стадий, поэтому при оптимизации других стадий конвейера прирост скорости минимален, а при оптимизации узкого места конвейера скорость может расти линейно. Естественно, для этого необходимо найти узкое место (bottleneck) из-за которого простаивают все остальные блоки.
Перечислю основные этапы конвейера: CPU, AGP, [[TnL]] (fixed & programmable pipeline), Triangle Setup, Rasterization, Fragment Shading. Также источник потенциальных узких мест - пропускная способность памяти при текстурировании и отрисовке в кадровый буфер. Отмечу, что производительность стадий до Triangle Setup иногда называют transformation rate, а после - FillRate.
Во-первых, хоть это и банально, на на всякий случай напомню, что узким местом абсолютного большинства современных игр является CPU. Даже если это не так, CPU всегда есть смысл разгрузить, пусть даже за счет GPU. С помощью CPU можно реализовать самые эффективные алгоритмы оптимизации графики, плюс к тому программисты физики и игровой логики нуждаются в свободном процессоре.
Возможные узкие места графического конвейера - это AGP, TnL, Fragment Shading, и текстурирование. Остальное на практике случается достаточно редко, потому как производительность остальных блоков очень высока.
Алгоритм выявления bottlenecks:
- Изменить глубину цвета кадрового буфера. Если это повлияло на FPS, то конвейер ограничен пропускной способностью памяти.
- Изменить размер/фильтрацию текстур. Если FPS изменилось, конвейер ограничен пропускной способностью текстурной памяти.
- Изменить разрешение. Если FPS изменилось, конвейер ограничен FillRate (Fragment Shading или Rasterization)
- Изменить размер вершины (например, добавить неиспользуемые элементы) или скорость AGP в драйверах. Если FPS изменилось, конвейер ограничен пропускной способностью AGP.
- Иначе, конвейер ограничен скоростью трансформаций TnL.
Если используется программируемый конвейер, чтобы проверить влияние шейдеров на скорость достаточно усложнить/упростить шейдер и посмотреть на FPS.
Более подробную информации по поиску узких мест конвейера и оптимизации под них программы рекомендуется искать на сайте разработчиков видеокарт (www.ati.com , www.developer.nvidia.com), приведу ссылки на 2 документа по данной теме:
http://www.developer.nvidia.com/docs/IO/10878/ChinaJoy2004_Optimi… nAndTools.pdf
http://www.ati.com/developer/dx9/ATI-DX9_Optimization.pdf
Что такое Bottleneck (Узкое место)?
27 июля 2005 (Обновление: 11 авг 2005)