Проблема с производительностью за пределами экрана в Firefox - PullRequest
3 голосов
/ 27 ноября 2011

У меня следующая проблема, и я считаю, что, должно быть, я делаю что-то глупое, но я не могу ее найти. (Это в Firefox 8)

Я беру большой файл спрайта, создаю новый маленький холст, в котором будет храниться только одна плитка этого спрайта, а затем использую базовую перегрузку drawImage, чтобы нарисовать эту изолированную плитку сотнями. мест в моем "экранном" холсте.

Я делаю это вместо того, чтобы просто использовать последнюю перегрузку drawImage, которая занимает только часть большего файла спрайта. Избавившись от этого ограничения, в Chrome, к моему удивлению, прирост производительности составил около 10%. Однако в Firefox частота кадров падает с 300 до 17 кадров в секунду.

Итак, по сути, я вижу, что рисование «с изображения на холст» примерно в 20 раз быстрее, чем рисование «с холста на холст» в Firefox.

Это правильно? Я не нашел никакой информации по этому конкретному случаю, но именно это я вижу в своих тестах.

Кроме того, этот код я использую. Я делаю что-нибудь невероятно глупое?

function Test5() {
    var imgSprite = $('imgSprite');
    var tileCanvas = document.createElement("canvas");
    tileCanvas.width = 64; tileCanvas.height = 31;
    var tileCtx = tileCanvas.getContext("2d");
    tileCtx.drawImage(imgSprite, 0, 0, 64, 31, 0, 0, 64, 31);

    //--------------------------------------
    var ctx = getContext('mainScreen');

    ctx.fillStyle = '#fff';

    time(function() { // time will run this function many times and time it
        ctx.fillRect(0,0, 1200,900);
        var x=0, y=0, row = 0;
        for (var i=1; i < 1000; i++) {
            ctx.drawImage(tileCanvas, x,y); // <-- this is the line I care about
            // some simple code to calculate new x/y
        }
    }, 1000, "Test5", 'Drawing from an individual tile canvas, instead of a section of big sprite');
}

Если вместо

 ctx.drawImage(tileCanvas, x,y);  

Я делаю:

 ctx.drawImage(imgSprite, 0, 0, 64, 31, x, y, 64, 31);  

Это в 20 раз быстрее

Я что-то здесь упускаю?


РЕДАКТИРОВАТЬ: Спросив об этом, я сделал для себя небольшую страницу, чтобы протестировать несколько разных вещей на разных платформах и посмотреть, как лучше всего сделать что-то на каждой.

http://www.crystalgears.com/isoengine/jstests3-canvas.html

Мне жаль, что код ужасно уродлив, это был быстрый взлом, не предназначенный для того, чтобы его увидели другие или даже я через несколько дней.

1 Ответ

1 голос
/ 27 ноября 2011

Трудно быть уверенным без профилирования (особенно с вашими конкретными изображениями и, возможно, с вашей конкретной видеокартой + драйвером), но вы можете нажать https://bugzilla.mozilla.org/show_bug.cgi?id=705559

Конечно, эта ошибка должна вызывать drawImage с <canvas> аргумент должен быть несколько медленнее;хотя в 20 раз медленнее, это очень удивительно (отсюда и «май»).

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