HLFX.Ru Forum
Показать все 4 сообщений этой темы на одной странице

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:
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, а он, естестенно ждет пока не придут пакеты с клиента. А в игре все норм. Даже если игрок больше не посылает пакеты, все рендерится, просчитывется. Это че игра тред создает для каждого подключения(или даже процесс, но это навряд ли)?


Отправлено 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


Для кроссплатформенности лучше использовать функции предназначенные именно для сокетов, а не файловых дескрипторов, ибо сокеты не везде являются файловыми дескрипторами.


Временная зона GMT. Текущее время 20:18.
Показать все 4 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024