Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Chart: быстрая прорисовка (https://javascript.ru/forum/dom-window/37336-chart-bystraya-prorisovka.html)

sitesv 16.04.2013 10:56

Chart: быстрая прорисовка
 
Доброго дня, форумчане!
Нахожусь в поиске компонента/технологии для веб-странички, для отображения порций по 1024 точки со скоростью 2 раза в секунду... Попробовал компонент Scatter Chart от Wijmo, но одна итерация прорисовки с отключенной анимацией и др. занимает около 2-3 секунд, это очень много... Предполагаю, что с другими виджитами такая же проблема.
Подскажите, что я могу использовать что своей цели?
Заранее спасибо!

animhotep 16.04.2013 16:51

Vanilla JS, либо обновлять всю страницу/фрейм каждых 2сек

Aetae 16.04.2013 19:19

<body>
<script type="text/javascript">var canvas = document.createElement('canvas');
canvas.setAttribute('width',32);
canvas.setAttribute('height',32);
var div = document.createElement('div');
document.body.appendChild(canvas);
document.body.appendChild(div);

var ctx = canvas.getContext('2d'),
        imageData = ctx.createImageData(32,32),
        data = imageData.data,
        l = 1024* 4;
(function randomDraw(){
    var i = l, time = Date.now();
    while(i--) data[i] = Math.floor(Math.random()*256);
    ctx.putImageData(imageData,0,0);

    div.innerHTML = 'Скорость отрисовки: ~' + (-time + (time = Date.now())) + 'ms';
    setTimeout(randomDraw,50)
}())</script>
</body>

sitesv 20.04.2013 14:11

Спасибо за код.
Но он у меня почему-то не работает :(

Aetae 20.04.2013 22:58

sitesv, ff, chrome, ie9 - работает.

sitesv 21.04.2013 00:54

Круто! Работает!! СПАСИИИБО! :)
А есть ли возможность прорисовывать именно по координатам [x,y] черные точки, ну конечно, пиксель маловато, побоооольше бы размер? :)

Aetae 21.04.2013 01:02

Сказано было 1024 - сделано было 1024.(32х32)

Возмржность есть, читайте информацию по canvas - там всё элементарно.

Немного упростил:
<body>
<script type="text/javascript">
var canvas = document.createElement('canvas');
    canvas.setAttribute('width',332); //задаём ширину
    canvas.setAttribute('height',132); //задаём высоту(размер изменяется в данном случае только здесь, потому можете ставить любые значения)
    canvas.setAttribute('style', 'float:left');
var div = document.createElement('div');
document.body.appendChild(canvas);
document.body.appendChild(div);
 
var ctx = canvas.getContext('2d'),
        imageData = ctx.createImageData(canvas.width,canvas.height),
        data = imageData.data, //массив всех точек изображения r,g,b,a ,r1,g1,b1,a1 ... 
        l = data.length;
(function randomDraw(){
    var i = l, time = Date.now();
    while(i--) {
        data[i] = Math.floor(Math.random()*256); //по порядку каждому каналу каждой точки изображения ставим произвольное значение 0...255
    }

    ctx.putImageData(imageData,0,0);
 
    div.innerHTML = 'Скорость отрисовки: ~' + (-time + (time = Date.now())) + 'ms';
    setTimeout(randomDraw,50)
}())</script>
</body>


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

sitesv 21.04.2013 01:03

Спасибо еще раз! :) Буду читать :)

sitesv 21.04.2013 18:16

Небольшой вопрос: а почему Вы ставите скобку перед function и ()) перед </script>
Без них не работает, но я не вижу к чему они относятся

Hekumok 21.04.2013 22:10

sitesv, функция с вызовом на месте


Часовой пояс GMT +3, время: 04:00.