23.07.2019, 23:55
|
Интересующийся
|
|
Регистрация: 11.06.2017
Сообщений: 15
|
|
Как добавлять элементы в типизированный массив?
Оказывается, push() с типизированными массивами не работает, присваивание по новому индексу тоже ничего не дает. Количество элементов заранее неизвестно. Как быть?
my_bf=new Uint8Array(0);
my_bf[0]=1;
my_bf[1]=2; // для примера только 2 элемента
alert(my_bf.length); // длина осталась = 0
В крайнем случае можно подготовить данные в Array, а затем сконвертить в байты, но это потребление лишней оперативки (минимум в 4 раза больше), а количество элементов может доходить до сотни лямов и плюс лишнее действие на конвертирование, старые компы могут не потянуть, не говоря об телефонах.
|
|
24.07.2019, 10:40
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Uint8Array - это непрерывный кусок памяти. Его нельзя увеличивать. Так исторически сложилось, причём задолго до появления js. Единственный способ его "увеличить" - это создать новый, более крупный кусок, и скопировать данные из старого куска, старый передать сборщику мусора. В твоём случае, когда данные появляются постепенно, оптимальной будет стратегия с удвоением размера буфера - дополнительных издержек выходит где-то на 2N по памяти и примерно столько же копирований.
А вообще - какая задача? Нафига понадобилось все данные в массив запихнуть?
|
|
24.07.2019, 16:59
|
Интересующийся
|
|
Регистрация: 11.06.2017
Сообщений: 15
|
|
SuperZen,
Вчера смотрел эту публикацию, перед созданием темы. Поскольку типизированный массив не может создаться внезапно, Иттератор в данном случае будет заполнять обычный массив, (32бита на элемент, по-умолчанию) а потом перенесет все в байтовый. Вариант некрасивый.
Alexandroppolus,
Была мысль вообще создать 2-мерный массив с небольшими блоками по 16-32 байта и добавлять очередной блок по достижении границы... Некрасиво все это, в итоге вообще выйдет 4-мерный массив )))
* обрабатываю картинку, теоретически не более 50мпх (примерно на этом размере 32-битный фаяфокс-49 начинает подвисать. На выходе у меня 16 вариантов цветового решения на выбор пользователю, у каждого варианта до 16 (может уменьшу до 8) подвариантов конечной обработки. Уже 2-мерный массив, и еще помножить на список блоков, вот 4-мерность и получается ))))
|
|
24.07.2019, 17:17
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от NiOl
|
обрабатываю картинку, теоретически не более 50мпх (примерно на этом размере 32-битный фаяфокс-49 начинает подвисать.
|
ты это в браузере делашь, через канву? Но тогда у тебя данные уже в бинарном массиве - getImageData возвращает структурку с таким массивом. Зачем ещё один массив?
|
|
25.07.2019, 13:22
|
Интересующийся
|
|
Регистрация: 11.06.2017
Сообщений: 15
|
|
В "канве" превьюшки, данные отдельно )))
Пока склоняюсь к списку блоков по 256 байт. Нет времени попробовать.
|
|
25.07.2019, 13:45
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
Сначал
Сообщение от NiOl
|
Количество элементов заранее неизвестно.
|
Потом
Сообщение от NiOl
|
* обрабатываю картинку, теоретически не более 50мпх
|
Проще сначала посчитать сколько надо и создать уже готовый вариант
new Uint8Array(x*y)
|
|
25.07.2019, 14:54
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от NiOl
|
данные отдельно
|
и откуда берутся эти данные? просто интересно, как можно получить данные по пикселям изображения, причем не в виде бинарного массива, да ещё и таким образом, чтобы на момент получения первого пикселя было неизвестно, сколько их всего. Мутная какая-то история.
|
|
01.08.2019, 00:14
|
Интересующийся
|
|
Регистрация: 11.06.2017
Сообщений: 15
|
|
Сообщение от Alexandroppolus
|
и откуда берутся эти данные? просто интересно, как можно получить данные по пикселям изображения, причем не в виде бинарного массива, да ещё и таким образом, чтобы на момент получения первого пикселя было неизвестно, сколько их всего. Мутная какая-то история.
|
Главное, чтоб не криминальная )))
Мучаю конвертор графики под одну ретросистему. Пытаюсь не только в палитру попасть (это вроде получилось), но и хоть как-то поджать данные, ибо места на конечном устройстве мало. Отсюда и неизвестный заранее размер.
Уже выловил кучку ошибок, потом вспомнил, что хотел поставить "use strict" и понеслась новая партия исправлений... потом обнаружил, что 43й ФФ не поддерживает "let" (на одном из объектов приходится сидеть на старом компе с 512МБ ОЗУ)...
По ходу правок уже планирую некоторые моменты переделать с нуля.
|
|
01.08.2019, 11:32
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 641
|
|
Сообщение от NiOl
|
потом обнаружил, что 43й ФФ не поддерживает "let"
|
...
Run your index.html in various browser such as Chrome,Firefox and Edge Browser, if your getting error message means the browser is not accepting ES6 javascript
So we have to convert our ES6 into ES5 script format.
How ??
We have use babel for converting ES6 to ES5....
взял тут https://medium.com/@zural143/basic-w...l-dc66e72c86c6
|
|
|
|