«Не оптимизировать рано» не означает «выбрать худший из возможных способов». Вам все еще нужно учитывать влияние на производительность (если только вы не создаете прототипы). Дело не в том, чтобы наносить ущерб другим, более важным вещам на данном этапе разработки, таким как гибкость, надежность и т. Д. Выбирайте простые, безопасные оптимизации - выбирайте вещи, которые вы ограничиваете, и вещи, которые вы держите свободными; отслеживать расходы. Стоит ли использовать строгую типизацию? Большинство игр работали и работают нормально; сколько вам стоило бы удалить это, если бы вы нашли интересное использование гибкости для геймплея?
Намного сложнее модифицировать оптимизированный код, особенно «умный» код. Это всегда выбор, который делает некоторые вещи лучше, а другие хуже (например, вы могли бы тратить процессорное время на использование памяти). Делая такой выбор, вы должны знать обо всех последствиях - они могут быть катастрофическими, но они также могут быть полезными.
Например, Commander Keen, Wolfenstein и Doom были созданы на основе оптимизированного движка рендеринга. У каждого был свой «трюк», который позволил игре существовать в первую очередь (у каждого также была дальнейшая оптимизация, разработанная с течением времени, но это не важно здесь). Это нормально . Это нормально - сильно оптимизировать саму суть игры, мысль, которая делает игру возможной; особенно, если вы исследуете новую территорию, где эта конкретная оптимизированная функция позволяет вам рассматривать игровые конструкции, которые не были сильно изучены. Ограничения, которые вводит оптимизация, могут также дать вам интересный игровой процесс (например, ограничения количества юнитов в играх RTS могут начаться как способ повышения производительности, но они также имеют эффект игрового процесса).
Но обратите внимание, что в каждом из этих примеров игра не может существовать без оптимизации. Они не начинали с «полностью оптимизированного» двигателя - они начинали с крайней необходимости и продвигались вверх. Они разрабатывали новые технологии и использовали их для создания забавных игр. И уловки движка были ограничены настолько малой частью кодовой базы, насколько это возможно - более тяжелые оптимизации были введены только тогда, когда игровой процесс был в основном завершен, или когда он позволил появиться интересной новой функции.
Теперь рассмотрим игру, которую вы можете захотеть сделать. Есть ли какое-то технологическое чудо, которое делает или разрушает эту игру? Может быть, вы представляете игру с открытым миром в бесконечном мире. Это действительно центральная часть игры? Будет ли игра просто не работать без нее? Возможно, вы думаете об игре, в которой местность деформируется без ограничений, с реалистичной геологией и тому подобным; Вы можете заставить это работать с меньшим объемом? Будет ли это работать в 2D вместо 3D? Получите что-нибудь интересное как можно скорее - даже если для оптимизации может потребоваться переработать огромный кусок существующего кода, это может стоить того; и вы можете даже понять, что увеличение масштабов на самом деле не делает игру лучше.
В качестве примера недавней игры с большим количеством оптимизаций я бы указал на Factorio. Одной из важнейших частей игры являются ремни - их много тысяч, и они несут множество отдельных кусочков материалов по всей вашей фабрике. Игра началась с сильно оптимизированного ременного двигателя? Нет! На самом деле, оригинальную конструкцию ремня было почти невозможно оптимизировать - он как бы выполнял физическое моделирование предметов на ремне, что создавало некоторые интересные вещи, которые вы могли бы сделать (именно так вы получаете «эмерджентный» геймплей - геймплей, который удивляет дизайнер), но это означало, что вы должны были смоделировать каждый элемент на поясе. С тысячами ремней вы получаете десятки тысяч предметов, смоделированных физически - даже если вы просто удалите их и дадите ремням работу, вы сможете сократить время, затрачиваемое на процессор, на 95-99%, даже без учета таких вещей, как локальность памяти. Но это полезно делать только тогда, когда вы действительно достигаете этих пределов.
Практически все, что имело отношение к ремням, должно было быть переделано, чтобы можно было оптимизировать ремни. И ремни нужно было оптимизировать, потому что вам нужно было много ремней для большой фабрики, а крупные фабрики - это одна из привлекательных сторон игры. В конце концов, если у вас не может быть больших фабрик, зачем нужен бесконечный мир? Забавно, что вы должны спросить - ранние версии этого не делали :) Игра была переработана и изменена много раз, чтобы добраться до того места, где они сейчас находятся - в том числе 100% -ный римейк, когда они поняли, что Java не является подходящим способом для игра, как это и перешел на C ++. И это сработало отлично для Factorio (хотя это было все же хорошо, что не было оптимизировано с самого начала - тем более, что это был хобби-проект, который мог бы просто потерпеть неудачу из-за отсутствия интереса).
Но дело в том, что естьмногие вещи вы можете сделать с фабрикой ограниченного масштаба - и многие игры показали это. Ограничения могут быть даже более вдохновляющими, чем свободы; будет ли Spacechem более увлекательным, если бы «карты» были бесконечными? Если бы вы начали с сильно оптимизированных «поясов», вы бы в значительной степени были бы вынуждены пойти по этому пути; и вы не могли бы исследовать другие направления дизайна (например, посмотреть, что интересного вы можете сделать с помощью имитирующих физику конвейерных лент). Вы ограничиваете свое потенциальное пространство дизайна. Может показаться, что это не так, потому что вы не видите много незавершенных игр, но сложная часть состоит в том, чтобы получить удовольствие от веселья - для каждой забавной игры, которую вы видите, возможно, есть сотни, которые просто не могли попасть туда и были выброшены (или хуже, выпущен как ужасные путаницы). Если оптимизация поможет вам это сделать - продолжайте. Если это не так ... это скорее преждевременно. Если вы думаете, что какая-то механика геймплея работает отлично, но нуждается в оптимизации, чтобы действительно сиять - продолжайте. Если у вас нет интересной механики,не оптимизируйте их . Сначала найдите забаву - вы обнаружите, что большинство оптимизаций не помогают с этим, и часто являются вредными.
Наконец, у вас есть отличная, веселая игра. Есть ли смысл оптимизировать сейчас ? Ха! Это все еще не так ясно, как вы думаете. Есть что-то веселоевы можете сделать вместо этого? Не забывайте, что ваше время все еще ограничено. Все требует усилий, и вы хотите сосредоточить эти усилия на том, где это наиболее важно. Да, даже если вы делаете «бесплатную игру» или «игру с открытым исходным кодом». Смотрите, как играется в игру; обратите внимание, где производительность становится узким местом. Оптимизация этих мест приносит больше удовольствия (например, строительство больших и запутанных фабрик)? Позволяет ли вам привлечь больше игроков (например, с более слабыми компьютерами или на разных платформах)? Вам всегда нужно расставлять приоритеты - ищите соотношение усилий и доходности. Скорее всего, вы найдете множество низко висящих фруктов, просто играя в свою игру и наблюдая, как другие играют в игру. Но обратите внимание на важную часть - чтобы попасть туда, вам нужна игра . Сосредоточиться на этом.
Как вишня на вершине, учтите, что оптимизация никогда не заканчивается. Это не задача с небольшой галочкой, которую вы заканчиваете и переходите к другим задачам. Вы всегда можете выполнить «еще одну оптимизацию», и большая часть любого развития заключается в понимании приоритетов. Вы не проводите оптимизацию ради оптимизации - вы делаете это для достижения конкретной цели (например, «200 единиц на экране одновременно на Pentium 333 МГц» - отличная цель). Не забывайте о конечной цели только потому, что вы слишком много внимания уделяете промежуточным целям, которые могут даже не быть предпосылками для конечной цели.