28.01.2021, 09:34
|
Аспирант
|
|
Регистрация: 06.02.2011
Сообщений: 54
|
|
Оптимизация самый быстрый вывод текста
Есть массив с координатами, обновляется движением мыши, то есть двигается на экране мышью. вобщем суть в том что на экран выводятся текстовые поля с координатами, за раз в крайних случаях 100 - 200 тысяч текстовых полей. причем текст с фоном, пробовал три варианта, самым медленным был SVG, далее HTML(span), и самый быстрый Canvas, но всеравно тормозит, какой самый быстрый способ вывода текстовых полей вы знаете? Текстовые поля с фоном, полей порядка 100 - 200 тысяч, каждое поле при каждом смещении, меняет свой текст и координаты.
Вот пример части самого быстрого кода.
// arr_c_g[i] = [x, y, text]; arr_c_g.length примерно 100000
// width_t_2 = width_t / 2;
// height_t_2 = height_t + 2;
let out_text = () => {
context.clearRect(0, 0, width, height);
context.fillStyle = "#fff";
for(let i = 0; i < arr_c_g.length; i++)context.fillRect(arr_c_g[i][0] - width_t_2, arr_c_g[i][1] - height_t, width_t, height_t_2);// Фон
context.fillStyle = "#000";
for(let i = 0; i < arr_c_g.length; i++)context.fillText(arr_c_g[i][2], arr_c_g[i][0], arr_c_g[i][1]);// текст
};
Есть ли чтонибудь быстрее?
|
|
28.01.2021, 10:42
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от RX200
|
в крайних случаях 100 - 200 тысяч текстовых полей.
|
"текстовые поля" - это просто прямоугольнички с текстом, а не <input type="text" /> , которые пользователю надо заполнять? ))) Самый быстрый вывод на экран - webgl.
но подозреваю, что далеко не все поля видны на экране. Надо определять, какие не видны, и их не рисовать, наверно так.
|
|
28.01.2021, 10:51
|
Аспирант
|
|
Регистрация: 06.02.2011
Сообщений: 54
|
|
те которые невидны итак не выводятся, там масштабирование, наверное придется лимит ставить, при некотором масштабе, или фон выводить только, пока не решил как. За webgl спасибо, попробую в нем реализовать посмотрю что будет.
|
|
28.01.2021, 15:05
|
Аспирант
|
|
Регистрация: 06.02.2011
Сообщений: 54
|
|
Сообщение от Alexandroppolus
|
Самый быстрый вывод на экран - webgl.
|
Почитал про технологию, это сразу много способов добавления текста, причем достаточно сложных, нужно или библиотеки в которых непонятно что, или лезть на уровень ниже. Читал тут и тут. Везде если можно обойтись без 3д рекомендуют использовать тот способ который я щас использую. По этому хочу уточнить, именно для моей задачи какой способ WebGL подойдет лучше?
|
|
28.01.2021, 21:15
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
RX200, вы существенно можете выиграть в производительности, если будете рисовать фон и текст не в разных циклах, а в одном.
Любая технология покажется недостаточно хорошей, если пользоваться ею... неправильно.
|
|
29.01.2021, 02:03
|
Аспирант
|
|
Регистрация: 06.02.2011
Сообщений: 54
|
|
Сообщение от Nexus
|
RX200, вы существенно можете выиграть в производительности, если будете рисовать фон и текст не в разных циклах, а в одном.
|
то есть в теле цыкла будет еще и.
context.fillStyle = "#fff";
и
context.fillStyle = "#000";
при каждой интеракции? или как?
Протестировал в Mozilla Firefox примерно на 30% стало медленнее, если в одном цикле.
Последний раз редактировалось RX200, 29.01.2021 в 02:54.
|
|
29.01.2021, 07:27
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,744
|
|
Не знаю всех условий задачи, но если эти прямоугольники с текстом могут пересекаться, то только в одном цикле и надо делать.
Какой у вас получается порядок цифр (времени) при выводе 100000? Сколько на одну итерацию?
|
|
29.01.2021, 12:57
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
Сообщение от RX200
|
наверное придется лимит ставить, при некотором масштабе, или фон выводить только
|
да, в эту сторону думать. Вообще, как я понял по коду, все рамки одного размера? Как вообще это выглядит? они выстраиваются в сетку? или одни рамки могут быть поверх других?
и как происходит обновление массива движением мыши? все поинты обновляются? меняется ли текст? Возможно, перерисовывать надо только часть экрана
|
|
29.01.2021, 13:30
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,584
|
|
И все эти 100 - 200 тысяч полей видны и читабельны для юзаера одновременно? Сомневаюсь.
Если есть те которые не видны - не выводить их.
Если есть те которые не читабельны - не выводить в них текст.
А по поводу того что webgl - сложна, так само собой: максимальная оптимизация за пределами стандарта - всегда сложно. И библиотеки тут как раз не нужны - нужно именно написание низкоуровневого кода максимально заточенного под задачу без излишеств и абстракций.
__________________
29375, 35
Последний раз редактировалось Aetae, 29.01.2021 в 13:34.
|
|
30.01.2021, 02:08
|
Аспирант
|
|
Регистрация: 06.02.2011
Сообщений: 54
|
|
Сообщение от Alexandroppolus
|
да, в эту сторону думать. Вообще, как я понял по коду, все рамки одного размера? Как вообще это выглядит? они выстраиваются в сетку? или одни рамки могут быть поверх других?
и как происходит обновление массива движением мыши? все поинты обновляются? меняется ли текст? Возможно, перерисовывать надо только часть экрана
|
Да при движении мыши обновляется и массив координат, и тексты. причем координаты в массиве это не + смещение мыши, а сложные вычисления.
Да сетка, рамки не могут быть по верх других, ну или незначительно, там перед цыклами масштаб настраивается, вобщем в итоге сделал что если шрифт в context.font становится меньше 5 то не отображаются, текст исчезает. Это крайней случай когда пользователь нажмет отображать текст на мелком масштабе, но щас единственное что мне не нравится, это если нажмет отображать текст при мелком масштабе, то ни чего не изменится, то есть будет выглядеть словно кнопка не работает. но при увеличении масштаба текст появится. В общем, в целом пока задача решена так.
Насчет, webgl или opengl, я давно еще до их появления работал с o3d, скорее всего справились бы с задачей, но сложны в настройки, и по времени много займет написание кода, так что пока их не стану использовать, в будущем если время будет может на них переделаю.
Последний раз редактировалось RX200, 30.01.2021 в 03:18.
|
|
|
|