а зачем усложнять? надо сразу на ASM писать карту, языки для слабых
а по пути удалить WE, JNGP, VSCode, UjAPI, просмотровщики моделей и прочие джас хелперы с блендерами
вот результаты тестов:
по общему впечатлению карта с глобалками на промежутке 40~50 фпс работает на пару фпс ниже-выше (прыжками туда сюда), сложно отловить, но тренд небольшой есть на обоих проверках
в целом - отличий на высоких фпс практически нет, зато как только фпс начинают падать - так сразу появляется небольшой выйгрыш на 5-10 фпс перед предсмертной агонией, т.е. небольшой выйгрыш таки есть, цена этому - сотня замен по всему коду и при выходе новых версий временнозатратно будет их патчить
goodlyhero: В целом, вместо ренжа 200 вам хватит и 128
перепроверил с радиусом 128, а также выключил -pro режим, который был включен при первом (с радиусом 200) тесте и съедал фпс на себя
итоговые результаты поразительны - количество коллизий уменьшилось в 3 раза, а максимальное количество коробок стало в 2 раза выше
и если в оригинальном виде - было под 80000 просчётов коллизий и максимум 8 объектов (не путать с 1ым графиком, там чуть щадящая система оценки была и можно сдвинуть на 1 влево)
то в enum128 варианте - происходит только 35000 просчетов коллизий, и макс 15 объектов, что уже ощутимо вырывается по отличиям
мало того, эта система еще и гибкая - т.е. в реальных игровых условиях результаты будут еще чуть лучше, потому что многие объекты стоят отдельно на уровне а не в единой цепочке с остальными
с имеющимся кодом и лимитами варика - думаю осталось два путя:
1 - оптимизировать MushroomMoving_RectCondition, там по 3 раза вызывается MushroomMoving_CollisionCheck на каждый чих а не по 1 и есть шанс еще в 3 раза повысить производительность без потери текущей физики
2 - как предложил Daro делать на триггерах вхождения юнитом в регион (на карте подобная система уже присутствует при нырянии в воду)
возможно есть и другие методы, а также те люди, кто в будущем захочет этим заняться и довести максимальное количество объектов до 50, как и задумано в карте с лабораторией - заспавнить 50 коробок
пожалуй заберу метод с радиусом как облегчение игрокам с низкими фпс
тем более что картоделы тоже страдают от этого лимита коробок, поэтому на карте больше 7+6=13 объектов обычно не появляется
function UnitIndex takes unit u returns integer
local integer i=1
loop
exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
if u==OrangeMushroom[i] then
set u=null
return i
endif
set i=i+1
endloop
set u=null
return 0
endfunction
function MushroomMoving_CollisionCheck takes integer i,real x,real y returns boolean
local integer j=1
local real otherx
local real othery
local group G = CreateGroup()
local unit u=null
if LevelClearState[i]==false then
call GroupEnumUnitsInRange(G, x,y, 128, null)
loop
set u = FirstOfGroup(G)
exitwhen u==null
if MB_Frame_On==1 then
set MB_CollisionY = MB_CollisionY+1
endif
if u!=OrangeMushroom[i] then
set j=UnitIndex(u)
set otherx=GetUnitX(OrangeMushroom[j])
set othery=GetUnitY(OrangeMushroom[j])
if (GetPlayerSlotState(GetOwningPlayer(OrangeMushroom[j]))==PLAYER_SLOT_STATE_PLAYING or j>PLAYER_MAXINUM) then
if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
if PropellyCondition==true then
if GetUnitTypeId(OrangeMushroom[j])!='orai' then
set u=null
call DestroyGroup(G)
set G=null
set Frame_MainPlayerY=j
return false
endif
else
set u=null
call DestroyGroup(G)
set G=null
set Frame_MainPlayerY=j
return false
endif
endif
endif
endif
call GroupRemoveUnit(G, u)
endloop
call DestroyGroup(G)
set G=null
endif
return true
endfunction
в варианте с енум чтобы коллизия работала с грибами - надо подредактировать юнитов в WE и убрать там Aloc, а потом в самом j коде второй раз убрать Aloc, но это уже другая история
goodlyhero: 1. У вас есть вторая функция которая делает также: MushroomMoving_Collision
она для движений по X, и совсем не нагружает код, по сравнению с MushroomMoving_CollisionCheck
на скрине она в текущем фрейме просчитывается по X 0 раз, а по Y 111 раз
поэтому с её переделкой я даже не заморачивался
goodlyhero: 2. нужно уничтожать группу через DestroyGroup
я проводил тесты, да и в том цикле есть условие по exitwhen u==null
разве когда берётся юнит из пустой группы - call GroupEnumUnitsInRange(G, x,y, 200, null) - то переменная u не обнуляется?
чем отличается u=null после выборки из пустой группы и ручное set u=null ?
у меня сначала были строки set u=null, но потом я решил что все равно u обнуляется перебором юнитов в группе и такие строки будут излишни
goodlyhero: 4. В этот ренж попадает и сам юнит, Нужно его пропустить, например банальной проверкой
там же стоит именно такая проверка -- if u != OrangeMushroom[i] then
в карте у всех юнитов стоит abiList:
Aloc - москиты locust - что делает юнита некликабельным и не показывает тултип
Avul - неуязвимый invulnerable - что убирает показывание полоски жизни
GroupEnumUnitsInRect и GroupEnumUnitsInRange - не работает с москитами, т.е. юнита с такой абилкой - не добавляет в группу
если убрать Aloc с коробки - то коллизии начинают работать
если убрать Aloc с гриба - то коллизии почему-то не срабатывают когда гриб под коробкой - если коробка сверху, то она проваливается в него, хотя на коробке гриб стоит нормально
после редактирования карты и убирания москитов с коробок такие результаты:
-bridge 12 в новом коде выдает 19200 коллизий против 79200 коллизий в прошлом
варик без пробуксовывания может обрабатывать максимум уже не -bridge 12 а -bridge 18 - 28600 коллизий
-ladder2 10 в новом коде выдает 26300 коллизий против 82000 коллизий в прошлом
варик без пробуксовывания может обрабатывать максимум уже не -ladder2 10 а -ladder2 12 - 32200 коллизий
вот получившийся код через GroupEnumUnitsInRange 200
пока через радиус, с ректом не морочился
код GroupEnumUnitsInRange 200
function UnitIndex takes unit u returns integer
local integer i=1
loop
exitwhen i>PLAYER_MAXINUM+Stage_BoxsCount
if u==OrangeMushroom[i] then
set u=null
return i
endif
set i=i+1
endloop
set u=null
return 0
endfunction
function MushroomMoving_CollisionCheck takes integer i,real x,real y returns boolean
local integer j=1
local real otherx
local real othery
local group G = CreateGroup()
local unit u=null
if LevelClearState[i]==false then
call GroupEnumUnitsInRange(G, x,y, 200, null)
loop
set u = FirstOfGroup(G)
exitwhen u==null
if MB_Frame_On==1 then
set MB_CollisionY = MB_CollisionY+1
endif
if u!=OrangeMushroom[i] then
set otherx=GetUnitX(u)
set othery=GetUnitY(u)
set j=UnitIndex(u)
if (GetPlayerSlotState(GetOwningPlayer(OrangeMushroom[j]))==PLAYER_SLOT_STATE_PLAYING or j>PLAYER_MAXINUM) then
if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
if PropellyCondition==true then
if GetUnitTypeId(OrangeMushroom[j])!='orai' then
set G=null
set Frame_MainPlayerY=j
return false
endif
else
set G=null
set Frame_MainPlayerY=j
return false
endif
endif
endif
endif
call GroupRemoveUnit(G, u)
endloop
set G=null
endif
return true
endfunction
nazarpunk: А имелось в виду сверять только ближайшие координаты, чтоб хоть как-то понизить сложность.
какой нативкой можно сверять ближайшие координаты у других юнитов рядом с заданным?
nazarpunk: Зачем получать координаты из игры, если стандартная система перемещений отключена? Почему не хранить их в массиве не пользоваться только Set?
прекрасное замечание, завтра попробую пошаманить и перевести координаты на глобалки
goodlyhero: Попробуйте проверять на коллизию не всех юнитов на карте а только ближайших, например через поиск их в ректе.
а разве именно это не делает эта имеющаяся строка в коде?:
if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
более того - если эту проверку убрать и оставить только считывание координат всех юнитов - то скорость особо не изменится, т.к. тормоза идут именно из-за считывания координат, которые потом сравниваются - близко они или далеко
тут исследование по скорости вывода BJDebugMsg и DisplayTimedTextToPlayer тут еще один вопрос по скорости - Нагружает ли варик проигрывание музыки , эффектов , и просчёт переменных для неактивных слотов? (1. недобавленные слоты в карту, 2. открытые свободные слоты, 3. слоты на которых сидит компьютер)
т.е. есть ли смысл заморачиваться, обрезая работу всего кода только под слоты с активными игроками?
например если варик по дефолту обсчитывает весь код 12 раз (колво слотов в 1.26)
host_pi: почему-то не работает с 1.28.5.7680
хотя пути к анимациям там такие же как в 1.26
1.26 - работает с русскими и англ буквами в пути к варику
1.28.5 - работает только с англ буквами в пути к варику, если не работает - значит надо путь почистить
то есть ты предлагаешь ради пол мегабайта качать лишнюю платную софтину WinRAR ?
и это во времена когда пользователи ирины не могут распаковать ирину, а тупо открывают екзешник прямо внутри архива ?
времена, когда считали килобайты в размере архива для отправки по диалапу - уже прошли
одно дело 500 КБ, а другое дело универсальность, а как я уже говорил - если речь идет о больших весах и профессиональном подходе - там конечно будет и винрар и 7z стоять
кстати даже в этом вопросе некоторые релизеры перешли с 7z до "torrent zipped", раздув раздачу с условных 700 ГБ до 1000 ГБ - а всё почему? а потому что туда же, в универсальность - потому что в раздаче 7z при каждом обновлении каждому придётся перекачивать 700 ГБ. а в варианте "torrent zipped" придётся перекачивать только добавленные файлы, поэтому формат архива избирается исключительно с учётом постановки задачи
в той же корее вообще используют .vol1.egg , .vol2.egg которые открываются только через Bandizip
в этом вопросе нет чёрного и белого
Атар: Тогда можно с уверенностью сказать - ЗИП лучше
тогда может всем перейти на 7z в обязаловку? он то сжимает еще лучше рара
Атар: адепты и поклонники древнего зипа меня не интересует
но тем не менее винда искаропки умеет в распаковку зипа, а в распаковку рара не умеет, хотя скрипт распаковки рара является открытым и опубликованным
сюда же можно вписать MNG APNG - это гифки без потери качества изображения после сжатия (на основе PNG)
1987 GIF
1996 PNG
1999 MNG
2004 APNG
MNG APNG форматы разработаны позднее чем GIF и могут в анимацию без технических ограничений гифа на количество цветов
но тем не менее 99% инета пользуются гифками, хз почему
ScorpioT1000: В рамках мини апдейта "Fuck winrar" превратили все (почти) залитые rar архивы в zip и запретили загружать rar.
вот и правильно
тоже самое на свежих тестовых ОС безвинраровых - зип по быстрому распаковал а при виде рара рука тянется перепаковать
Атар: Рар я использую потому что он сжимает лучше, распаковывает быстро
самый лучший быдлячий архив это зип без сжатия
особенно если в архиве какой-нибудь формат который уже сжат, ну типа mpq или офисные файлы
часто бывает что ради 1% сжатия приходится ждать условные 3 минуты расшифровки архива вместо простого 20сек копирования в случае когда он не сжат
если конечно это не 7z сет на пару ГБ или на пару ТБ со словарём под 100 метров
Мировые тенденции по отиктокливанию населения добрались в ламповое комьюнити.
чем же ответит хигама?
максимальным количеством строк в жасе не более 1000 для любой загружаемой карты ?
не более 3 импортируемых моделей ?
максимально разрешённое время для полного прохождения карты 2 минуты ?
максимальное колво юнитов на карте не более 5 ?
модификация варкрафта с максимальной длиной сообщений в чате 10 символов ?
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
Ред. host_pi
» WarCraft 3 / каким софтом можно создать w3r файлы из координат?
а по пути удалить WE, JNGP, VSCode, UjAPI, просмотровщики моделей и прочие джас хелперы с блендерами
» Game Dev / Шлемы-тыквы - иконки от ИИ
» Game Dev / Шлемы-тыквы - иконки от ИИ
Ред. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
по общему впечатлению карта с глобалками на промежутке 40~50 фпс работает на пару фпс ниже-выше (прыжками туда сюда), сложно отловить, но тренд небольшой есть на обоих проверках
в целом - отличий на высоких фпс практически нет, зато как только фпс начинают падать - так сразу появляется небольшой выйгрыш на 5-10 фпс перед предсмертной агонией, т.е. небольшой выйгрыш таки есть, цена этому - сотня замен по всему коду и при выходе новых версий временнозатратно будет их патчить
итоговые результаты поразительны - количество коллизий уменьшилось в 3 раза, а максимальное количество коробок стало в 2 раза выше
и если в оригинальном виде - было под 80000 просчётов коллизий и максимум 8 объектов (не путать с 1ым графиком, там чуть щадящая система оценки была и можно сдвинуть на 1 влево)
то в enum128 варианте - происходит только 35000 просчетов коллизий, и макс 15 объектов, что уже ощутимо вырывается по отличиям
мало того, эта система еще и гибкая - т.е. в реальных игровых условиях результаты будут еще чуть лучше, потому что многие объекты стоят отдельно на уровне а не в единой цепочке с остальными
1 - оптимизировать MushroomMoving_RectCondition, там по 3 раза вызывается MushroomMoving_CollisionCheck на каждый чих а не по 1 и есть шанс еще в 3 раза повысить производительность без потери текущей физики
2 - как предложил Daro делать на триггерах вхождения юнитом в регион (на карте подобная система уже присутствует при нырянии в воду)
возможно есть и другие методы, а также те люди, кто в будущем захочет этим заняться и довести максимальное количество объектов до 50, как и задумано в карте с лабораторией - заспавнить 50 коробок
тем более что картоделы тоже страдают от этого лимита коробок, поэтому на карте больше 7+6=13 объектов обычно не появляется
вот код с глобалками + енум - xgm.guru/files/100/315886/comments/520383/BoxLab_1.1_EN_global_e...
вот чистый енум:
-
BoxLab_1.1_EN_global_enum.j
-
image_copy1.png
-
image_copy2.png
Полный списокРед. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
на скрине она в текущем фрейме просчитывается по X 0 раз, а по Y 111 раз
поэтому с её переделкой я даже не заморачивался
разве когда берётся юнит из пустой группы - call GroupEnumUnitsInRange(G, x,y, 200, null) - то переменная u не обнуляется?
чем отличается u=null после выборки из пустой группы и ручное set u=null ?
у меня сначала были строки set u=null, но потом я решил что все равно u обнуляется перебором юнитов в группе и такие строки будут излишни
Ред. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
Aloc - москиты locust - что делает юнита некликабельным и не показывает тултип
Avul - неуязвимый invulnerable - что убирает показывание полоски жизни
GroupEnumUnitsInRect и GroupEnumUnitsInRange - не работает с москитами, т.е. юнита с такой абилкой - не добавляет в группу
если убрать Aloc с гриба - то коллизии почему-то не срабатывают когда гриб под коробкой - если коробка сверху, то она проваливается в него, хотя на коробке гриб стоит нормально
варик без пробуксовывания может обрабатывать максимум уже не -bridge 12 а -bridge 18 - 28600 коллизий
варик без пробуксовывания может обрабатывать максимум уже не -ladder2 10 а -ladder2 12 - 32200 коллизий
пока через радиус, с ректом не морочился
Ред. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
благо карта позволяет всё измерить сразу же
Ред. host_pi
» WarCraft 3 / Как можно оптимизировать этот код с 2D коллизиями?
варик начинают загружать именно эти две строки:
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
хотелось бы списочек того - что про геймдизайн
» XGM Конкурсы / [Итоги] Большой Турнир Ландшафтеров 2023
» XGM Конкурсы / [Итоги] Большой Турнир Ландшафтеров 2023
» Мир безумного / Activision Blizzard присоединяется к Microsoft
Ред. host_pi
» XGM Конкурсы / [Итоги] Большой Турнир Ландшафтеров 2023
» XGM Конкурсы / [Итоги] Большой Турнир Ландшафтеров 2023
Ред. host_pi
» WarCraft 3 / Jass MythBusters
тут еще один вопрос по скорости - Нагружает ли варик проигрывание музыки , эффектов , и просчёт переменных для неактивных слотов? (1. недобавленные слоты в карту, 2. открытые свободные слоты, 3. слоты на которых сидит компьютер)
например если варик по дефолту обсчитывает весь код 12 раз (колво слотов в 1.26)
» WarCraft 3 / Быстрые анимации в главном меню
1.28.5 - работает только с англ буквами в пути к варику, если не работает - значит надо путь почистить
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
и это во времена когда пользователи ирины не могут распаковать ирину, а тупо открывают екзешник прямо внутри архива ?
времена, когда считали килобайты в размере архива для отправки по диалапу - уже прошли
одно дело 500 КБ, а другое дело универсальность, а как я уже говорил - если речь идет о больших весах и профессиональном подходе - там конечно будет и винрар и 7z стоять
кстати даже в этом вопросе некоторые релизеры перешли с 7z до "torrent zipped", раздув раздачу с условных 700 ГБ до 1000 ГБ - а всё почему? а потому что туда же, в универсальность - потому что в раздаче 7z при каждом обновлении каждому придётся перекачивать 700 ГБ. а в варианте "torrent zipped" придётся перекачивать только добавленные файлы, поэтому формат архива избирается исключительно с учётом постановки задачи
в той же корее вообще используют .vol1.egg , .vol2.egg которые открываются только через Bandizip
в этом вопросе нет чёрного и белого
1987 GIF
1996 PNG
1999 MNG
2004 APNG
MNG APNG форматы разработаны позднее чем GIF и могут в анимацию без технических ограничений гифа на количество цветов
но тем не менее 99% инета пользуются гифками, хз почему
Ред. host_pi
» XGM Team / Онлайн-инструменты для геймдев и моддинг арта
тоже самое на свежих тестовых ОС безвинраровых - зип по быстрому распаковал а при виде рара рука тянется перепаковать
особенно если в архиве какой-нибудь формат который уже сжат, ну типа mpq или офисные файлы
часто бывает что ради 1% сжатия приходится ждать условные 3 минуты расшифровки архива вместо простого 20сек копирования в случае когда он не сжат
Ред. host_pi
» Администрация XGM / Реакции
максимальным количеством строк в жасе не более 1000 для любой загружаемой карты ?
не более 3 импортируемых моделей ?
максимально разрешённое время для полного прохождения карты 2 минуты ?
максимальное колво юнитов на карте не более 5 ?
модификация варкрафта с максимальной длиной сообщений в чате 10 символов ?
Ред. host_pi
» WarCraft 3 / Создадим карту вместе.
с такой безскриншотной рекламой тебе будет туговато
Ред. host_pi
» WarCraft 3 / Путешествие за солью [Большой Турнир Ландшафтеров 2023]
Ред. host_pi
» Мир безумного / Activision Blizzard присоединяется к Microsoft
Ред. host_pi
» WarCraft 3 / Формат карт Warcraft 3
https://www.xgm.guru/files/100/244692/MagosBlpFormat.txt
http://web.archive.org/web/20191226191417/http://www.wc3c.net/to...