html5 <canvas>частота кадров - PullRequest
       5

html5 <canvas>частота кадров

11 голосов
/ 10 сентября 2010

Я думал о создании игры, использующей javascript для игровой логики и элемент HTML5 canvas для анимации рисунка. Моя цель - написать то, что работает в браузерах и на новых смартфонах. Поэтому я написал быструю программу, которая перемещает 100 кругов по экрану и показывает частоту кадров. Я был довольно разочарован результатами: Chrome: ~ 90 FPS Firefox: ~ 25 FPS iPhone: ~ 11 FPS

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

Редактировать Вот код:

var ctx;
var width;
var height;
var delta;
var lastTime;
var frames;
var totalTime;
var updateTime;
var updateFrames;
var creats = new Array();

function init() {
    var canvas =document.getElementById('main');
    width = canvas.width;
    height = canvas.height; 
    ctx = canvas.getContext('2d');
    for(var i=0; i < 100; ++i) {
        addCreature();
    }
    lastTime = (new Date()).getTime();
    frames = 0;
    totalTime = 0;
    updateTime = 0;
    updateFrames =0;
    setInterval(update, 10);
}


function addCreature() {
    var c = new Creature(Math.random()*100,Math.random()*200);
    creats.push(c);
}

function update() {
    var now = (new Date()).getTime();
    delta = now-lastTime;
    lastTime = now;
    totalTime+=delta;
    frames++;
    updateTime+=delta;
    updateFrames++;
    if(updateTime > 1000) {
        document.getElementById('fps').innerHTML = "FPS AVG: " + (1000*frames/totalTime) + " CUR: " + (1000*updateFrames/updateTime);
        updateTime = 0;
        updateFrames =0;
    }

    for(var i=0; i < creats.length; ++i) {
        creats[i].move();
    }

    draw();
}

function draw() {
    ctx.clearRect(0,0,width,height);
    creats.forEach(drawCreat);
}

function drawCreat(c,i,a) {
    if (!onScreen(c)) {
        return;
    }
    ctx.fillStyle = "#00A308";
    ctx.beginPath();
    ctx.arc(c.x, c.y, 10, 0, Math.PI*2, true); 
    ctx.closePath();
    ctx.fill();
}

function onScreen(o) {
    return o.x >= 0 && o.y >= 0 && o.x <= width && o.y <=height;
}

function Creature(x1,y) {
    this.x = x1;
    this.y = y;

    this.dx = Math.random()*2;
    this.dy = Math.random()*2;

    this.move = function() {
        this.x+=this.dx;
        this.y+=this.dy;
        if(this.x < 0 || this.x > width) {
            this.dx*=-1;
        }
        if(this.y < 0 || this.y > height) {
            this.dy*=-1;
        }
    }

}

init();

Ответы [ 6 ]

6 голосов
/ 11 июля 2011

Чтобы сделать анимацию более эффективной и синхронизировать частоту кадров с обновлениями пользовательского интерфейса, Mozilla создала функцию mozRequestAnimationFrame () , предназначенную для устранения неэффективности setTimeout () и setInterval (). С тех пор этот метод был принят Webkit только для Chrome.

В феврале 2011 года Пол Айриш опубликовал shim , который создал requestAnimFrame (), а вскоре после этого Джо Ламберт продлил его , восстановив задержки "timeout" и "interval" для замедления анимационные тики.

Во всяком случае, я использовал оба и видел очень хорошие результаты в Chrome и Firefox. Шим также возвращается к setTimeout (), если поддержка requestAnimationFrame () недоступна. Код Пола и Джо онлайн на github .

Надеюсь, это поможет!

5 голосов
/ 10 сентября 2010

Это в значительной степени зависит от движка JavaScript.V8 (Chrome) и Carakan (Opera), вероятно, два самых быстрых двигателя производственного качества.TraceMonkey (Firefox) и SquirrelFish (Safari) сильно отстают, а KJS поднимается сзади.Это изменится, когда аппаратное ускорение войдет в мейнстрим.

Что касается конкретных оптимизаций, нам, вероятно, придется увидеть некоторый код.Помните, что холст поддерживает компоновку, поэтому вам действительно нужно перерисовывать только измененные области.Возможно, вам следует повторно запустить тест без холста, чтобы вы знали, действительно ли операции рисования были ограничивающим фактором.

Если вы хотите увидеть, что можно сделать сейчас, проверьте:
js1k
Беспин
Canvas-stein

2 голосов
/ 27 ноября 2011

Дуги математически интенсивны для рисования.Вы можете значительно повысить производительность, используя drawImage или даже putImageData вместо рисования пути каждого кадра.

Изображение может быть файлом, загруженным из URL-адреса, или изображением, созданным путем рисования на отдельном холсте, невидимымпользователю (не подключенному к DOM).В любом случае вы сэкономите массу процессорного времени.

1 голос
/ 10 сентября 2010

Я написал простой прыгающий мяч, который дает вам очки, если вы нажмете на него.

Отлично работает в Firefox, Safari, Chrome и на iPad. Тем не менее, iPhone 3G / 3GS был ужасно медленным с этим. То же самое касается моего старого телефона Android.

Извините, но у меня нет конкретных номеров.

0 голосов
/ 10 сентября 2010

Существует множество оптимизаций для рисования на холсте.

У вас есть пример кода, которым вы можете поделиться?

0 голосов
/ 10 сентября 2010

Chrome - единственный браузер, с которым я видел результаты с высокой частотой кадров.

Возможно, вы также захотите попробовать последнюю версию IE9. Это должно дать вам достойную оценку того, как браузеры следующего поколения (с аппаратным ускорением для HTML5) будут обрабатывать ваш код.

До сих пор я видел, что IE9, Chrome 7 и Firefox 4 будут иметь некое аппаратное ускорение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...