Подтвердить что ты не робот

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

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

Это был довольно простой тест, поэтому мне не нравятся мои шансы, когда дело доходит до полной игры. Это стандартный результат из элемента 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();
4b9b3361

Ответ 1

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

В феврале 2011 Paul Irish опубликовал прокладку, которая создала requestAnimFrame(), и вскоре после этого Joe Lambert расширил его, восстановив задержку "тайм-аут" и "интервал", чтобы замедлить тики анимации.

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

Ответ 6

Там будет множество оптимизаций с использованием холста.

Есть ли у вас пример кода, который вы могли бы поделиться?