Привет всем.
Вот при написании сетевого геймплея возникла проблемка:
Недостаток был замечен на двух протоколах UDP и TCP.
Если на одном компе fps будет допустим в два раза больше чем
на другом, соответственно циклы игры будут отставать тоже в два раза.
И число пакетов принятых и посланных тоже будет разное.
Соответственно комп на котором больше fps пошлет два пакета за
какуюто еденицу времени, а за это же время второй комп с малым fps
сможет принять только один пакет.
И так появляется конкретное запаздывание !
Как от этого избавляться ?
Каким образом убрать эту 'очередь' пакетов ?
Пробовал таким образом задавать такие параметры:
unsigned long flag = true;
ioctlsocket(socket, FIONBIO, &flag);
- но не помогает.
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Ну вообщето посылкой сообщений должен зханимать не тот пототк где идет отрисовка, а совершенно отдельный, который должен при любой скороси прорисовки, отсылать данные с постоянной скоростью, точнее через строго определенные промежутки времени.
Другое вариант, сервер обязан следить за поступлением данных и откидывать лишние если они пришли слишком рано, но это кривоватый вариант.
Ну вообщето посылкой сообщений должен зханимать не тот пототк где идет отрисовка, а совершенно отдельный, который должен при любой скороси прорисовки, отсылать данные с постоянной скоростью, точнее через строго определенные промежутки времени. Другое вариант, сервер обязан следить за поступлением данных и откидывать лишние если они пришли слишком рано, но это кривоватый вариант.
А расскажика плз. поподробнее про отдельные потоки.
Что нужно два потока создавать ?
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
Хммм, а ты игру сам писал то? С поттоками (threads) знаком или нет? Я не могу тебе обьяснит как все это сделать, так как я не знаю как работает сама игра. Ведь вариантов реализации может быть миллион
Такс... Я делал это под линух, но везде принципы одинаковы. Кстати юзал SDL, в принципе она и под винду есть, так что вообще халява. Короче чем-то типа create_thread создаёшь новую нить выполнения. Ну это типа новая функция, которая работает параллельно с твоей программой, то есть практически как новый процесс. Ну и чё, проблема может возникнуть только при передачи данных из сетевого треда, твоему основному треду. Например ты просчитываешь столкновение своего игрока и сетевого, просчитал - и вот готов рисовать кадр на экран, а тут опа пришёл новый пакет, с новым положением сетевого игрока, и получается твой просчёт был неверен. Это решается с помощью локов... Как там в SDL они назывались не помню, помню что в ядре линуха, когда под SMP програмишь это mutex-ами называлось (mutual exclusion). Фишка, чтобы доступ к данным мог только в какой-то момент времени получать только один тред или процесс, ну а для SMP один процессор
Advanced member
Статус: Не в сети Регистрация: 09.06.2003 Откуда: USSR
TeCTeP Это можно назват и по другому, должна быть четкая синхронизация при доступе к данным из разных потоков. как реализовать это уже на усмотрении программиста, но если один поток сейчас что-то делает, второй не должен получиться досутп к данным, пока первый не закончит. Под Windows через теже мутексы и WaitForSingleObject это решается запросто.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения