Как сделать?
…
Доброго времени. У меня вопросы не характера как сделать, а можно ли сделать. Но для начала подводка, зная максимальное кол-во данных в массиве на бумаге, как много можно запихать данных в один мосив, чтобы не сильно страдал и не перегружался плеер. С первой частью закончили. Теперь к вопросу. Можно ли сделать рабочий, не через костыли код с подгрузкой данных в массив. Хочу перелопатить 25x15 немного в открытый, так сказать бесшовный мир. Но с теми размерами видимого поля что есть. Я думал на определённых точках сделать погрузку в масив через dynamic, но вскакивает проблема, персонаж скачет с одной точки поля в другую. Так же пытался сделать что-то типо дальности отрисовки, заранее погдотавливая данные карты в масив, но тут опять же возвращаемся к проблеме, с размером карты которую я затеял с собственно с таким кол-во данных, думаю что плеер не справиться, учитывая что для отрисовки я использую колоссальное кол-во html. И в конце уже хочется совета, как это было бы удобно игрокам. 1-е Полностью, на сколько это возможно открытый мир. 2-е Открытый мир, но с немного урезанной бесшовностью, впрочем как есть сейчас. И 3-е я подумывал расширить в 2, 3 раза размеры локаций с добавлением поле зрения. И при таком варианте, я пологаю можно достичь той бесшовности, которую я хочу, но опять же тут упирается в возможности кол-ва данных в масиве и к возможности подгрузки данных (иногда нескольких) в массив.
n3m0,
Это все какие-то абстрактные вопросы. Массив может содержать 2 миллиарда ячеек. Работать с количеством в 100 000 будет нормально. HTML знатно тупит на отрисовке в 5.7.0.
А вот что ты собираешься хранить в массиве, как с ним работать, как рисовать - это уже другие вопросы. Экспериментируй.
Например, таблицу в 5000 ячеек через *р плеер не вытягивает, а через текстовую переменную уже может.
Спасибки. Этой информации мне предостаточно. Согласен что вопросы не корректные
Не могу правильно сформулировать. Спасибо за ответ. Буду пробовать разное.
n3m0,
вообще, есть различные методы оптимизации, которые можно почерпнуть банально из роликов на ютубе по 3D-графике в играх. Например, что тебе не нужно хранить всю карту в одном массиве, а лишь только видимую часть. А ещё, что при изменении местоположения персонажа, ты можешь уничтожать ту часть карты, которая больше не видима, и добавлять только видимую (при этом тебе даже весь массив не нужно перезаполнять по новой). Непосредственно заполнение, генерацию карты, можно разнести во времени с помощью локации-счётчика. Т.к. присвоение ячейкам массива значений жрёт очень много времени, заполнять скажем по 1000-5000 клеток карты за проход каждые 500 м.с. не создаст видимой задержки для игрока, а вот 10000-100000 ячеек уже будут подвешивать плеер (именно на этапе присвоения значений).
Aleks Versus,
Спасибо за совет по оптимизации. Я когда думал над, так называемом полем зрением персонажа, я руководствовался, уничтожением невидимой частью карты, но одновременно с этим массив с данными карты заполнялся полностью заранее и данные в нем не переписывались. После когда, стал делать перезаписываемый по частям массив, при помощи dynamic, на вырисовываемой карте начали поступать артефакты, но суть не в этом. Хотелось узнать, как эффективнее можно переписывать данные массива без тормозов и ещё, я понимаю что это лучше понять на практике, но как долго по времени, примерно, будет откликаится плеер если данные массива содержат в себе HTML теги выводимые с помощью *p. И последний вопрос интересующий вопрос. Если в одном массиве будет например 2000строк данных, заранее прописанных в нем, то будут ли просадки в скорости чтения данных массива если мне нужно из него несколько сотен данных.
Прошу прощения за большое количество воды
n3m0,
Подумай, как избавится от динамика.
n3m0,
я не видел зависимости между объёмом записываемых в массив данных и просадками. Хотя можно устроить небольшой тест и прогнать циклом заполнение 100 тыс элементов массива простыми числами и строками текста в пару тысяч символов и посмотреть на разницу в скорости заполнения.
Я пока что не совсем понимаю, зачем записывать данные в массив с помощью dynamic. dynamic обычно используют, когда нужно сам код сгенерировать, но оправданность его применения я без кода оценить не смогу.
n3m0:
как долго по времени, примерно, будет откликаится плеер если данные массива содержат в себе HTML теги выводимые с помощью *p
А вот тут надо чётко понимать, что ты имеешь дело с двумя совершенно разными типами задержки. И об этом сказал выше dmvikar. Когда выполняется код QSP - плеер тратит время только на его выполнение. Даже оператор *p съедает не так уж много времени, поскольку он работает с обычным текстом. Более того, все операторы вывода текста на самом деле не выводят текст, а только отправляют его в специальный буфер, из которого рендер плеера уже этот текст забирает и выводит на экран. Если у тебя до кучи включён html-рендер (usehtml = 1), то плееру дополнительно нужно обработать текст из буфера перед выводом на экран, и вот тут уже появляется вторая задержка. Если у тебя много html-кода при выводе на экран, то ты заметишь, что отрисовка подтормаживает игру. И уже не важно, в массиве твоя разметка записана, или просто в виде строки ты её выводишь, это будет подвешивать вывод.
То есть при работе с картой тебе нужно учитывать:
* скорость выполнения кода (большие многоуровневые циклы и множество операций присваивания подвешивают выполнение кода)
* скорость обработки HTML-разметки рендером (много HTML-кода подвешивает вывод на экран).
Для классического плеера последнее очень критично, а вот для qSpider уже не так. Там более быстрый браузерный HTML-рендер.
Отсюда вывод: нужно уменьшать число циклов в коде до минимума, и нужно уменьшать объёмы HTML-разметки.
В идеале с твоим проектом нужно переходить на qSpider. Он работает на qsplib версии 5.8.0, где есть настоящие циклы, которые сразу делают прирост производительности в 1,5-2 раза даже без сокращения количества циклов. А ещё у qSpider полностью браузерный HTML-рендер, который отрисовывает экран гораздо быстрее классического плеера.
Aleks Versus,
Спасибо за столь развёрнутый ответ и советы. Только у меня появился ещё один вопрос. Qspider сильно отличается от классического плеера? В том плане что, есть ли что-то ещё что нужно изучать по мимо того что есть в классическом плеера. Просто я не углублялся в другие плееры и не знаю всех, так сказать подводных камней. Сейчас подумываю перепрыгнуть на другой Qspider, но мне кажется, просто копипастнуть мой код и чтобы он работал не получиться. Это пока единственное что меня останавливает. Ещё раз спасибо.
n3m0,
Запусти и проверь). Делов-то! В основном будет проблема в форматировании, т.к. есть некоторые различия по тексту и таблицам.
Заходи в дискорд. Там легче общаться.
n3m0,
есть некоторые отличия в qSpider от классики 5.7.0, но их не так уж много. В плане кода все отличия перечислены в этой статье https://vk.com/@qsplayer-novovvedeniya-v-qsp-580
Проверил внесение данных в массив. Разница есть, и большая. Для чисел на 100 тыс элементов заполнение массива занимает у меня 250-300 мс. Фрагментом текста в 2000 знаков - 1600-1800 мс. Фрагментом текста в 4000 знаков - 3000-3200 мс. Это довольно медленно. Если есть возможность избегать заполнения таким объёмом данных, то лучше избегать.
Оффтоп: Самое обидное, что присваивания переменным кортежей из двадцати элементов дают такую же задержку, как строка в 2000 знаков. Более того. Если вместо кортежа просто присваивать подобную строку переменной, или ячейке массива, это происходит в пять раз быстрее. (
webp есть возможность использовать? из 3 GB графики в webp 700 MB
Дамир Белялов,
если проверяешь в 5.8.0 и не пашет, значит в dynamic передаёшь неверный код. У меня твой цикл работает:
max_Y = 10
max_X = 10
$src_gen_sym = {*pl $str(y_a) + ':' + $str(x_a)}
loop y_a=1 while y_a<=max_Y step y_a+=1:
loop x_a=1 while x_a<=max_X step x_a+=1:
dynamic $src_gen_sym
end
end
Понимаешь, ошибка выдается на строчке со словом “loop”. Меня напрягает, что это слово даже не подсвечивается синим, как у остальных операторов. Вот полное содержимое моей локации:
! Общая генерация границ мира
max_X[1]=24 & !допустим это максимальные границы карты №1
max_Y[1]=24
x_a=1
y_a=1
!Случайное наполнение
$scr_gen_sym={
type_sym=rand(1,5)
if type_sym=1: $x[x_a,y_a,map,'символ']='<font color="gray">.</font>' & $x[x_a,y_a,map,'описание']='камушки' & $x[x_a,y_a,map,'тип']='поверхность'
if type_sym=2: $x[x_a,y_a,map,'символ']='.' & $x[x_a,y_a,map,'описание']='пол' & $x[x_a,y_a,map,'тип']='поверхность'
if type_sym=3: $x[x_a,y_a,map,'символ']='ш' & $x[x_a,y_a,map,'описание']='куст' & $x[x_a,y_a,map,'тип']='поверхность'
if type_sym=4: $x[x_a,y_a,map,'символ']='Т' & $x[x_a,y_a,map,'описание']='дерево' & $x[x_a,y_a,map,'тип']='стена'
if type_sym=5: $x[x_a,y_a,map,'символ']='.' & $x[x_a,y_a,map,'описание']='пол' & $x[x_a,y_a,map,'тип']='поверхность'
}
loop y_a=1 while y_a<=max_Y step y_a+=1:
loop x_a=1 while x_a<=max_X step x_a+=1:
dynamic $scr_gen_sym
end
end
