HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Специфичные вопросы по играм (https://hlfx.ru/forum/showthread.php?threadid=4727)
Отправлено ILZM 12-02-2016 в 18:01:
Специфичные вопросы по играм
Привет всем. Вот и я подъехал со своими странными вам вопросами
Вот ща на уроке Operating Systems изучаю threads. И вот че хотел спросить. Еле откопал main метод в исходах квейка на каком-то сайте, главное на гитхабе не смог
C++ Source Code:
5 | newtime = Sys_DoubleTime (); |
6 | time = newtime - oldtime; |
18 | /* Prediction//Collision */ |
19 | CL_SetUpPlayerPrediction(false) |
21 | CL_SetUpPlayerPrediction(true) |
CL_ReadPackets, CL_SendCmd - как вот эта часть работает? Вот есть у нас UDP сокет, с которого каждую итерацию while(1) считываются данные и UDP сокеты, равные количеству клиентов, на которые сервер отправляет данные? А какие функции используются для этого? Просто когда работал с сокетом, который TCP, то создавали дескриптор файла и считывали через gets, а он, естестенно ждет пока не придут пакеты с клиента. А в игре все норм. Даже если игрок больше не посылает пакеты, все рендерится, просчитывется. Это че игра тред создает для каждого подключения(или даже процесс, но это навряд ли)?
Отправлено FreeSlave 12-02-2016 в 18:28:
Цитата:
ILZM писал:
Еле откопал main метод в исходах квейка на каком-то сайте, главное на гитхабе не смог
Вот же.
Для других систем - в других файлах.
Цитата:
ILZM писал:
А какие функции используются для этого?
sendto, видимо.
Цитата:
ILZM писал:
создавали дескриптор файла и считывали через gets, а он, естестенно ждет пока не придут пакеты с клиента.
gets - это функция из стандартной библиотеки Си, и она считывает только из stdin.
Отправлено ILZM 12-02-2016 в 18:58:
FreeSlave пардон, перепутал gets с read ( socket...
Отправлено FreeSlave 12-02-2016 в 19:20:
ILZM, sendto - это конечно для посылки. А ты спрашивал про чтение, я невнимательно прочёл. Для получения есть recvfrom.
Насколько я понял, основной твой вопрос заключается в том, как это всё работает без задержек. Сокет может быть установлен в неблокирующий режим через ioctlsocket (на Windows) и ioctl или fcntl. Собственно, в Quake так и делается.
Цитата:
ILZM писал:
read
Для кроссплатформенности лучше использовать функции предназначенные именно для сокетов, а не файловых дескрипторов, ибо сокеты не везде являются файловыми дескрипторами.