Коли я кодування в движку, я часто стосується тільки з фіксованим n
: Я вже отримав розділ просторового обмежує число об'єктів прийому update()
, physics()
іrender()
приблизно тих , хто на екрані і прилеглих районах. Максимальний розмір партії зазвичай досить чітко визначений за гру, хоча він незмінно трохи більший, ніж ви планували.
У цьому випадку я не так переймаюся великим O, як мене турбує коефіцієнт множника постійного коефіцієнта та умови нижчого порядку. Для такої функції, як час виконання 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
цикл.
Щоб навести конкретний приклад: це дійсно вийшло з ладу за допомогою алгоритму фонового потокового потоку фонових зображень, який передає плитки 8х8 256 кольорів. Корисно ділитися буферами потокового потоку між фоновими "шарами", і ми можемо мати до 6 із них на заданому рівні, що розділяє один і той же буфер. Проблема полягає в тому, що оцінка розміру потрібного буфера ґрунтується на можливих позиціях усіх 6 шарів - і якщо вони є простою кількістю ширини / висоти / швидкості прокрутки, ви швидко приступаєте до вичерпного пошуку - який починає наближатисяO(6^numTiles)
- який у багатьох випадках знаходиться у категорії "довше, ніж буде Всесвіт". На щастя, більшість випадків - це лише 2-3 шари, але навіть тоді ми перевищуємо півгодини часу виконання. На даний момент ми вибираємо дуже малий підмножина цих можливостей, збільшуючи деталізацію до тих пір, поки не пройде задана кількість часу (або ми не виконали завдання, що може статися для невеликих двошарових конфігурацій). Ми трохи збільшимо цю оцінку на основі попередньої статистики того, як часто ми виявились неправильно, а потім додамо трохи додаткової накладки для гарної міри.
Ще один цікавий приклад: на комп'ютерній грі, провідний інженер деякий час експериментував із пропускними списками . Накладні витрати на пам'ять закінчуються тим, що спричиняють більше ефектів кешу, що додає свого роду непостійний множник у всій справі - тому вони насправді не є малим вибором для малих n
. Але для великих сортованих списків, де пошуки часті, вони дають перевагу.
(Я часто знаходжу, що алгоритм наївності вищий з великим розміром O, швидше на менших наборах даних і простіший для розуміння; тим цікавіші / складніші (наприклад, патріція трие) людям важче зрозуміти і підтримувати, але більш висока продуктивність на більших набори даних.)