Driver86 | Дата: Среда, 2012-03-14, 01:50:48 | Сообщение # 1 |
CyberMan
Сообщений: 545
Репутация: 14
Не на форуме
| Как-то случайно наткнулся на очень старую статью в кешах одного популярного архиватора сети Интернет. Автор статьи - 3DNews, 2000-ый год. Стало интересно: насколько это актуально сейчас?
Почему измерять скорость карты используя FPS неправильно Хотя все наши читатели и знакомы со значением слова FPS - я рискну еще раз напомнить, о чем идет речь. FPS (frames per second) означает количество выводимых кадров в секунду. И он, безусловно, является одним из основных показателей скорости игры. В связи с этим, есть тенденция его абсолютизировать. То есть, попытки представить его главным и единственным скоростным показателем. Доходит до совершенно курьезных вещей, когда не понимая сути измеряемого показателя, его пытаются представить как измеритель скорости видео-акселераторов. Зачастую этим грешат и маркетинговые отделы компаний-производителей, что вносит еще большую путаницу. Вспомните, хотя-бы, лозунг компании 3dfx - "60 fps в любой игре!". Давайте попробуем разобраться, в чем тут ошибка Во-первых, никогда и ни при каких обстоятельствах нельзя применять этот показатель без приведения конкретных обстоятельств его получения. Ести вещи, от программ не зависящие - например, та-же частота смены кадров монитора. Неважно, как ведут себя программы, но, если и видео-карта, и монитор, поддерживают выставленную частоту - частота смены кадров (60 кадров в секунду, 75, 85, 100, и пр.) будет иметь место всегда. Совершенно другой случай мы имеем с FPS. Под FPS подразумевается реальная скорость генерации новых кадров игровой сцены, которая ничего общего не имеет с аппаратными вещами, типа refresh rate монитора, и очень сильно зависит от способа генерации сцены - даже если сама визуальная картинка одна и та-же. Во-вторых, fps - это интегральный показатель, точнее - это усредненное за определенный период времени значение. И как со всякими усредненными величинами - с ним нужно обращаться осторожно. Любимый пример моей мамы (преподавателя статистики в институте) - это средняя температура больных по госпиталю... Кто-то лежит в горячке, а чей-то труп уже остывает в морге. А средняя температура - 36.6 градусов ;-) Уточнение: мне хотелось-бы акцентировать ваше внимание на том, что именно я хочу сказать. Нельзя мерять (посредством FPS) именно скорость видео-акселератора. Скорость же данной игры на данном видео-акселераторе на данной машине с данным программным обеспечением - можно и нужно измерять при помощи FPS. Второе уточнение: даже измеряя (при помощи FPS) скорость игры (а это практически единственный показатель ее скорости на данном акселераторе) - необходимо помнить и о том, насколько плавно она идет. Потому что, даже если игра выдает очень большие значения FPS - если кадры сменяются неравномерно, то субъективно человек ощущает меньшую скорость. Например, последние драйвера от nVidia дают меньшую скорость в FPS, но большую плавность (равномернее интервал между сменой кадров), и за счет этого - субъективно кажется, что игра идет быстрее. От чего зависит FPS Итак, от чего он зависит? Давайте пройдем по пунктам, и попробуем проанализировать их. 1. Загрузка процессора 1 Скорость процессора (CPU), для большинства игр, имеет очень большое значение. Но она используется одновременно для двух, совершенно разных вещей. Первое, это обслуживание самой игры, расчет изменений во времени, 1.1 AI (Artificial Intelligence - искусственный интеллект) участников, за которых играет компьютер (NPC), и прочее. В зависимости от игры, влияние этого фактора может варьировать от нуля до большей части загрузки процессора. Естественно, чем точнее (реалистичнее) рассчитывается физика происходящих в игре процессов, чем умнее ведут себя "компьютерные" персонажи - тем больше времени тратиться на их расчет. Основной способ борьбы с этим - оптимизация как самого AI, так и всей суммы аппаратных и программных средств. Большинство видео-акселераторов имеют специальный (FIFO) буфер, который кеширует последовательность рисования графических примитивов, плюс, необходимость (как правило) синхронизировать смену кадров сцены со сменой кадров экрана. В результате, как стратегия для программиста, необходимо очень быстро нарисовать сцену (которая в значительной степени осядет в FIFO буффере видео-акселератора), уведомить драйвер, о смене буфера рисования (для double и triple buffering), и немедленно приступить к пересчету (но не рисованию!) следующей сцены и обработки AI. Если физика происходящего не требует больших расчетов и используется простенький AI - современные процессоры, как правило, успевают пересчитать всю сцену за то время, пока графический акселератор заканчивает обработку очереди примитивов, и синхронизирует смену буферов с частотой кадров монитора. Если он не успевает справиться с этой работой - FPS игры падает, как минимум, вдвое, по сравнению с возможностью скорости вывода самой видео-карты. 1.2 T&L (Transformation and Lighting - трансформация и освещение) - процесс преобразования локальных для объкта (модели) трехмерных координат в двухмерные координаты экрана. Сам по себе этот процесс не сложен, но требует значительных ресурсов процессора, и именно в области плавающей арифметики. Тут, для борьбы с этой частью нагрузки, требуются свои меры. Во-первых, это покупка более быстрого процессора. Однако, скорость процессора (тактовая частота) - это не единственный, и далеко не главный показатель. Поскольку плавающие вычисления в 3D выполняются, достаточно "приблизительно", то играет роль скорость работы именно с float (а не double) числами. Скажем, AMD K6-II или PentiumIII имеют специальные инструкции процессора (3DNow! и SSE соответственно), предназначенные для быстрой и параллельной обработки плавающих чисел, и, при той-же тактовой частоте способны обрабатывать 3D графику более чем в два раза быстрее, чем аналогичные процессоры, но не имеющие этих инструкций (PerntiumII, Celeron, AMD K6-I и более старые). Поэтому, например, AMD K6-II 350 ведет себя лучше, чем тот-же переразогнанный Celeron 466. Заметьте, что MMX инструкции предназначены для работы с целочисленной арифметикой, и имеют значение только для software mode графики. Эти операции уже давно выполняются видео-акселераторами аппаратно, и нужда в MMX (в области игры) уже прошла. 1.3 Скорость системной шины и кэш памяти так-же играют существенную роль. Однако, это проблема в первую очередь именно программистов. Именно они обязаны разместить данные таким образом, чтобы при обработке они оказывались рядом, то есть попадали в кэш первого уровня одновременно. Зачастую, это ведет к увеличению требований игры по памяти, но, обычно, это не самая большая часть. Стоит напомнить, что если программисты пишут игры без учета этой части современной аппаратной реализации компьютеров, скорость игры может упать в разы, а то и и более. Впрочем, купив себе компьютер и процессов с большим объемом кэш-памяти, и более быстрой системной шиной - вы можете значительно облегчить задачу программистов и несколько "исправить" их ошибки ;-) 1.4 Разное. Сюда можно отнести очень много факторов, влияющих на скорость игры. Напримет, тип шины (AGP/PCI) видео-акселератора. Огромное значение имеют вещи, о которых вы можете даже не задумываться - например, ISA звуковая карта может нещадно тормозить вашу игру, а как вы об этом узнаете? Если речь зашла о звуке, то, например, программная реализация 3D звука может запросто отъесть значительную часть ваших ресурсов (от 3 до 6 % процессорного времени на каждый 3D звуковой буффер). Играют роль фоновые задачи - зачастую вы о них ничего не знаете, но, например, автоматически устанавливаемая MS Office-ом в авто-запуск, "быстрый поиск файлов" программка может с легкостью превратить ваш компьтер в полный тормоз, для некоторых игр. Подведем итоги этой главы. Главное - скорость игры, и, следовательно, показатель FPS значительно зависит не только от вашего видео-акселератора, но и от других основных параметров вашего компьтера - процессора (и поддерживаемого им набора инструкций), количество памяти, размер кэш памяти первого и второго уровня, скорость шины, другая установленная переферия, фоновые задачи, настройки многозадачного режима и пр. и пр. и пр. Когда канонический персонаж Вася Пупкин говорит - на моем видео-акселераторе игра показывает XX fps, а Петя ему вторит, что на той-же самой карточке он имеет YY fps - это вообще ни о чем не говорит! Остальные отличия компьютеров и программного обеспечения могут легко изменить результаты в несколько раз! От чего зависит FPS (продолжение) Продолжим наши разбирательства со скоростью игр и видео-акселераторов. Если вы внимательно проинспектировали свой компьютер на предмет совместимости оборудования, программа написана "правильно" - то один из главных лимитирующих факторов, влияющий на FPS определился достаточно четко - скорость, с которой CPU просчитывает данные и "скармливает" их видео-акселератору - то есть скорость плавающей арифметики процессора, величина кэша первого уровня, и пропускная способность системной шины (и локальной шины акселератора PCI/AGP). Сейчас вы спросите - а как-же другой "главный" показатель видео-карты - скорость заполнения (fillrate)? И спросите совершенно справедливо - это действительно один из основных показателей, влияющих на скорость игры. Но не всегда и не везде. 2. Fillrate Fillrate - это скорость, с которой видео-акселератор заполняет (расчитанные) значения пикселей в буффер, то есть скорость рисования. На первый вгляд, ограничения накладываемые fillrate-ом обойти невозможно. Это чисто аппаратный показатель, он зависит только от скорости видео-памяти и процессора. Ну, еще от ширины канала, ведь, расчет цвета пикселей происходит аппаратно, и можно расчитывать их параллелльно, параллелльно же загружая в память видео-карты. Поэтому и растет ширина (а, следовательно, и пропускная способность) шины к видео-памяти - 64 бита, 128 бит, а теперь уже и 256 бит... Поэтому и ограничивается качество цвета, и используются только 16 бит на цвет, вместо "положенных" 24. Fillrate - это одно из самых узких мест, и в борьбе за него жертвуют многим. Однако, и тут, оказывается, есть варианты. 2.1 Разные типы буферов. Необходимо понимать, какие именно данные записывает акселератор в память. Кроме буфера самих цветов (цвет каждого пикселя), видео-акселератор хранит в своей памяти еще и другие данные. Как правило, это Z-буфер ("глубина", Z-координата, каждой точки экрана) и иногда, буфер шаблонов. Есть еще и другие типы буферов памяти, самый из известных который - накопительный буфер (accumulator), вариацией которого и является разрекламированный T-buffer будущих карт фирмы 3dfx. Однако, большинством "игровых" акселераторов, аппаратно поддерживаются только Z-буфер, и буфер шаблонов (как правило, в 32-битном режиме). При использовании других типов буферов акселерация не поддерживается, драйвера переходят в software режим... В общем, никто их (по этой причине) и не использует. Таким образом, акселератор записывает в память, как правило, вдвое больше информации, чем вы видите на экране. 2.2 Чтение видео-памяти. Кроме записи в видеопамять сформированной картинки, акселератору необходимо еще и читать из нее. Необходимость возникает в двух случаях - необходимость знать Z-координату пикселя, для того, что-бы не рисовать поверх него точки, лежащие за ним; - необходимость прочитать цвет уже нарисованной точки, для смешения цветов, а именно, когда рисуется полупрозрачный объект (дым, огонь, вода, стекло и пр.) находящийся к нам ближе, чем уже нарисованная точка. 2.3 Текстуры. Текстуры объектов тоже хранятся (как правило) в видео-памяти акселератора, и их чтение (перед накладывание на поверхность объекта) так-же отъедает значительную часть пропускной способности шины. Взглянув на эти два пункта, становится ясным, как увеличить скорость игры, даже при фиксированном fillrate. Для этого нам нужно минимизировать все операции, связанные с записью и чтением данных в/из памяти видеокарты. Простейший пример - стена. Непрозрачная. Совершенно точно известно, что объекты, находящиеся за стеной, видны не будут. Значит, если программист сможет заранее выяснить, какие именно объекты рисовать не нужно - отпадает необходимость а) в записи в Z-буфер данных, относящихся к стене, и б) чтение из Z-буфера данных, при рисовании объектов находящихся "перед" стеной. Таким образом, можно, практически, на 2/3 сократить объем данных, передаваемых по шине памяти акселератора, и увеличить "эффективный" fillrate в 3 раза. Разумное использование прозрачных объектов так-же может значительно сократить наши затраты. Конечно, эти "хитрости" программирования 3D движков не всегда удается использовать, но фокус заключается в том, что именно фон картинки требует максимальной скорости заполнения (так как он занимает большую часть физической поверхности экрана), и здесь этот прием работает в полную силу. Таким образом, в типичной игре, даже при наличии не слишком высокого уровня fillrate современных акселераторов, возможно создание достаточно "заполненных" сцен. Больше того, уж позвольте мне немного удариться в философию, но я уверен, что значительное повышения скорости заполнения следующего поколения видео-акселераторов, не даст настолько же значительного повышения скорости игры. Многие их моих знакомых ностальгически вспоминают Word 2.0. Помните, текстовый такой? И работал он с приемлемой скоростью, и функционально не было обделен. Что-же произошло, что имея супер современный пентиум и дикое (как казалось совсем недавно) количество памяти, пользователи все так-же мучаются "тормознутостью" современных программ? Впрочем, ответ вы знаете не хуже меня. И позвольте выразить уверенность - как только fillrate перестанет быть самым узким местом - никто, ну совершенно никто не будет его экономить. Да, еще какое-то время он будет расти - будет нужен для полноценного антиалиасинга, для стерео-режима, для увеличения разрешения экрана. Но уже наступает насыщение, и когда fillrate увеличится в несколько раз - вы это не сильно-то и заметите... Замечание: если резюмировать вышеизложенное, то при прочих равных условиях (тот-же самый компьютер, отсутствие таких внешних факторов, как ISA звуковая карта, безобразные программы, запущенные в фоновом режиме и пр.) - очень важное значение имеет то, для какого видео-акселератора была оптимизирована данная игра. А это, как правило, значит - каким видео-акселератором и API пользовались разработчики. Наиболее известный (печально известный) пример - это, конечно-же, движок от Unreal. Наверное, можно было-бы просто привести Unreal в качестве примера, почему при помощи FPS нельзя измерять скорость именно акселератора, но можно измерять скорость данной игры на данном акселераторе (и прочих составляющих)... Но... тогда это не было бы так интересно ;-)
|
|
| |