Сохранение части холста

Можно ли при рисовании элемента холста HTML5 оставить его часть нетронутой? Можете ли вы взять часть изображения, а затем перерисовать эту часть, если это невозможно напрямую?

Единственное решение, о котором я подумал, - это нарисовать на отдельном холсте меньшего размера, а затем скопировать его на основной холст. Это осуществимый подход?

Я хочу нарисовать игровую сцену, сохранив пользовательский интерфейс. К сожалению, порядок розыгрыша заранее неизвестен.


person Venatu    schedule 29.09.2011    source источник
comment
Вы хотите нарисовать обрезанную часть изображения на холсте?   -  person pimvdb    schedule 30.09.2011
comment
Не совсем. Я хочу ограничить вывод drawImage определенной областью. Я мог вручную фильтровать каждое изображение, а затем обрезать его на основе координат, но надеялся на встроенное высокопроизводительное решение.   -  person Venatu    schedule 30.09.2011


Ответы (3)


Думаю, вы ищете .clip: http://jsfiddle.net/eGjak/122/.

ctx.rect(100, 50, 200, 100);          // make a region
ctx.clip();                           // constrain to that region
ctx.drawImage($("img").get(0), 0, 0); // draw image
person pimvdb    schedule 29.09.2011
comment
Кажется, это именно то, что я ищу, однако это подорвало мою производительность. Это делает хром полностью невосприимчивым. Это очень медленное действие? Один раз кадр невозможен? - person Venatu; 30.09.2011
comment
@Venatu: я использую его в своем рендерере, вызывая его примерно 80 раз в каждом кадре, и это не узкое место. На самом деле это кажется быстрее, чем рисовать полное изображение (без обрезки). Кстати, вы используете канал бета/разработчика? Графический процессор включен для холста, что приводит к ужасной производительности, по крайней мере, это то, что я испытываю. - person pimvdb; 30.09.2011
comment
Стоит отметить: если вам нужно вырезать сложную область, вы можете сделать это с помощью ориентированных кривых. пример - person ellisbben; 30.09.2011
comment
@ellisbben: Очень интересно, не знал об этом. Спасибо, что поделился! - person pimvdb; 30.09.2011
comment
@pimvdb Да, я использую бета-канал. Перейду на стабильную и отпишусь о результатах. Использование requestAnimationFrame делает его немного более отзывчивым, хотя и ненамного. Похоже на ошибку из того, что вы говорите - person Venatu; 30.09.2011
comment
@Venatu: Просто чтобы убедиться, вы 1) сохраняете и восстанавливаете холст 2) каждый раз создаете новый путь? В противном случае вы заметите холст дорожками, что, конечно, имеет недостаток в производительности. - person pimvdb; 30.09.2011
comment
@Venatu: я установил простой счетчик кадров в секунду; у меня он работает со скоростью 62 кадра в секунду, что соответствует моей частоте экрана: jsfiddle.net/eGjak/125 . Вы испытываете то же самое? - person pimvdb; 30.09.2011
comment
@pimvdb Я сохранял и восстанавливал. Он отлично работал в сафари и теперь работает в хроме, я немного изменил порядок. Я думаю, что я не правильно распределял свои розыгрыши. Спасибо за ответы, очень признателен! Только что увидел второй комментарий, я ограничил свой до 30, но я ожидаю, что сейчас получу примерно то же самое. - person Venatu; 30.09.2011

Нарисуйте пользовательский интерфейс на другом холсте. При необходимости вы можете наслаивать элементы холста.

HTML

<div id="gameframe">
    <canvas id="game-ui"></canvas>
    <canvas id="game"></canvas>
</div>

CSS

#gameFrame { position: relative; width: 800px; height: 800px;}
#game-ui { position: absolute; z-index: 10; bottom: 0; left; 0; height: 50px; width: 100%;}
#game { position: absolute; z-index: 5; height: 100%; width: 100%;}

Урожайность

-------------------------------------------------------
-                                                     -
-                                                     -
-                                                     -
-                <canvas id="game">                   -
-                                                     -
-                                                     -
-                                                     -
-                                                     -
-------------------------------------------------------
-               <canvas id="game-ui">                 -
-------------------------------------------------------
person Chris G.    schedule 29.09.2011

При создании игр на холсте я всегда размещал графический интерфейс поверх холста игры.

#ui{position: fixed; margin-left: auto; margin-right: auto; z-index: 1000; width: 500; height: 500}
#game{position: fixed; margin-left: auto; margin-right: auto; z-index: 999}

<div id="ui"><!--UI elements--></div>
<canvas id="game" width="500" height="500"></canvas>

Очевидно, вы можете наложить другой холст поверх или создать пользовательский интерфейс с использованием элементов html.

person Jack    schedule 29.09.2011