Привет всем. Вот и я подъехал со своими странными вам вопросами
Вот ща на уроке Operating Systems изучаю threads. И вот че хотел спросить. Еле откопал main метод в исходах квейка на каком-то сайте, главное на гитхабе не смог
C++ Source Code:
1
WinMain
2
{
3
while (1)
4
{
5
newtime = Sys_DoubleTime ();
6
time = newtime - oldtime;
7
Host_Frame (time)
8
{
9
setjmp
10
Sys_SendKeyEvents
11
IN_Commands
12
Cbuf_Execute
13
14
/* Network */
15
CL_ReadPackets
16
CL_SendCmd
17
18
/* Prediction//Collision */
19
CL_SetUpPlayerPrediction(false)
20
CL_PredictMove
21
CL_SetUpPlayerPrediction(true)
22
CL_EmitEntities
23
24
/* Rendition */
25
SCR_UpdateScreen
26
}
27
oldtime = newtime;
28
}
29
}
CL_ReadPackets, CL_SendCmd - как вот эта часть работает? Вот есть у нас UDP сокет, с которого каждую итерацию while(1) считываются данные и UDP сокеты, равные количеству клиентов, на которые сервер отправляет данные? А какие функции используются для этого? Просто когда работал с сокетом, который TCP, то создавали дескриптор файла и считывали через gets, а он, естестенно ждет пока не придут пакеты с клиента. А в игре все норм. Даже если игрок больше не посылает пакеты, все рендерится, просчитывется. Это че игра тред создает для каждого подключения(или даже процесс, но это навряд ли)?
ILZM, sendto - это конечно для посылки. А ты спрашивал про чтение, я невнимательно прочёл. Для получения есть recvfrom.
Насколько я понял, основной твой вопрос заключается в том, как это всё работает без задержек. Сокет может быть установлен в неблокирующий режим через ioctlsocket (на Windows) и ioctl или fcntl. Собственно, в Quake так и делается.
Цитата:
ILZM писал: read
Для кроссплатформенности лучше использовать функции предназначенные именно для сокетов, а не файловых дескрипторов, ибо сокеты не везде являются файловыми дескрипторами.