Sprawozdanie: rzeczy
This commit is contained in:
parent
bcd17576bb
commit
c792f9fa86
@ -2,33 +2,29 @@
|
|||||||
\usepackage[T1]{fontenc}
|
\usepackage[T1]{fontenc}
|
||||||
\usepackage{polski}
|
\usepackage{polski}
|
||||||
\usepackage[utf8]{inputenc}
|
\usepackage[utf8]{inputenc}
|
||||||
|
\usepackage[polish]{babel}
|
||||||
\usepackage[margin=1.25in]{geometry}
|
\usepackage[margin=1.25in]{geometry}
|
||||||
\usepackage{alltt}
|
|
||||||
\usepackage{titling}
|
\usepackage{titling}
|
||||||
\usepackage{pdfpages}
|
\usepackage{pdfpages}
|
||||||
\usepackage{float}
|
\usepackage{float}
|
||||||
\usepackage{amsmath}
|
\usepackage{amsmath}
|
||||||
\usepackage{booktabs}
|
|
||||||
\usepackage{tabularx}
|
|
||||||
\usepackage{amstext}
|
\usepackage{amstext}
|
||||||
\usepackage{pgfplots}
|
\usepackage{pgfplots}
|
||||||
\usepackage{tikz}
|
\usepackage{tikz}
|
||||||
\usepackage{xspace}
|
|
||||||
\usepackage{enumerate}
|
\usepackage{enumerate}
|
||||||
\usepackage{lmodern}
|
\usepackage{lmodern}
|
||||||
\usepackage{amsfonts}
|
\usepackage{amsfonts}
|
||||||
\usepackage{mathtools}
|
\usepackage{mathtools}
|
||||||
\usepackage{alphalph}
|
|
||||||
\usepackage{algorithm}
|
\usepackage{algorithm}
|
||||||
\usepackage{algpseudocode}
|
\usepackage{algpseudocode}
|
||||||
\usepackage{wrapfig}
|
\usepackage{wrapfig}
|
||||||
\usepackage[polish]{babel}
|
|
||||||
\usepackage{braket}
|
\usepackage{braket}
|
||||||
\usepackage{subcaption}
|
\usepackage{subcaption}
|
||||||
\usepackage{multirow}
|
\usepackage{multirow}
|
||||||
\usepackage{etoolbox}
|
\usepackage{etoolbox}
|
||||||
\usepackage{color}
|
\usepackage{color}
|
||||||
\usepackage{pgfkeys}
|
\usepackage{pgfkeys}
|
||||||
|
\usepackage{siunitx}
|
||||||
|
|
||||||
\pgfplotsset{compat=1.15}
|
\pgfplotsset{compat=1.15}
|
||||||
\usepgfplotslibrary{groupplots}
|
\usepgfplotslibrary{groupplots}
|
||||||
@ -41,19 +37,41 @@
|
|||||||
\newcommand{\todo}[1]{{\color{blue}\textbf{TODO:} #1}}
|
\newcommand{\todo}[1]{{\color{blue}\textbf{TODO:} #1}}
|
||||||
|
|
||||||
\makeatletter
|
\makeatletter
|
||||||
\newrobustcmd{\member}[3][]{%
|
|
||||||
\ifcsdef{last}{\node[packet, right=of \last, text width=(#3*7.5mm)]}{\node[packet, text width=(#3*7.5mm)]} (#2)
|
|
||||||
{\texttt{#2}};%
|
|
||||||
\node[below=of #2] {#3};
|
|
||||||
\node[above=of #2.north, text depth=0pt] {\texttt{#1}};
|
|
||||||
\def\last{#2}%
|
|
||||||
}%
|
|
||||||
\newenvironment{packet}{%
|
\newenvironment{packet}{%
|
||||||
\begin{tikzpicture}[packet/.style={draw, auto, align=center, minimum height=7mm}, node distance=0]%
|
\def\byte{*8mm}%
|
||||||
|
|
||||||
|
\newrobustcmd{\member}[3][]{%
|
||||||
|
\node[packet, minimum width=##3\byte] (##2) {##2};
|
||||||
|
\node[below=of ##2] {##3};
|
||||||
|
\node[above=of ##2.north, text depth=0pt] {##1};
|
||||||
|
|
||||||
|
\tikzstyle{packet}+=[right=of ##2];
|
||||||
|
}%
|
||||||
|
|
||||||
|
\newrobustcmd{\preamble}[1][15]{%
|
||||||
|
\node[packet, minimum width=2\byte, dashed] (Preamble) {$\cdots$};
|
||||||
|
\node[below=of Preamble] {##1};
|
||||||
|
\node[above=of Preamble.north] {Preambuła};
|
||||||
|
|
||||||
|
\tikzstyle{packet}+=[right=of Preamble];
|
||||||
|
}%
|
||||||
|
|
||||||
|
\begin{tikzpicture}[%
|
||||||
|
packet/.style={draw, auto, align=center, minimum height=7mm, font=\ttfamily, right=of start},
|
||||||
|
optional/.style={dotted},
|
||||||
|
every node/.style={text depth=0pt},
|
||||||
|
node distance=0,
|
||||||
|
x=8mm, y=1.5cm
|
||||||
|
]%
|
||||||
|
\node (start) {};
|
||||||
}{%
|
}{%
|
||||||
\end{tikzpicture}%
|
\end{tikzpicture}%
|
||||||
\let\last\undefined
|
\let\byte\undefined
|
||||||
|
\let\member\undefined
|
||||||
|
\let\preamble\undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
\makeatother
|
\makeatother
|
||||||
|
|
||||||
% opening
|
% opening
|
||||||
@ -99,17 +117,16 @@ rozłączy bez konieczności przeprowadzania negocjacji.
|
|||||||
Dodatkowo, przyjmuje się zasadę, że każdy klient jest w 100\% odpowiedzialny za swoją część symulacji, dla której
|
Dodatkowo, przyjmuje się zasadę, że każdy klient jest w 100\% odpowiedzialny za swoją część symulacji, dla której
|
||||||
stanowi źródło prawdy. tj. każdy gracz wysyła tylko i wyłącznie informacje o zmianach rzeczy, na które on ma wpływ - np.
|
stanowi źródło prawdy. tj. każdy gracz wysyła tylko i wyłącznie informacje o zmianach rzeczy, na które on ma wpływ - np.
|
||||||
pozycję własnego czołgu, czy wystrzelenie pocisku. W gestii innych klientów jest przetworzyć te informację i
|
pozycję własnego czołgu, czy wystrzelenie pocisku. W gestii innych klientów jest przetworzyć te informację i
|
||||||
zsynchronizować się.
|
zsynchronizować się. Przewidziano również obiekty o zachowaniu deterministycznym, które każdy klient może aktualizować
|
||||||
|
samodzielnie w ramach swojej symulacji.
|
||||||
|
|
||||||
Takie podejście zapewnia brak konfliktu o zasoby, ponieważ każdy obiekt jest modyfikowany wyłącznie przez jedną osobę (a
|
Takie podejście zapewnia brak konfliktu o zasoby, ponieważ każdy obiekt jest modyfikowany wyłącznie przez jedną osobę,
|
||||||
co za tym idzie, jeden wątek) zatem nigdy nie nastąpi wyścig. \todo{Modyfikacja w trakcie odczytu? Ma znaczenie?}
|
zatem nigdy nie nastąpi konflikt. Nie występuje również problem odczytywania zmienionych danych ponieważ wyświetlanie
|
||||||
\areyousure{Przewidziano również wystąpowanie obiektów, które nie posiadają właściciela, a ich zachowanie jest w pełni
|
oraz aktualizacja stanu gry odbywają się w ramach jednego wątku.
|
||||||
deterministyczne zatem nie wymaga jawnej synchronizacji pomiędzy klientami.}
|
|
||||||
|
|
||||||
Każdy klient będzi obsługiwany przez 5 osobnych wątki, których kompetencje nie kolidują ze sobą:
|
Każdy klient będzie obsługiwany przez 4 osobnych wątki, których kompetencje nie kolidują ze sobą:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Renderowanie stanu symulacji
|
\item Aktualizacja i renderowanie stanu symulacji \label{thread:render}
|
||||||
\item Aktualizacja stanu (na podstawie kolejki akcji)
|
|
||||||
\item Input z sieci (obiór pakietów, kolejkowanie) \label{input:net}
|
\item Input z sieci (obiór pakietów, kolejkowanie) \label{input:net}
|
||||||
\item Input użytkownika (odczyt klawiatury itd.) \label{input:user}
|
\item Input użytkownika (odczyt klawiatury itd.) \label{input:user}
|
||||||
\item Output sieciowy (wysyłanie pakietów, retranmisje) \label{output:net}
|
\item Output sieciowy (wysyłanie pakietów, retranmisje) \label{output:net}
|
||||||
@ -121,8 +138,8 @@ kolejki nie zostanie uszkodzony, tj. żadna akcja nie zostanie wykonana 2-krotni
|
|||||||
Zostanie to osiągnięte poprzez ustawienie Mutexa\footnote{https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx}
|
Zostanie to osiągnięte poprzez ustawienie Mutexa\footnote{https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx}
|
||||||
w metodach.
|
w metodach.
|
||||||
|
|
||||||
\areyousure{Zakładamy, że akcje użytkownika muszą zostać zostać umieszczone na kolejce akcji natychmiastowo, zatem nie
|
Zakładamy, że akcje użytkownika muszą zostać zostać umieszczone na kolejce akcji natychmiastowo, zatem nie
|
||||||
ma potrzeby synchronizacji z siecią.} Co za tym idzie, dostęp do kolejki pakietów (potrzebnej ze względu na możliwość
|
ma potrzeby synchronizacji z siecią. Co za tym idzie, dostęp do kolejki pakietów (potrzebnej ze względu na możliwość
|
||||||
otrzymania pakietów w nieodpowiedniej kolejności) i jej obsługa będzie w całości po stronie wątku \ref{input:net} -
|
otrzymania pakietów w nieodpowiedniej kolejności) i jej obsługa będzie w całości po stronie wątku \ref{input:net} -
|
||||||
czyli problem wyścigów nie następuje.
|
czyli problem wyścigów nie następuje.
|
||||||
|
|
||||||
@ -147,18 +164,38 @@ dotarcia pakietów, brak gwarancji kolejności, brak gwarancji poprawności) prz
|
|||||||
\item pakiety mogą wymagać konkretnego poziomu stanu gry
|
\item pakiety mogą wymagać konkretnego poziomu stanu gry
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
|
\begin{figure}[H]
|
||||||
|
\centering
|
||||||
|
|
||||||
|
\begin{tikzpicture}[
|
||||||
|
client/.style = { circle, draw },
|
||||||
|
master/.style = { very thick },
|
||||||
|
node distance=2cm
|
||||||
|
]
|
||||||
|
\node[client, master] (C1) {$C_1$};
|
||||||
|
\node[client, right=of C1] (C2) {$C_2$};
|
||||||
|
\node[client, below=of C2] (C3) {$C_3$};
|
||||||
|
\node[client, left=of C3] (C4) {$C_4$};
|
||||||
|
|
||||||
|
\foreach \u/\v in {C1/C2,C1/C3,C1/C4,C2/C3,C2/C4,C3/C4} \draw[<->] (\u) -- (\v);
|
||||||
|
\end{tikzpicture}
|
||||||
|
|
||||||
|
\caption{Proponowana architektura sieciowa}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
Ze względu na konieczność szybkiego przesyłania informacji pomiędzy klientami, zaprojektowany protokół jest protokołem
|
Ze względu na konieczność szybkiego przesyłania informacji pomiędzy klientami, zaprojektowany protokół jest protokołem
|
||||||
binarnym, o konstrukcji pakietu widocznej poniżej.
|
binarnym, o konstrukcji pakietu widocznej poniżej.
|
||||||
|
|
||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\center
|
\center
|
||||||
\begin{packet}
|
\begin{packet}
|
||||||
\member{CRC32}{4}
|
\member{CRC16$_p$}{2}
|
||||||
\member{Type}{1}
|
\member{Type}{1}
|
||||||
\member{Size}{2}
|
\member{Size}{2}
|
||||||
\member{ClientId}{2}
|
\member{ClientId}{2}
|
||||||
\member{State}{4}
|
\member{State}{4}
|
||||||
\member{PacketId}{4}
|
\member{PacketId}{4}
|
||||||
|
\node[packet, dashed, right=of PacketId, text width=15mm] {CRC16$_d$};
|
||||||
\end{packet}
|
\end{packet}
|
||||||
|
|
||||||
\caption{Preambuła pakietu}
|
\caption{Preambuła pakietu}
|
||||||
@ -168,12 +205,13 @@ binarnym, o konstrukcji pakietu widocznej poniżej.
|
|||||||
\centering
|
\centering
|
||||||
\begin{tabular}{l|l|l}
|
\begin{tabular}{l|l|l}
|
||||||
\textbf{Właściwość} & \textbf{Typ} & \textbf{Opis} \\ \hline
|
\textbf{Właściwość} & \textbf{Typ} & \textbf{Opis} \\ \hline
|
||||||
\texttt{CRC32} & \texttt{int32} & Suma kontrolna danych w pakiecie \\
|
\texttt{CRC16$_p$} & \texttt{int16} & Suma kontrolna danych w preambule \\
|
||||||
\texttt{Type} & \texttt{uint8} & Rodzaj wysyłanego pakietu \\
|
\texttt{Type} & \texttt{uint8} & Rodzaj wysyłanego pakietu \\
|
||||||
\texttt{Size} & \texttt{uint16} & Rozmiar wysłanych danych, razem z pierwszym bajtem \\
|
\texttt{Size} & \texttt{uint16} & Rozmiar wysłanych danych, razem z pierwszym bajtem \\
|
||||||
\texttt{ClientId} & \texttt{uint16} & Identyfikator klienta \\
|
\texttt{ClientId} & \texttt{uint16} & Identyfikator klienta \\
|
||||||
\texttt{State} & \texttt{uint32} & Wymagany stan gry do przetworzenia pakietu \\
|
\texttt{State} & \texttt{uint32} & Wymagany stan gry do przetworzenia pakietu \\
|
||||||
\texttt{PacketId} & \texttt{uint32} & Timestamp oryginalnego wysłania pakietu
|
\texttt{PacketId} & \texttt{uint32} & Timestamp oryginalnego wysłania pakietu \\ \hline
|
||||||
|
\texttt{CRC16$_d$} & \texttt{int16} & Suma kontrolna danych pakietu (o ile jakieś są) \\
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
@ -190,7 +228,7 @@ W wypadku niezgodności przesłanej sumy kontrolnej z sumą wyliczoną po stroni
|
|||||||
\texttt{RET = 0x81}. Dla pakietów mało ważnych nie zachodzi potrzeba retransmisji.
|
\texttt{RET = 0x81}. Dla pakietów mało ważnych nie zachodzi potrzeba retransmisji.
|
||||||
|
|
||||||
Aby upewnić się, że transmisja ważnego pakietu się powiodła, każdy klient musi odpowiedzieć pakietem \texttt{ACK}
|
Aby upewnić się, że transmisja ważnego pakietu się powiodła, każdy klient musi odpowiedzieć pakietem \texttt{ACK}
|
||||||
(\texttt{Type = 0x80}). W wypadku, gdyby odpowiedź \texttt{ACK} nie dotarła w ciągu $t \text{ms}$ pakiet zostaje
|
(\texttt{Type = 0x80}). W wypadku, gdyby odpowiedź \texttt{ACK} nie dotarła w ciągu $t\ \si{ms}$ pakiet zostaje
|
||||||
wysłany ponownie.
|
wysłany ponownie.
|
||||||
|
|
||||||
W przypadku wielokrotnego otrzymania pakietu o tym samym \texttt{PacketId} (np. w wypadku automatycznej retramsnisji),
|
W przypadku wielokrotnego otrzymania pakietu o tym samym \texttt{PacketId} (np. w wypadku automatycznej retramsnisji),
|
||||||
@ -204,9 +242,9 @@ wzgledu na to, że \texttt{ACK} nie jest bezpośrednio związany z rozgrywką, w
|
|||||||
\begin{figure}[H]
|
\begin{figure}[H]
|
||||||
\center
|
\center
|
||||||
\begin{packet}
|
\begin{packet}
|
||||||
\member{CRC32}{4}
|
\member{CRC16$_p$}{2}
|
||||||
\member[Type]{0x80}{1}
|
\member[Type]{0x80}{1}
|
||||||
\member[Size]{17}{2}
|
\member[Size]{15}{2}
|
||||||
\member{ClientId}{2}
|
\member{ClientId}{2}
|
||||||
\member[State]{0}{4}
|
\member[State]{0}{4}
|
||||||
\member{PacketId}{4}
|
\member{PacketId}{4}
|
||||||
@ -215,6 +253,15 @@ wzgledu na to, że \texttt{ACK} nie jest bezpośrednio związany z rozgrywką, w
|
|||||||
\caption{Pakiet \texttt{ACK}}
|
\caption{Pakiet \texttt{ACK}}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Zestawienie połączeń}
|
||||||
|
Ze względu na to, że port na którym nasłuchują klienci nie jest deterministyczny istnieje konieczność wprowadzania
|
||||||
|
scentralizowanego \textit{lobby} pozwalającego na wymianę tych informacji pomiędzy klientami. Jedynym zadaniem
|
||||||
|
\textit{lobby} jest przechowywanie informacji o graczach chcących wspólnie zagrać, zatem nie zachodzi potrzeba szybkiego
|
||||||
|
działania.
|
||||||
|
|
||||||
|
Stąd przyjęto, że do realizacji lobby zostanie wykorzystany protokół TCP. Ze względu na to, że lobby stanowi jedynie
|
||||||
|
pośrednika do zestawiania połączeń, dokładny opis działania zdecydowano się pominąć.
|
||||||
|
|
||||||
\section{Rozwiązania}
|
\section{Rozwiązania}
|
||||||
O nie w tym wypadku też ciężko
|
O nie w tym wypadku też ciężko
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user