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

Принятый ответ

когда игроки подгрузили данные из прелоада и синхронизировали их то устанавливаем им флаг загрузил
а потом просто сохраняем всё что надо у тех у кого нету флага
подробнее в статье про прелоад
данные надо синхронить со всеми иначе десинк
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
20
8 лет назад
0
а что-то мешает сделать проверку на наличие?
0
32
8 лет назад
0
Ну главное чтобы у всех был прелоад, а прелоад чего неважно...
данные из прелоада нужно синхронизировать с помощью кеша и Sync...
Синхронизация порой длится эпически долго...
0
28
8 лет назад
0
когда игроки подгрузили данные из прелоада и синхронизировали их то устанавливаем им флаг загрузил
а потом просто сохраняем всё что надо у тех у кого нету флага
подробнее в статье про прелоад
данные надо синхронить со всеми иначе десинк
Принятый ответ
0
21
8 лет назад
Отредактирован awesomesk1ll
0
ssbbssc:
а что-то мешает сделать проверку на наличие?
И? проверил я, выяснил что у синего предлоад файла нету. Что дальше? Если начинаю синхронизацию с 5 игроками большого обьёма данных, управление у игроков подвисает на приличное время. (до 40 и более сек)
nvc123:
данные надо синхронить со всеми иначе десинк
Ну собственно об этом вопрос и был. Синхра большого объёма данных между 5 игроками занимает много времени, я ищу решение этой проблеме:
quq_CCCP:
Синхронизация порой длится эпически долго...
таким образом
0
28
8 лет назад
0
я ищу решение этой проблеме:
у меня синхра занимает не более 20 секунд на 10 игроков
если юзать не засинхроненные данные то будет десинк за исключением чисто визуальной части
так что синхронить придётся как не крути
либо переписывай варик
0
21
8 лет назад
Отредактирован awesomesk1ll
0
nvc123:
я ищу решение этой проблеме:
у меня синхра занимает не более 20 секунд на 10 игроков
если юзать не засинхроненные данные то будет десинк за исключением чисто визуальной части
так что синхронить придётся как не крути
либо переписывай варик
а какой обьём данных)?
у нас при 2 игроках моментально всё работает, залагов нет. при 5 игроках секунд 30 лагает управление, большее колво игроков не тестили, просто обьёмы данных довольно большие могут быть.
изза чего вообще появляется этот лаг управления, знает кто?
0
28
8 лет назад
0
awesomesk1ll, данные синхронятся и поток стопится на время отправки/приёма
0
21
8 лет назад
0
nvc123:
awesomesk1ll, данные синхронятся и поток стопится на время отправки/приёма
управление висит и после того как данные уже подгрузились и синхронизовались..
0
28
8 лет назад
0
awesomesk1ll, хз
чёто гдето не так делаешь значит
0
21
8 лет назад
Отредактирован awesomesk1ll
0
Такая вот синхронизация потока была
loop
exitwhen (Condition)
call TriggerSyncStart()
call TriggerSyncReady()
endloop
такие замеры
Переделали на
loop
exitwhen (Condition)
call TriggerSyncStart()
call TriggerSyncReady()
call TriggerSleepAction(0.1)
endloop
Лага после синхры теперь нету. Не совсем понятно чем это чревато правда.
Загруженные файлы
0
28
8 лет назад
0
awesomesk1ll, 0,1 мало
ставь хотяб 1
0
32
8 лет назад
0
ты вейт секунды 2 порставь, после if и сравни данные у хоста и другого остальных игроков, если хоть у одного данные в кеше иные, снова вейт 2 сек и так до тех пор пока у всех все ровно будет...
0
21
8 лет назад
Отредактирован awesomesk1ll
0
nvc123:
awesomesk1ll, 0,1 мало
ставь хотяб 1
Почему?
У нас обьёмы данных думаю на порядок больше чем у тебя на 10 игроков синхронишь. Мы целые уровни передаём между игроками, хотим вообще целые карты передавать (коллекции уровней) в идеале.
этот проект xgm.guru/p/ice/alpha
ну сейчас вроде вообще норм работает).. скоро 0.2 версию выпустим думаю
0
28
8 лет назад
0
прелоадить за раз можно не более 4096+1024*n байт
где n количество не играющих игроков
0
21
8 лет назад
0
nvc123:
прелоадить за раз можно не более 4096+1024*n байт
где n количество не играющих игроков
Почему это?)
Можно же больше
0
28
8 лет назад
0
awesomesk1ll, внимательно читай
тут несколько раз прелоадится
или спроси у того кто писал код
0
21
8 лет назад
Отредактирован awesomesk1ll
0
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кб.
Вроде я внимательно всё читал.
0
28
8 лет назад
Отредактирован nvc123
0
считай количество 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 если она в прелоад файле вызывается
0
21
8 лет назад
Отредактирован awesomesk1ll
0
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 выполняется для синхронизации.
Имею ввиду не для синхронизации данных, а что бы не было десинка от прелоада
(файл прелоада есть только у одного игрока например, который его загружает)
таким образом мы считываем файл одному игроку в память, без рассинхрона. затем передача данных другим игрокам
0
28
8 лет назад
0
таким образом мы считываем файл одному игроку в память, без рассинхрона.
считывание в память и так идёт без рассинхрона
рассинхрон вызывают локальные операции с хэндлами
0
21
8 лет назад
Отредактирован awesomesk1ll
0
В общем подытожу дискуссию по поводу начального вопроса. Данные транслировать(синхронизировать) можно только между всеми игроками. От одного игрока другому одному конкретному игроку - невозможно. Тем не менее у нас была проблема с большим подвисанием управления, после синхронизации. И мы решили мы этот момент способом описанным в комменте #10. По поводу обсуждения ниже - скоро доделаем версию 0.2 там можно будет пощупать все обсуждаемые моменты на деле. (сколько данных в одном прелоаде, скорость передачи и синхры данных и прочее)
Мы практически решили все наши проблемы с синхрой и теперь можем загружать на 10 игроков отдельно взятые уровни или же целые паки уровней (до 1000-1500 уровней!)~ файлы которых находятся только у одного игрока. Т.е. я запустил карту, построил в ней десяток уровней, десяток уровней обьединил в "пак". Затем в другой игре ко мне зашло 9 человек, у которых моих уровней нет. Но данные подгружаются от меня всем остальным игрокам. Так это и работает.
0
21
8 лет назад
0
Чтобы оставить комментарий, пожалуйста, войдите на сайт.