Когда я кодирование в движке, я часто касается только с фиксированным n
: Я уже получил раздел пространственного ограничивающего числа объектов приема update()
, physics()
и render()
примерно тех , кто на экране и прилегающих районах. Максимальный размер партии обычно довольно четко определен для каждой игры, хотя он всегда немного больше, чем вы планировали.
В этом случае меня интересует не столько биг-о, сколько множитель с постоянным множителем и члены более низкого порядка. Для функции со средой выполнения, подобной a*n^2 + b*n + c
(которая есть O(n^2)
), я часто гораздо больше озабочен сокращением a
и, возможно, устранением c
. Стоимость установки или демонтажа c
может стать пропорционально большой по сравнению с небольшой n
.
Однако это не означает, что big-O (или, более конкретно, big-theta ) является отличным индикатором запаха кода. Посмотрите O(n^4)
где-нибудь или, что еще хуже, O(k^n)
геометрическое время, и пришло время убедиться, что вы рассматриваете другие варианты.
Я, как правило, гораздо больше беспокоюсь об оптимальности Big-O и прыгаю через обручи, чтобы найти алгоритмы с более низким Big-O, когда я имею дело с инструментами создания данных. Хотя количество объектов в данном уровне / области потоковой передачи, как правило, четко определено, общее количество объектов / художественных ресурсов / файлов конфигурации / и т. Д. Во всей игре может не совпадать. Это также намного большее число. Даже запуская параллельное создание данных, мы все еще ждем порядка минуты (я знаю, скулить - записи данных для консолей могут занять часы - мы в основном небольшие портативные игры), чтобы пройти jam data-clean && jam data
цикл.
Чтобы привести конкретный пример: это действительно вышло из-под контроля с помощью алгоритма фоновой потоковой передачи потоков, который обрабатывает 8x8 256-цветных листов. Полезно разделять потоковые буферы между фоновыми «слоями», и у нас может быть до 6 из них на данном уровне, совместно использующих один и тот же буфер. Проблема состоит в том, что оценка размера необходимого буфера основана на возможных позициях всех 6 слоев - и если они имеют простое число ширина / высота / скорость прокрутки, вы быстро начнете выполнять исчерпывающий поиск - который начинает приближатьсяO(6^numTiles)
- которая во многих случаях относится к категории «дольше, чем будет вселенная». К счастью, в большинстве случаев это всего 2-3 слоя, но даже в этом случае мы работаем выше получаса. На данный момент мы выбираем очень небольшое подмножество этих возможностей, увеличивая степень детализации до тех пор, пока не пройдет заданный промежуток времени (или мы выполнили задачу, которая может произойти для небольших двухслойных конфигураций). Мы немного повысили эту оценку на основе предыдущих статистических данных о том, как часто мы ошибались, а затем добавили немного дополнительных отступов для хорошей оценки.
Еще один забавный пример: некоторое время назад в компьютерной игре ведущий инженер некоторое время экспериментировал с пропуском списков . Перерасход памяти приводит к увеличению эффектов кэша, что добавляет неконстантный множитель для всего дела - так что они действительно не являются хорошим выбором для маленьких n
. Но для больших отсортированных списков, где поиск часто, они обеспечивают выгоду.
(Я часто нахожу, что наивный алгоритм выше, чем big-O, быстрее для небольших наборов данных и легче для понимания; более интересные / сложные (например, patricia trie) людям труднее понять и поддерживать, но более высокую производительность при больших наборы данных.)