get_playersnum(1) или m_iNumTerrorist + m_iNumCT

Сообщения
401
Реакции
113
Помог
2 раз(а)
Опять не работает плагин... дамплю все параметры... и вместо того, что я ожидаю увидеть, как обычно, получаю в цикле забавные данные...
num = m_iNumTerrorist + m_iNumCT, total = get_playersnum(1)

Запускаем цикл в client_disconnected(), в одном кадре и получаем:
Код:
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 29 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 29 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 28 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 28 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 27 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 27 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 26 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 26 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 25 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 25 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 24 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 24 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 23 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 23 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 22 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 22 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 21 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 20 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 20 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 20 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 19 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 19 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 18 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 17 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 17 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 17 (num_tt = 15, num_ct = 15)
L 05/27/2024 - 18:01:39: [MAPM] check_online(): ERROR!!! num = 30, total = 16 (num_tt = 15, num_ct = 15)
И кому верить? Сколько игроков на сервере? Как узнать? Не понятно по какой причине, разработчики ReGame решили учитывать количество игроков только в двух командах, но нет общего числа игроков и отдельно количество спектраторов (кто не определился с выбором тогда можно посчитать) - на это тратится полный цикл перебора, хотя это же не сложно реализовать в ReGame.

Пошел проверять свою функцию подсчета игроков (с) А за то чтобы костюмчик как следует сидел - не отвечает никто...

UPD: да, ошибка пропала, если считать всех игроков в отдельном цикле... А верить ни ReGame, ни AMXX get_playersnum() нельзя... :dntknw: Эти значения, в принципе, никак не коррелируют между собой и с реальностью.
 
Последнее редактирование:
Сообщения
137
Реакции
23
Помог
2 раз(а)
get_member_game(m_iNumTerrorist)
get_member_game(m_iNumCT)
get_member_game(m_nMaxPlayers)
get_playersnum‎()
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
m_nMaxPlayers - это мимо, остальное очень выборочно работает... есть еще какой-то косяк с этими m_iNumTerrorist и m_iNumCT после rg_swap_all_players()... и просто поправить функцию подсчета игроков не получится - TABSCORE "плывет", пишет в TT = 14 игроков, а там на самом деле 6, а у CT пишет 6 - а на самом деле там 14... из-за этого балансировка иногда не работает. Наверно какой-то там FullClientInfoUpdate нужно отпрвлять всем, надо поискать примеры...
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
m_iNumTerrorist и m_iNumCT обновляются в начале раунда, если это не меняли.
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Mistrick,:blush2: Мне просто интересно, если есть все события коннект, дисконнект и смена команды, можно ли как-то замутить вычисление всех описанных мной значений в режиме онлайн, с точностью до 1 кадра... и без циклов по 32 итерации на каждое значение... Возможно ли реализовать такое сложное поведение примитивных функций...

И можно ли замутить хэш таблицу с базовыми параметрами игроков (стим, ip, имя), чтобы, опять же, не лазить циклами в поискать нужного id игрока. Элементарных инструментов нет под рукой, в API который пилять 15 лет.:swoon2:
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
Refresh, всё api сделано почти по полной аналогии как делается в исходниках rehlds, regamedll(там часто используют циклы по всем игрокам). Вы хотите съэкономить на спичках с современных реалиях, где процессоры стали в 100 раз быстрее за 15 лет? Пишите код, оптимизуйте, когда это нужно. Покажите ваши примеры, где считаете использование циклов избыточными. В коннекте/дисконекте, смена тимы - не избыточные вызовы, где требуется такая оптимизация, которая требует написания своего кэширования.
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
RefreshПокажите ваши примеры, где считаете использование циклов избыточными.
Да везде:rofl: Например, в register_event("TeamInfo", "change_team", "a", "2=TERRORIST", "2=CT"); я каждый раунд получаю 32 события "смены команды", без смены команды... Видимо, просто так, на всякий случай. Либо я не понимаю масштаба мысли и самой задумки...

Вот примерный алгоритм:
  • игрок подключился -> добавили 1 в m_iNumTotal, установили флаг is_connected[id] = true, добавили в хэш значения ip+port, steam, name => id
  • игрок сменил команду -> добавили 1 в зависимости от выбранной команды к m_iNumTT(1) или m_iNumCT(2) или m_iNumSpec(3), если предыдущая команда была не Unassigned(0), отнять 1 у предыдущей команды
  • игрок отключился -> отняли 1 от m_iNumTotal и из соответствующей команды m_iNumTT(1) или m_iNumCT(2) или m_iNumSpec(3), сбросили флаг is_connected[id] = false, удалили из хешей записи ip+port, steam, name
Просто я таскаю уже 650Кб инклудов, просто ради того чтобы не иметь глюков c AMXX, ReAPI, ReGame... Просто берешь исходник и переписываешь все без идиотских циклов и if-return-ов... И конца и края не вижу. А когда я сталкиваюсь с неработоспособными реализациями каких-то примитивов, это выводит меня из состояния равновесия...

Все что я сделал или все что мне нужно есть в том или ином виде в ReGame и чтобы не дублировать одни и теже массивы данных в сотнях плагинов, я подумал, что было бы рационально просто реализовать это в максимально простом и эффективном виде.
 
  • Нравится
Реакции: ssx

hajimura

Е777КХ05
Сообщения
290
Реакции
228
Помог
6 раз(а)
Сначала делаем это: https://github.com/s1lentq/reapi/bl...modx/scripting/include/reapi_gamedll.inc#L961
Потом делаем это: get_member_game(m_iNumTerrorist) + get_member_game(m_iNumCT)
И будет вам актуальное количество игроков. Спектров надо будет считать по-другому. А на счет избыточности циклов можешь не париться. Открой регейм и глянь, что в синке происходит, обалдеешь. Тему оптимизации надо не с амхх начинать, а с регейма/рехлдс
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Ну там цикл:

А чтобы посчитать спектров и "висячих" нужен будет еще один цикл... а get_playersnum() - может показать что угодно... Поэтому толку от всех этих полу-API = 0, поскольку этим не возможно пользоваться:pardon:

И каждый раз, каждый из 100 плагинов на сервере выполняет минимум 64 итерации в пустую... Поэтому все эти 100 кратные увеличения производительности CPU съедаются отвратительной реализацией кода.
 
Последнее редактирование:
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
Да везде:rofl: Например, в register_event("TeamInfo", "change_team", "a", "2=TERRORIST", "2=CT"); я каждый раунд получаю 32 события "смены команды", без смены команды... Видимо, просто так, на всякий случай. Либо я не понимаю масштаба мысли и самой задумки...
Из чего следует, что хук данного эвента является сменой команды? Эта мессага рассылается всем игрокам и не только по факту изменения команды.
Непонятно что за 650кб вы таскаете и как оно шарится в ваших работах, когда в АМХХ довольно скудные возможности для этого(нативы и вам надо тоскать всегда ядро с вашими личными api)
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
За неимением ничего другого срабатывающего при смене команды использую данный хук. Но получать 32 сообщения в начале каждого раунда без какого-либо изменения принадлежности игрока к команде - не лучшее решение. Это был пример неэффективной реализации.
 
Сообщения
3,579
Реакции
1,569
Помог
137 раз(а)
За неимением ничего другого срабатывающего при смене команды использую данный хук. Но получать 32 сообщения в начале каждого раунда без какого-либо изменения принадлежности игрока к команде - не лучшее решение. Это был пример неэффективной реализации.
А достаточно лишь было просто пошариться по форуму... Click
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Nordic Warrior, спасибо, там нет исходника - думаю он делает тоже самое что и я. Ради одного форварда с отфильтрованным событием подключать сошку... А для подсчета количества игроков на сервере нужно будет еще одну сошку подключать? В добавок к ReGame и ReAPI...

Но... это, кстати, вариант... засунуть все свои API в сошку...
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
hajimura, спасибо, rg_initialize_player_counts(...) решило проблему в некоторых плагинах оперирующих только числом активных игроков:ok:Но расхождения (в большую сторону) с get_playersnum() все равно есть, причем рандомно, в переходных процессах коннект/дисконнект...
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Refresh, дай угадаю, rg_initialize_player_counts выполняется дольше? И как ты замерял эту скорость, покажи пожалуйста )
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
Держи:
Код:
public cmd_test(const id) {
    client_print_color(0, print_team_default, "TEST_START = %f", get_gametime());
    RequestFrame("cmd_start", id);
}

public cmd_start(id) {
    new i_i, i_num_tt, i_num_ct, i_num_dead_tt, i_num_dead_ct;
    for (i_i = 0; i_i < 12000000; i_i++) {
        i_num_tt = gi_players_num[get_member(id, m_iTeam)];
        //rg_initialize_player_counts(i_num_tt, i_num_ct, i_num_dead_tt, i_num_dead_ct);
    }
    RequestFrame("cmd_control", id);
}

public cmd_control(id) {
    client_print_color(0, print_team_default, "TEST_END = %f", get_gametime());
}
Начинаем с 2М для rg_initialize_player_counts:
TEST_START = 11.636231
TEST_END = 11.638278
Получаем дельту: 0.002047

Увеличиваем в 2 раза число итераций до 4М:
TEST_START = 11.297957
TEST_END = 11.300048
Получаем дельту: 0.002091

Получаем, что 6М операций rg_initialize_player_counts выполняется за 0,000047+0,000091 = 0.000138 => 1М = 23мкс

Меняем функцию на мой самый "тяжелый" вариант получения количества игроков в коде и замеряем на 6М:
TEST_START = 17.156238
TEST_END = 17.158287
Получаем дельту: 0.002049

Увеличиваем в 2 раза число итераций до 12М:

TEST_START = 607.553222
TEST_END = 607.555297
Получаем дельту: 0.002075

Получаем, что 18М операций выполняется за 0.000049 + 0.000075 = 0.000124 => 1М = 7мкс.

Можно повторить раз 5 до получения сходимости результатов - но пропорции это сильно не изменит.

Перфоманс-монитор AMXX показывает аналогичные соотношения 3 к 1, в пользу моего "не с++" варианта :pardon:
 
Последнее редактирование:
Сообщения
594
Реакции
350
Предупреждения
1
Помог
9 раз(а)
Перфоманс монитор в амхх дерьмо
 
Сообщения
401
Реакции
113
Помог
2 раз(а)
steelzzz, ну там важна не точность, а сам факт наличия проблемы, на этапе отладки очень даже помогает понять что и где не так...
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу