Возможно ли?
Ситуация:
В игре 5 игроков.
Красный хост.
У 4 игроков в папке варкрафта имеется идентичный прелоад файл (некая дата).
У синего этого файла нет.
Возможно ли передать данные от красного игрока синему, и только синему игроку с синхронизацией!? (Чтобы остальные игроки подгрузили данные из своих прелоад источников)

когда игроки подгрузили данные из прелоада и синхронизировали их то устанавливаем им флаг загрузил
а потом просто сохраняем всё что надо у тех у кого нету флага
подробнее в статье про прелоад
данные надо синхронить со всеми иначе десинк
`
ОЖИДАНИЕ РЕКЛАМЫ...
20
а что-то мешает сделать проверку на наличие?
32
Ну главное чтобы у всех был прелоад, а прелоад чего неважно...
данные из прелоада нужно синхронизировать с помощью кеша и Sync...
Синхронизация порой длится эпически долго...
28
когда игроки подгрузили данные из прелоада и синхронизировали их то устанавливаем им флаг загрузил
а потом просто сохраняем всё что надо у тех у кого нету флага
подробнее в статье про прелоад
данные надо синхронить со всеми иначе десинк
Принятый ответ
21
ssbbssc:
а что-то мешает сделать проверку на наличие?
И? проверил я, выяснил что у синего предлоад файла нету. Что дальше? Если начинаю синхронизацию с 5 игроками большого обьёма данных, управление у игроков подвисает на приличное время. (до 40 и более сек)
nvc123:
данные надо синхронить со всеми иначе десинк
Ну собственно об этом вопрос и был. Синхра большого объёма данных между 5 игроками занимает много времени, я ищу решение этой проблеме:
quq_CCCP:
Синхронизация порой длится эпически долго...
таким образом
28
я ищу решение этой проблеме:
у меня синхра занимает не более 20 секунд на 10 игроков
если юзать не засинхроненные данные то будет десинк за исключением чисто визуальной части
так что синхронить придётся как не крути
либо переписывай варик
21
nvc123:
я ищу решение этой проблеме:
у меня синхра занимает не более 20 секунд на 10 игроков
если юзать не засинхроненные данные то будет десинк за исключением чисто визуальной части
так что синхронить придётся как не крути
либо переписывай варик
а какой обьём данных)?
у нас при 2 игроках моментально всё работает, залагов нет. при 5 игроках секунд 30 лагает управление, большее колво игроков не тестили, просто обьёмы данных довольно большие могут быть.
изза чего вообще появляется этот лаг управления, знает кто?
28
awesomesk1ll, данные синхронятся и поток стопится на время отправки/приёма
21
nvc123:
awesomesk1ll, данные синхронятся и поток стопится на время отправки/приёма
управление висит и после того как данные уже подгрузились и синхронизовались..
21
Такая вот синхронизация потока была
loop
exitwhen (Condition)
call TriggerSyncStart()
call TriggerSyncReady()
endloop
такие замеры
Переделали на
loop
exitwhen (Condition)
call TriggerSyncStart()
call TriggerSyncReady()
call TriggerSleepAction(0.1)
endloop
Лага после синхры теперь нету. Не совсем понятно чем это чревато правда.
Загруженные файлы
32
ты вейт секунды 2 порставь, после if и сравни данные у хоста и другого остальных игроков, если хоть у одного данные в кеше иные, снова вейт 2 сек и так до тех пор пока у всех все ровно будет...
21
nvc123:
awesomesk1ll, 0,1 мало
ставь хотяб 1
Почему?
У нас обьёмы данных думаю на порядок больше чем у тебя на 10 игроков синхронишь. Мы целые уровни передаём между игроками, хотим вообще целые карты передавать (коллекции уровней) в идеале.
этот проект xgm.guru/p/ice/alpha
ну сейчас вроде вообще норм работает).. скоро 0.2 версию выпустим думаю
28
прелоадить за раз можно не более 4096+1024*n байт
где n количество не играющих игроков
21
nvc123:
прелоадить за раз можно не более 4096+1024*n байт
где n количество не играющих игроков
Почему это?)
Можно же больше
28
awesomesk1ll, внимательно читай
тут несколько раз прелоадится
или спроси у того кто писал код
21
nvc123:
awesomesk1ll, внимательно читай
тут несколько раз прелоадится
или спроси у того кто писал код
Вот файл прелоада yadi.sk/d/z1OAoLeTkySv6
Вот код
function ESD takes nothing returns nothing
    set StrData[StrCount] = GetPlayerName(Player(15))
    if (StrData[StrCount] == " ") then
        set StrData[StrCount] = null
    endif
    set StrCount = StrCount + 1
endfunction

private method loadDataFromPlayer takes string name, integer dataCount, player p returns nothing
    local integer i
    set StrCount = 0
    call SetPlayerName(Player(15), " ") // Пробел считается за пустую строку
    if (GetLocalPlayer() == p) then
        call Preloader(name) // Загрузить файл от игрока
    endif
    call SetPlayerName(Player(15), " ")
    set i = StrCount
    loop
        exitwhen (i >= dataCount)
        call ExecuteFunc("ESD") // У всех игроков должно быть одинаковое количество вызовов функции ESD
        set i = i + 1
    endloop
    call SetPlayerName(Player(15), null) // Вернуть имя по умолчанию
endmethod
В одном файле 24~кб данных. Сам файл прелоада 44кб.
Вроде я внимательно всё читал.
28
считай количество call Preload( "") в файле
ведь именно с помощью них данные заносятся в файл
а с помощью call SetPlayerName и call ExecuteFunc("ESD") считываются
кстати можно обойтись и без "У всех игроков должно быть одинаковое количество вызовов функции ESD"
хотя этот цикл мне вообще не понятен
set i = StrCount
    loop
        exitwhen (i >= dataCount)
        call ExecuteFunc("ESD") // У всех игроков должно быть одинаковое количество вызовов функции ESD
        set i = i + 1
    endloop
зачем мы вызываем ESD если она в прелоад файле вызывается
21
nvc123:
считай количество call Preload( "") в файле
ведь именно с помощью них данные заносятся в файл
а с помощью call SetPlayerName и call ExecuteFunc("ESD") считываются
кстати можно обойтись и без "У всех игроков должно быть одинаковое количество вызовов функции ESD"
хотя этот цикл мне вообще не понятен
set i = StrCount
    loop
        exitwhen (i >= dataCount)
        call ExecuteFunc("ESD") // У всех игроков должно быть одинаковое количество вызовов функции ESD
        set i = i + 1
    endloop
зачем мы вызываем ESD если она в прелоад файле вызывается
прелоад вызывается только у 1 игрока же, у других ESD выполняется для синхронизации.
Имею ввиду не для синхронизации данных, а что бы не было десинка от прелоада
(файл прелоада есть только у одного игрока например, который его загружает)
таким образом мы считываем файл одному игроку в память, без рассинхрона. затем передача данных другим игрокам
28
таким образом мы считываем файл одному игроку в память, без рассинхрона.
считывание в память и так идёт без рассинхрона
рассинхрон вызывают локальные операции с хэндлами
21
В общем подытожу дискуссию по поводу начального вопроса. Данные транслировать(синхронизировать) можно только между всеми игроками. От одного игрока другому одному конкретному игроку - невозможно. Тем не менее у нас была проблема с большим подвисанием управления, после синхронизации. И мы решили мы этот момент способом описанным в комменте #10. По поводу обсуждения ниже - скоро доделаем версию 0.2 там можно будет пощупать все обсуждаемые моменты на деле. (сколько данных в одном прелоаде, скорость передачи и синхры данных и прочее)
Мы практически решили все наши проблемы с синхрой и теперь можем загружать на 10 игроков отдельно взятые уровни или же целые паки уровней (до 1000-1500 уровней!)~ файлы которых находятся только у одного игрока. Т.е. я запустил карту, построил в ней десяток уровней, десяток уровней обьединил в "пак". Затем в другой игре ко мне зашло 9 человек, у которых моих уровней нет. Но данные подгружаются от меня всем остальным игрокам. Так это и работает.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.