Рисовать только те элементы, которые видны, то есть рисовать только плитки и т. Д., Которые в данный момент находятся на экране. Для плиток это довольно просто: если у вас много сущностей, вы можете либо использовать скользящее окно, чтобы сохранить список локальных объектов экрана, либо использовать такую вещь, как квадродерево.
Поскольку нет простого / быстрого способа скопировать один холст на другой, перерисовка областей действительно сложна, поскольку вы не можете сохранить в буферизованном состоянии (например) фон, если он не изменился. Так что хранение списка «грязных прямоугольников» наверняка приведет к дополнительным вычислительным затратам.
Вся тема очень широкая, даже обработка скорости FPS может быть довольно сложной, этот вопрос содержит несколько хороших ссылок и ответов на эту тему:
https://gamedev.stackexchange.com/questions/1589/fixed-time-step-vs-variable-time-step
Вы также упомянули о взаимодействии с сервером, если вы хотите создать мультиплеер, вам придется заботиться о еще большем количестве вещей, вы не можете доверять клиенту, вам нужно беспокоиться о пропускной способности, проблемах синхронизации, интерполяции на клиенте. и т. д.
В прошлом я делал несколько довольно простых 2D-игр, большинство из которых не на JavaScript, но они должны дать вам несколько подсказок:
http://github.com/BonsaiDen/Norum
(Демонстрация движка Platformer в C, зоны камер, движущиеся платформы)
http://github.com/BonsaiDen/Tuff
(2D-платформер на Java, не законченный, бонусы и некоторые интересные вещи)
http://github.com/BonsaiDen/NodeGame-Shooter
(2D многопользовательский космический шутер, написанный на JS, с использованием Node.js для сервера и WebSockets для связи)
Для некоторых заключительных слов я бы сказал, что вы должны начать с малого, как, например, сначала просто сделать карту прокрутки, затем добавить игрока, а затем переписать все это. Вы хотите написать идеальный движок просто с нуля, это займет много итераций, пока вы не узнаете все причуды и хитрости.
Если вы хотите получить более точные ответы, вам следует открыть вопросы по отдельным компонентам, с которыми вы столкнулись.