Итак, у меня есть браузерная игра, которая управляется холстом с динамическими размерами (он масштабируется до размеров окна пользователя), который принимает изображения разных размеров, масштабирует их в соответствии с пользовательскими размеры окон и их рисуют: (пример моего изменения размера :) алгоритмCanvas - изменение размера изображения и сохранение переменной
https://jsfiddle.net/8o3sn9mh/55/
var
canvas = document.getElementById('c'),
ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var flower = new Image();
//the src is actually local, but i put a url for example's sake
flower.src = "http://plainicon.com/dboard/userprod/2803_dd580/prod_thumb/plainicon.com-46129-128px-af2.png"
flower.onload = function(){
ctx.drawImage(flower,0,0,128,128, 0, 0, window.innerWidth/2, window.innerHeight/2);
}
, как вы можете видеть, я рисую 128x128px изображения и изменить размер его половину этого окна пользователя. Итак, я подумал: моя игра может выполнять эту операцию при каждом выполнении рендеринга, и для ее выполнения может потребоваться ненужное время изменения размера. Итак:
1) Выполняет ли это изменение размера больше времени с тех пор, как я использую его каждый запрос?
2) Есть ли способ изменить размер моего изображения один раз, сохранить его в var и использовать его, чтобы сэкономить это время?
Независимо от того, я хотел бы способ, чтобы сохранить уменьшенное изображение в вар, чтобы соответствовать его внутри createPattern метода холста:
pattern = ctx.createPattern(resizedFlower, 'repeat'); //resizedFlower should be the original flower resized into half's the user's window's width + height
ctx.fillStyle = pattern;
ctx.fillRect(0, 0, 50, 50);
Хорошо, так 1) почему, по вашему мнению, нет разницы в производительности? 2) Я не думаю, что это оптимально, чтобы сделать как 40 холстов (у меня много изображений для изменения размера), а затем нарисуйте их на каждом из них ... это? (Ну, я могу использовать его для моего метода createPattern хотя) – user1938653
«Также вы не должны изменять размер всего экрана, вы можете слушать событие изменения размера окна и изменять размер, когда это событие срабатывает». что вы имеете в виду? Я должен изменять его размер каждый раз в requestAnimationFrame, так как исходные изображения больше/меньше, чем они должны быть нарисованы на холсте. Я хочу, чтобы персонажи моей игры были пропорциональны размерам холста, потому что они динамичны. – user1938653
1) Хорошо, поэтому я измерил разницу в производительности https://jsperf.com/canvas-resize296923, не изменяя размер на 2% быстрее. 2) Он будет использовать больше памяти, но не должно быть большой разницы в производительности, если вы не используете огромные изображения. – Josh