ЗНАЕТЕ ЛИ ВЫ НЕКОТОРЫЕ БОЛЬШЕ ЛУЧШИЕ ПРАКТИКИ ДЛЯ КАНВАС?
Пожалуйста, добавьте в эту тему то, что вы знаете, узнали или читали в Интернете все лучшие практики Canvas, советы/рекомендации для производительности
С Canvas, все еще очень новым для Интернета, и никаких признаков того, что он когда-либо стареет, что я вижу в будущем, не так много документированных "лучших практик" или других действительно важных советов, которые должны "знать", для развития с ним в любом конкретном месте. Такие вещи разбросаны вокруг и много раз на менее известных сайтах.
Там так много вещей, о которых люди должны знать, и еще много чего узнать.
Я хотел поделиться некоторыми вещами, чтобы помочь людям, которые изучают Canvas и, возможно, некоторым, кто уже хорошо это знает, и я надеюсь получить от других отзывы о том, что они чувствуют, это некоторые лучшие практики или другие советы и рекомендации для работы с Холст в HTML5.
Я хочу начать с того, что мне лично показалось довольно полезным, но удивительно необычным для разработчиков.
1. Отступ вашего кода
Так же, как и в любое другое время, на любом другом языке, в любом случае. Это было лучшей практикой для всего остального, и я пришел к выводу, что в сложном приложении canvas все может немного запутываться при работе с несколькими различными контекстами и состояниями сохранения/восстановления. Не говоря уже о том, что код является более читаемым и в целом чистым выглядит тоже.
Например:
...
// Try to tell me this doesn't make sense to do
ctx.fillStyle = 'red';
ctx.fill();
ctx.save();
if (thing < 3) {
// indenting
ctx.beginPath();
ctx.arc(2, 6, 11, 0, Math.PI*2, true);
ctx.closePath();
ctx.beginPath();
ctx.moveTo(20, 40);
ctx.lineTo(10, 200);
ctx.moveTo(20, 40);
ctx.lineTo(100, 40);
ctx.closePath();
ctx.save();
ctx.fillStyle = 'blue'
ctx.fill();
ctx.restore();
} else {
// no indenting
ctx.drawImage(img, 0, 0, 200, 200);
ctx.save();
ctx.shadowBlur();
ctx.beginPath();
ctx.arc(2, 60, 10, 0, Math.PI*2, false);
ctx.closePath();
ctx.fillStyle 'green';
ctx.fill();
ctx.restore();
}
ctx.restore();
ctx.drawRect();
ctx.fill();
...
Является ли утверждение IF проще и чище читать и знать, что же происходит, чем утверждение ELSE? Вы видите, что я здесь говорю? Я думаю, что это должен быть метод, который разработчики должны продолжать практиковать так же, как и при написании простого JavaScript-кода или любого другого языка.
Использовать requestAnimationFrame вместо setInterval/setTimeout
setInterval и setTimeout никогда не предназначались для использования в качестве таймеров анимации, это всего лишь общие методы для вызова функций после задержки. Если в будущем вы установите интервал на 20 мс, но ваша очередь функций займет больше времени, чем будет выполняться, ваш таймер не будет срабатывать до тех пор, пока эти функции не будут завершены. Это может быть какое-то время, что не идеально подходит для анимации. RequestAnimationFrame - это метод, который сообщает браузеру, что анимация имеет место, поэтому она может оптимизировать перерисовку. Он также дросселирует анимацию для неактивных вкладок, поэтому она не будет убивать батарею вашего мобильного устройства, если вы оставите ее открытой в фоновом режиме.
Николас Закас написал в своем блоге чрезвычайно подробный и информативный материал Пол Ирланд написал прокрутку requestAnimationFrame - это то, что я использовал в каждом из Приложения холста, которые я сделал до недавнего времени.
<ФАКТИЧЕСКИ/h2 >
Даже лучше, чем использование requestAnimationFrame вместо setTimeout и setInterval, Джо Ламберт написал NEW и улучшенную прокладку под названием requestInterval и requestTimeout, которые он объясняет, какие проблемы существуют при использовании requestAnimFrame. Вы можете просмотреть сущность script.
АКТИВНО x2
Теперь, когда все браузеры догоняли спецификацию для этого, было обновление для requestAnimFrame() polyfill, который, вероятно, останется тем, который будет использоваться для охвата всех поставщиков.
Использовать более одного холста
Техника для анимационно-тяжелых игр, которые @nicolahibbert писал в опубликовать ее на оптимизацию игр Canvasупоминает, что лучше использовать несколько холстов, наложенных друг на друга, а не делать все в одном холсте. Никола объясняет, что "одновременное рисование слишком большого количества пикселей на одном и том же холсте приведет к падению частоты кадров через пол. Возьмите, например, Breakout. Пытаемся нарисовать кирпичи, шар, весло, любые бонусы или оружие, а затем каждая звезда в фоновом режиме - это просто не сработает, требуется слишком много времени, чтобы выполнить каждую из этих инструкций поочередно. Разделив звездное поле и остальную часть игры на отдельные холсты, вы сможете обеспечить достойную фреймрейт".
Render Elements Off-screen
Мне пришлось сделать это для нескольких приложений, которые я сделал, включая приложение Samsung Olympic Genome Project facebook. Это очень полезная вещь, чтобы знать и использовать, нужно ли это или нет. Это значительно сокращает время загрузки, а также может быть действительно полезным методом загрузки изображений с экрана, поскольку они могут иногда занимать некоторое время.
var tmpCanvas = document.createElement('canvas'),
tmpCtx = tmpCanvas.getContext('2d'),
img = document.createElement('img');
img.onload = function() {
tmpCtx.drawImage(thumbImg, 0, 0, 200, 200);
};
img.src = '/some/image/source.png';
Обратите внимание, что src изображения устанавливается после его загрузки. Это тоже важно помнить. После того, как изображения будут загружены и вписаны в эти временные холсты, вы можете нарисовать их на свой основной холст, используя тот же ctx.drawImage(), но вместо того, чтобы помещать изображение в качестве первого аргумента, вы используете 'tmpCtx.canvas' для ссылки на холст temp.
Другие советы, рекомендации и ресурсы
- Примеры проверки Canvas
- Еще несколько тестов canvas и JS
- Производительность HTML5Rocks Улучшение
- ** requestAnimFrame для оптимизации перетаскивания событий
Холст имеет обратную ссылку
В контексте 2d имеется обратная ссылка на связанный с ним элемент DOM:
var ctx = doc.getElementById('canvas').getContext('2d');
console.log(ctx.canvas); // HTMLCanvasElement
Мне бы хотелось услышать больше от других людей по этому поводу. Я работаю над составлением списка вещей, которые мы должны стандартизировать, чтобы добавить новый раздел в мою компанию Стандарты и лучшие стандарты кода. Мне бы очень хотелось получить от меня столько отзывов, сколько я могу.