fix: image & table references

This commit is contained in:
Martin Slachta
2026-08-03 16:49:37 +02:00
parent a0f17199a4
commit b254fdfaf8
7 changed files with 75 additions and 77 deletions
+6 -6
View File
@@ -176,15 +176,15 @@
\newlabel{fig:ecs_optimization_tracy_02}{{6.3}{43}{Optimalizace replikátoru}{figure.17}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {18}{\ignorespaces Analýza optimalizace replikátoru pro ECS}}{43}{figure.18}\protected@file@percent }
\BKM@entry{id=59,open,dest={73756273656374696F6E2E362E34},srcline={1210}}{5C3337365C3337375C303030365C3030302E5C303030345C3030305C3034305C3030304F5C303030705C303030745C303030695C3030306D5C303030615C3030306C5C303030695C3030307A5C303030615C303030635C303030655C3030305C3034305C3030306D5C303030615C3030306E5C303030615C3030315C3137365C303030655C303030725C303030615C3030305C3034305C3030307A5C3030305C3334315C3030306A5C3030306D5C3030315C313537}
\@writefile{lof}{\contentsline {figure}{\numberline {19}{\ignorespaces Porovnání serializátorů}}{44}{figure.19}\protected@file@percent }
\newlabel{table:serialization_comparison}{{6.3}{44}{Optimalizace replikátoru}{figure.19}{}}
\@writefile{lot}{\contentsline {table}{\numberline {1}{\ignorespaces Porovnání serializátorů}}{44}{table.1}\protected@file@percent }
\newlabel{t:serialization_comparison}{{1}{44}{Porovnání serializátorů}{table.1}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {6.4}Optimalizace manažera zájmů}{44}{subsection.6.4}\protected@file@percent }
\BKM@entry{id=60,open,dest={73756273656374696F6E2E362E35},srcline={1238}}{5C3337365C3337375C303030365C3030302E5C303030355C3030305C3034305C303030505C303030655C303030655C303030725C3030302D5C303030745C3030306F5C3030302D5C303030705C303030655C303030655C30303072}
\@writefile{lof}{\contentsline {figure}{\numberline {20}{\ignorespaces Porovnání algoritmů}}{45}{figure.20}\protected@file@percent }
\newlabel{table:range_query_comparison}{{20}{45}{Porovnání algoritmů}{figure.20}{}}
\@writefile{lot}{\contentsline {table}{\numberline {2}{\ignorespaces Porovnání algoritmů}}{45}{table.2}\protected@file@percent }
\newlabel{table:range_query_comparison}{{2}{45}{Porovnání algoritmů}{table.2}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {6.5}Peer-to-peer}{45}{subsection.6.5}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {21}{\ignorespaces Porovnání TCP a QUICr v peer-to-peer}}{46}{figure.21}\protected@file@percent }
\newlabel{fig:peer_to_peer}{{21}{46}{Porovnání TCP a QUICr v peer-to-peer}{figure.21}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {19}{\ignorespaces Porovnání TCP a QUICr v peer-to-peer}}{46}{figure.19}\protected@file@percent }
\newlabel{fig:peer_to_peer}{{19}{46}{Porovnání TCP a QUICr v peer-to-peer}{figure.19}{}}
\BKM@entry{id=61,open,dest={73656374696F6E2A2E33},srcline={1277}}{5C3337365C3337375C3030305A5C3030305C3334315C303030765C3030315C3033335C30303072}
\@writefile{toc}{\contentsline {section}{Z\'av\v er}{47}{section*.3}\protected@file@percent }
\babel@aux{czech}{}
+29 -29
View File
@@ -1,18 +1,18 @@
# Fdb version 4
["biber kidiplom"] 1777641420.71466 "kidiplom.bcf" "kidiplom.bbl" "kidiplom" 1785734460.88696 2
"kidiplom.bcf" 1785734460.76816 100507 e04409a00ea07820a76aae942e927593 "pdflatex"
["biber kidiplom"] 1777641420.71466 "kidiplom.bcf" "kidiplom.bbl" "kidiplom" 1785768556.90749 2
"kidiplom.bcf" 1785768556.78641 100507 e04409a00ea07820a76aae942e927593 "pdflatex"
(generated)
"kidiplom.bbl"
"kidiplom.blg"
(rewritten before read)
["makeindex kidiplom.idx"] 1777641420.69393 "kidiplom.idx" "kidiplom.ind" "kidiplom" 1785734460.88304 0
"kidiplom.idx" 1785734458.87112 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex"
["makeindex kidiplom.idx"] 1777641420.69393 "kidiplom.idx" "kidiplom.ind" "kidiplom" 1785768556.90414 0
"kidiplom.idx" 1785768554.95438 0 d41d8cd98f00b204e9800998ecf8427e "pdflatex"
(generated)
"kidiplom.ilg"
"kidiplom.ind"
(rewritten before read)
["pdflatex"] 1785734457.87696 "/home/martin/projects/kidiplom/kidiplom.tex" "kidiplom.pdf" "kidiplom" 1785734460.88327 2
"/home/martin/projects/kidiplom/kidiplom.tex" 1785734457.71009 133663 75349692139a27e411a43603765c9f1e ""
["pdflatex"] 1785768554.51574 "/home/martin/projects/kidiplom/kidiplom.tex" "kidiplom.pdf" "kidiplom" 1785768556.90431 2
"/home/martin/projects/kidiplom/kidiplom.tex" 1785768554.43737 133689 f87cd1543c2113704699ae0759e6f3ed ""
"/usr/share/texmf-dist/fonts/enc/dvips/base/8r.enc" 1775415801 4850 80dc9bab7f31fb78a000ccfed0e27cab ""
"/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ec.enc" 1775415801 2375 baa924870cfb487815765f9094cf3728 ""
"/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc" 1775415801 2405 5dcf2c1b967ee25cc46c58cd52244aed ""
@@ -246,40 +246,40 @@
"czech-iso.lbx" 1681557593 294 7ce53d925459ba9e674024c57d6c7af9 ""
"czech.lbx" 1681557593 23857 01707bd906156286610d5e5bcb06aa09 ""
"english-iso.lbx" 1681557593 292 ce1004c4c0d380cc5ae6d84de8c03da6 ""
"graphics/300playerstrace.png" 1775758530.81909 49763 3cc41557a1ddcc2acef988ea4667dfe8 ""
"graphics/300playerstrace.png" 1785767496.10094 49763 3cc41557a1ddcc2acef988ea4667dfe8 ""
"graphics/TcpIp.png" 1775414953.33879 64639 00f2319f3474a2ac8cf43569bc9af998 ""
"graphics/UP_znak.pdf" 1681557593 3121 caaf4f5447a3a0b25b356a30208583d1 ""
"graphics/ecs_optimization_tracy_01.png" 1776022974.05461 130401 258005bf8593377b2ff6bade36c08384 ""
"graphics/ecs_optimization_tracy_02.png" 1776023016.44493 121676 ab7b6fd1d3d0d0b0a564447c2067c920 ""
"graphics/grafana.png" 1777742255.36748 177249 00bc0e853ef0c5f6e56d0e482cd0070c ""
"graphics/http2.pdf" 1776969007.60601 46800 91209613d245a76f155c3f9e6f79cdf6 ""
"graphics/http3.pdf" 1776968997.16731 79793 31bf8e82583c4435518e5143b8792c85 ""
"graphics/integrationcomparison.pdf" 1785598900.05035 21400 e9a5f98ce0119825ff32deab9aeb8849 ""
"graphics/ecs_optimization_tracy_01.png" 1785767496.10294 130401 258005bf8593377b2ff6bade36c08384 ""
"graphics/ecs_optimization_tracy_02.png" 1785767496.10394 121676 ab7b6fd1d3d0d0b0a564447c2067c920 ""
"graphics/grafana.png" 1785767496.10494 177249 00bc0e853ef0c5f6e56d0e482cd0070c ""
"graphics/http2.pdf" 1785767496.10594 46800 91209613d245a76f155c3f9e6f79cdf6 ""
"graphics/http3.pdf" 1785767496.10594 79793 31bf8e82583c4435518e5143b8792c85 ""
"graphics/integrationcomparison.pdf" 1785767496.10694 21400 e9a5f98ce0119825ff32deab9aeb8849 ""
"graphics/kititle-cz-nofont.pdf" 1681557593 12762 4b9f69751f3c44debf721c7e80adffc7 ""
"graphics/latencycomparison.pdf" 1785598896.77326 20418 cce68df2d0a9cefe2fb78a48a6bd216b ""
"graphics/layer_architecture.pdf" 1785519927.28205 18700 76efc7ba73621fe471df54327abb2b71 ""
"graphics/lobby_ui.png" 1785589829.68089 17027 d525c244f118622ea99f3cb594f0d9a2 ""
"graphics/multi_player_game.pdf" 1785442795.86465 21498 2bd066f384a69add517f0e8976459706 ""
"graphics/peer_to_peer.pdf" 1785599197.29362 16751 004040111b685ec10da530255471392f ""
"graphics/latencycomparison.pdf" 1785767496.10694 20418 cce68df2d0a9cefe2fb78a48a6bd216b ""
"graphics/layer_architecture.pdf" 1785767496.10694 18700 76efc7ba73621fe471df54327abb2b71 ""
"graphics/lobby_ui.png" 1785767496.10794 17027 d525c244f118622ea99f3cb594f0d9a2 ""
"graphics/multi_player_game.pdf" 1785767496.10794 21498 2bd066f384a69add517f0e8976459706 ""
"graphics/peer_to_peer.pdf" 1785767496.10894 16751 004040111b685ec10da530255471392f ""
"graphics/playerbenchmark.png" 1774990129.78598 36699 4e11286fcaf50fefe34cf42456e981bc ""
"graphics/quic_handshake.pdf" 1777135207.08321 51400 2edd580d3287b4878651db3546952446 ""
"graphics/quicr_handshake.pdf" 1777671629.01477 54410 98ae3707915e14050914f5953b2aa2a7 ""
"graphics/single_player_game.pdf" 1785442493.01935 13333 4aa853afca2e648aa2538dafc63085da ""
"graphics/ui_showcase.png" 1785588400.769 84643 879725aac5c66e2603bf04c021a476bb ""
"graphics/zone_server_architecture.pdf" 1777668683.31198 89331 7bcdb7a734277a007eb50aab7d27d76c ""
"graphics/quic_handshake.pdf" 1785767496.10894 51400 2edd580d3287b4878651db3546952446 ""
"graphics/quicr_handshake.pdf" 1785767496.10994 54410 98ae3707915e14050914f5953b2aa2a7 ""
"graphics/single_player_game.pdf" 1785767496.11194 13333 4aa853afca2e648aa2538dafc63085da ""
"graphics/ui_showcase.png" 1785767496.11294 84643 879725aac5c66e2603bf04c021a476bb ""
"graphics/zone_server_architecture.pdf" 1785767496.11294 89331 7bcdb7a734277a007eb50aab7d27d76c ""
"iso-numeric.bbx" 1681557593 319 50b9ccdb608c40ac14dd498079e9ab29 ""
"iso-numeric.cbx" 1681557593 73 45828f8df9dead5135d2c8a727f5b601 ""
"iso.bbx" 1681557593 13233 9f9e9c852fe772bfe1efaacc6b415eb7 ""
"kibase.sty" 1681557593 23853 021ae8236751950ac5e18f6a5bcf1da7 ""
"kidiplom.aux" 1785734460.75516 33014 8f9de60623bd15db1cac21f140953644 "pdflatex"
"kidiplom.aux" 1785768556.77241 32997 6fcd3b61760a06b7f74e2a5f0be7026c "pdflatex"
"kidiplom.bbl" 0 -1 0 "biber kidiplom"
"kidiplom.cls" 1681557593 18598 7684b2d13ac67d7b017c4eea1e12fa0c ""
"kidiplom.glsdefs" 1777655247.6059 525 791a05cd0a9f8650067804d8f5ff3f41 ""
"kidiplom.ind" 1777641420.71105 0 d41d8cd98f00b204e9800998ecf8427e "makeindex kidiplom.idx"
"kidiplom.lot" 1785734460.76939 142 0f926846b4ca0023532a29a360cf54d1 "pdflatex"
"kidiplom.run.xml" 1785734460.76939 2535 4e001a965ee2f4de88dc6271855a61ea "pdflatex"
"kidiplom.tex" 1785734457.71009 133663 75349692139a27e411a43603765c9f1e ""
"kidiplom.toc" 1785734460.76939 5253 64abddb6b0acaee5064c1f803435fbd1 "pdflatex"
"kidiplom.ind" 1785767496.11494 0 d41d8cd98f00b204e9800998ecf8427e "makeindex kidiplom.idx"
"kidiplom.lot" 1785768556.78802 329 56a9512fa6a6e1efee513ea3d715497e "pdflatex"
"kidiplom.run.xml" 1785768556.78802 2535 4e001a965ee2f4de88dc6271855a61ea "pdflatex"
"kidiplom.tex" 1785768554.43737 133689 f87cd1543c2113704699ae0759e6f3ed ""
"kidiplom.toc" 1785768556.78802 5253 64abddb6b0acaee5064c1f803435fbd1 "pdflatex"
(generated)
"kidiplom.acn"
"kidiplom.aux"
+28 -32
View File
@@ -1,4 +1,4 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.6.8) 3 AUG 2026 07:20
This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.6.8) 3 AUG 2026 16:49
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
@@ -1502,33 +1502,33 @@ Overfull \hbox (0.28238pt too wide) in paragraph at lines 231--235
[10] [11] [12{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}{/usr/shar
e/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}{/usr/share/texmf-dist/fonts/enc/
dvips/lm/lm-rm.enc}]
<graphics/layer_architecture.pdf, id=206, 341.35529pt x 174.6525pt>
<graphics/layer_architecture.pdf, id=210, 341.35529pt x 174.6525pt>
File: graphics/layer_architecture.pdf Graphic file (type pdf)
<use graphics/layer_architecture.pdf>
Package pdftex.def Info: graphics/layer_architecture.pdf used on input line 31
2.
(pdftex.def) Requested size: 409.50119pt x 209.52332pt.
[13 <./graphics/layer_architecture.pdf>] [14]
<graphics/TcpIp.png, id=230, 805.0075pt x 512.91624pt>
<graphics/TcpIp.png, id=234, 805.0075pt x 512.91624pt>
File: graphics/TcpIp.png Graphic file (type png)
<use graphics/TcpIp.png>
Package pdftex.def Info: graphics/TcpIp.png used on input line 356.
(pdftex.def) Requested size: 409.50119pt x 260.91075pt.
[15]
[16 <./graphics/TcpIp.png>]
<graphics/http2.pdf, id=244, 275.10779pt x 225.7233pt>
<graphics/http2.pdf, id=248, 275.10779pt x 225.7233pt>
File: graphics/http2.pdf Graphic file (type pdf)
<use graphics/http2.pdf>
Package pdftex.def Info: graphics/http2.pdf used on input line 395.
(pdftex.def) Requested size: 196.5588pt x 161.2807pt.
<graphics/http3.pdf, id=245, 349.305pt x 262.0992pt>
<graphics/http3.pdf, id=249, 349.305pt x 262.0992pt>
File: graphics/http3.pdf Graphic file (type pdf)
<use graphics/http3.pdf>
Package pdftex.def Info: graphics/http3.pdf used on input line 401.
(pdftex.def) Requested size: 196.5588pt x 147.48642pt.
[17 <./graphics/http2.pdf> <./graphics/http3.pdf>]
[18] [19]
<graphics/quic_handshake.pdf, id=295, 243.79079pt x 327.14218pt>
<graphics/quic_handshake.pdf, id=299, 243.79079pt x 327.14218pt>
File: graphics/quic_handshake.pdf Graphic file (type pdf)
<use graphics/quic_handshake.pdf>
Package pdftex.def Info: graphics/quic_handshake.pdf used on input line 495.
@@ -1552,7 +1552,7 @@ Underfull \hbox (badness 10000) in paragraph at lines 643--643
120Hz a 240Hz.
[]
<graphics/single_player_game.pdf, id=315, 334.3692pt x 171.76169pt>
<graphics/single_player_game.pdf, id=319, 334.3692pt x 171.76169pt>
File: graphics/single_player_game.pdf Graphic file (type pdf)
<use graphics/single_player_game.pdf>
Package pdftex.def Info: graphics/single_player_game.pdf used on input line 64
@@ -1568,17 +1568,13 @@ Overfull \hbox (9.23495pt too wide) in paragraph at lines 657--658
Package hyperref Info: bookmark level for unknown lstlisting defaults to 0 on i
nput line 679.
[24] [25]
LaTeX Warning: Reference `fig:client_server_architecture' on page 26 undefined
on input line 734.
<graphics/multi_player_game.pdf, id=364, 385.44pt x 457.71pt>
<graphics/multi_player_game.pdf, id=369, 385.44pt x 457.71pt>
File: graphics/multi_player_game.pdf Graphic file (type pdf)
<use graphics/multi_player_game.pdf>
Package pdftex.def Info: graphics/multi_player_game.pdf used on input line 744
.
(pdftex.def) Requested size: 204.7506pt x 243.13689pt.
[26] [27 <./graphics/multi_player_game.pdf>]
[26] [27 <./graphics/multi_player_game.pdf>]
! Undefined control sequence.
l.783 ...World}, která reprezentuje stav a \inlcp
{ClientWorldController}, k...
@@ -1605,7 +1601,7 @@ LaTeX Warning: Reference `code:entity_spawn_message' on page 31 undefined on in
put line 841.
[31] [32]
<graphics/quicr_handshake.pdf, id=420, 337.26pt x 246.9225pt>
<graphics/quicr_handshake.pdf, id=426, 337.26pt x 246.9225pt>
File: graphics/quicr_handshake.pdf Graphic file (type pdf)
<use graphics/quicr_handshake.pdf>
Package pdftex.def Info: graphics/quicr_handshake.pdf used on input line 921.
@@ -1623,43 +1619,43 @@ a
[]
[35]
<graphics/zone_server_architecture.pdf, id=444, 453.61469pt x 298.23419pt>
<graphics/zone_server_architecture.pdf, id=449, 453.61469pt x 298.23419pt>
File: graphics/zone_server_architecture.pdf Graphic file (type pdf)
<use graphics/zone_server_architecture.pdf>
Package pdftex.def Info: graphics/zone_server_architecture.pdf used on input l
ine 1010.
(pdftex.def) Requested size: 409.50119pt x 269.24106pt.
<graphics/lobby_ui.png, id=445, 1929.2075pt x 1209.51875pt>
<graphics/lobby_ui.png, id=450, 1929.2075pt x 1209.51875pt>
File: graphics/lobby_ui.png Graphic file (type png)
<use graphics/lobby_ui.png>
Package pdftex.def Info: graphics/lobby_ui.png used on input line 1028.
(pdftex.def) Requested size: 409.50119pt x 256.73788pt.
<graphics/ui_showcase.png, id=446, 2566.58875pt x 1412.27625pt>
<graphics/ui_showcase.png, id=451, 2566.58875pt x 1412.27625pt>
File: graphics/ui_showcase.png Graphic file (type png)
<use graphics/ui_showcase.png>
Package pdftex.def Info: graphics/ui_showcase.png used on input line 1035.
(pdftex.def) Requested size: 409.50119pt x 225.32233pt.
[36 <./graphics/zone_server_architecture.pdf>] [37 <./graphics/lobby_ui.png> <
./graphics/ui_showcase.png>] [38]
<graphics/grafana.png, id=481, 2813.51125pt x 913.4125pt>
<graphics/grafana.png, id=486, 2813.51125pt x 913.4125pt>
File: graphics/grafana.png Graphic file (type png)
<use graphics/grafana.png>
Package pdftex.def Info: graphics/grafana.png used on input line 1068.
(pdftex.def) Requested size: 409.50119pt x 132.9362pt.
<graphics/300playerstrace.png, id=483, 1348.03625pt x 397.485pt>
<graphics/300playerstrace.png, id=488, 1348.03625pt x 397.485pt>
File: graphics/300playerstrace.png Graphic file (type png)
<use graphics/300playerstrace.png>
Package pdftex.def Info: graphics/300playerstrace.png used on input line 1082.
(pdftex.def) Requested size: 409.50119pt x 120.74449pt.
[39 <./graphics/grafana.png>]
<graphics/latencycomparison.pdf, id=492, 462.52798pt x 346.89601pt>
<graphics/latencycomparison.pdf, id=497, 462.52798pt x 346.89601pt>
File: graphics/latencycomparison.pdf Graphic file (type pdf)
<use graphics/latencycomparison.pdf>
Package pdftex.def Info: graphics/latencycomparison.pdf used on input line 112
6.
(pdftex.def) Requested size: 327.60219pt x 245.71564pt.
<graphics/integrationcomparison.pdf, id=494, 462.52798pt x 346.89601pt>
<graphics/integrationcomparison.pdf, id=499, 462.52798pt x 346.89601pt>
File: graphics/integrationcomparison.pdf Graphic file (type pdf)
<use graphics/integrationcomparison.pdf>
Package pdftex.def Info: graphics/integrationcomparison.pdf used on input line
@@ -1667,7 +1663,7 @@ Package pdftex.def Info: graphics/integrationcomparison.pdf used on input line
(pdftex.def) Requested size: 327.60219pt x 245.71564pt.
[40 <./graphics/300playerstrace.png>] [41 <./graphics/latencycomparison.pdf> <
./graphics/integrationcomparison.pdf>]
<graphics/playerbenchmark.png, id=600, 1926.19624pt x 1221.56375pt>
<graphics/playerbenchmark.png, id=605, 1926.19624pt x 1221.56375pt>
File: graphics/playerbenchmark.png Graphic file (type png)
<use graphics/playerbenchmark.png>
Package pdftex.def Info: graphics/playerbenchmark.png used on input line 1148.
@@ -1679,13 +1675,13 @@ Package pdftex.def Info: graphics/300playerstrace.png used on input line 1159.
(pdftex.def) Requested size: 409.50119pt x 120.74449pt.
[42 <./graphics/playerbenchmark.png>]
<graphics/ecs_optimization_tracy_01.png, id=611, 1707.37875pt x 472.76625pt>
<graphics/ecs_optimization_tracy_01.png, id=616, 1707.37875pt x 472.76625pt>
File: graphics/ecs_optimization_tracy_01.png Graphic file (type png)
<use graphics/ecs_optimization_tracy_01.png>
Package pdftex.def Info: graphics/ecs_optimization_tracy_01.png used on input
line 1174.
(pdftex.def) Requested size: 409.50119pt x 113.38686pt.
<graphics/ecs_optimization_tracy_02.png, id=612, 1196.47pt x 583.17876pt>
<graphics/ecs_optimization_tracy_02.png, id=617, 1196.47pt x 583.17876pt>
File: graphics/ecs_optimization_tracy_02.png Graphic file (type png)
<use graphics/ecs_optimization_tracy_02.png>
Package pdftex.def Info: graphics/ecs_optimization_tracy_02.png used on input
@@ -1708,7 +1704,7 @@ Underfull \hbox (badness 10000) in paragraph at lines 1226--1226
[]
[44] [45]
<graphics/peer_to_peer.pdf, id=636, 433.62pt x 361.35pt>
<graphics/peer_to_peer.pdf, id=639, 433.62pt x 361.35pt>
File: graphics/peer_to_peer.pdf Graphic file (type pdf)
<use graphics/peer_to_peer.pdf>
Package pdftex.def Info: graphics/peer_to_peer.pdf used on input line 1254.
@@ -1755,10 +1751,10 @@ Package logreq Info: Writing requests to 'kidiplom.run.xml'.
)
Here is how much of TeX's memory you used:
33720 strings out of 469481
635121 string characters out of 5469631
1771893 words of memory out of 5000000
61632 multiletter control sequences out of 15000+600000
33721 strings out of 469481
635135 string characters out of 5469631
1771888 words of memory out of 5000000
61633 multiletter control sequences out of 15000+600000
707308 words of font info for 103 fonts, out of 8000000 for 9000
24 hyphenation exceptions out of 8191
110i,11n,112p,2637b,2312s stack positions out of 10000i,1000n,20000p,200000b,200000s
@@ -1776,10 +1772,10 @@ are/texmf-dist/fonts/type1/public/lm/lmr8.pfb></usr/share/texmf-dist/fonts/type
/usr/share/texmf-dist/fonts/type1/public/lm/lmsy10.pfb></usr/share/texmf-dist/f
onts/type1/urw/courier/ucrb8a.pfb></usr/share/texmf-dist/fonts/type1/urw/courie
r/ucrr8a.pfb>
Output written on kidiplom.pdf (50 pages, 1162426 bytes).
Output written on kidiplom.pdf (50 pages, 1162962 bytes).
PDF statistics:
1008 PDF objects out of 1200 (max. 8388607)
757 compressed objects within 8 object streams
1011 PDF objects out of 1200 (max. 8388607)
760 compressed objects within 8 object streams
170 named destinations out of 1000 (max. 500000)
646 words of extra memory for PDF output out of 10000 (max. 10000000)
+2
View File
@@ -1,4 +1,6 @@
\babel@toc {czech}{}\relax
\contentsline {table}{\numberline {1}{\ignorespaces Porovnání serializátorů}}{44}{table.1}%
\contentsline {table}{\numberline {2}{\ignorespaces Porovnání algoritmů}}{45}{table.2}%
\babel@toc {czech}{}\relax
\babel@toc {czech}{}\relax
\babel@toc {english}{}\relax
BIN
View File
Binary file not shown.
Binary file not shown.
+10 -10
View File
@@ -731,11 +731,11 @@ S knihovnou se pracuje procedurálně, nikoliv objektově. Každý snímek je t
V předchozí části jsme představili základní implementaci hry pro jednoho hráče. V této části ukážeme, jak jsme hru rozšířili na síťový systém a umožnili hru více hráčů. To znamená, že více hráčů se může připojit do stejné instance hry a navzájem spolu interagovat.
Jako první jsme implementovali model klient-server. Diagram systému vidíme na obrázku \ref{fig:client_server_architecture}. Stav hry řídí autoritativní server, který ho replikuje klientům posíláním snapshotů. Klient zobrazuje stav hry hráči, stejně jako v případě hry jednoho hráče. Autorita serveru zjednodušuje konzistenci a detekci podvádění. Klienti na server neposílají svůj stav, ale pouze akce, které chtějí provést. Příkladem může být akce pohybu dopředu, kterou vyvolal hráč. Server má možnost akce odmítnout a libovolně interpretovat, protože konečné slovo má právě server. Server rozesílá klientům zprávy zvané snapshoty, které obsahují aktuální stav hry (např. pozice entit) a události pro jednorázové akce (např. událost o konci hry).
Jako první jsme implementovali model klient-server. Diagram systému vidíme na obrázku \ref{fig:multi_player_game}. Stav hry řídí autoritativní server, který ho replikuje klientům posíláním snapshotů. Klient zobrazuje stav hry hráči, stejně jako v případě hry jednoho hráče. Autorita serveru zjednodušuje konzistenci a detekci podvádění. Klienti na server neposílají svůj stav, ale pouze akce, které chtějí provést. Příkladem může být akce pohybu dopředu, kterou vyvolal hráč. Server má možnost akce odmítnout a libovolně interpretovat, protože konečné slovo má právě server. Server rozesílá klientům zprávy zvané snapshoty, které obsahují aktuální stav hry (např. pozice entit) a události pro jednorázové akce (např. událost o konci hry).
Druhá varianta je model peer-to-peer. Ten je složitější z hlediska konzistence. Účastníci si mezi sebou posílají akce a každý si udržuje svůj stav, který ale nikomu nereplikuje. Každý se tak chová jako server v modelu klient-server. Je potřeba, aby každý účastník měl kompletní historii akcí všech ostatních v systému ve správném pořadí. Tomuto se říká \uv{event-sourcing}. Nevýhoda je, že všichni hráči musejí mít historii stejnou, jinak dochází k desynchronizaci.
Druhá varianta je model peer-to-peer. Ta je složitější z hlediska konzistence. Účastníci si mezi sebou posílají akce a každý si udržuje svůj stav, který ale nikomu nereplikuje. Každý se tak chová jako server v modelu klient-server. Je potřeba, aby každý účastník měl kompletní historii akcí všech ostatních v systému ve správném pořadí. Tomuto se říká \uv{event-sourcing}. V případě, že se historie liší, dochází k nekonzistenci.
Druhá komplikace je, že výsledek každé aplikace akce být všude stejný. Problém nastává u generování pseudo-náhodných čísel nebo u integrace. Například fyzický engine postupně integruje pozice entit podle derivace, která je reprezentována vektorem zrychlení. Každá integrace musí definovat, o jak velký časový krok se jedná (tzv. delta-time) a všichni účastníci se na něm musejí shodnout. Různé délky by rychle způsobily desynchronizaci. Zároveň všechny pseudonáhodné generátory musejí mít stejný počáteční seed. Je třeba si dát pozor na aritmetriku s plovoucí desetinou čárkou, která na různých platformách může dopadnout trochu jinak. I malé rozdíly se mohou rychle projevit.
Druhá komplikace peer-to-peer je, že výsledek každé aplikace akce být všude stejný. Problém nastává u generování pseudo-náhodných čísel nebo u integrace. Například fyzický engine postupně integruje pozice entit podle derivace, která je reprezentována vektorem zrychlení. Každá integrace musí definovat, o jak velký časový krok se jedná (tzv. delta-time) a všichni účastníci se na něm musejí shodnout. Různé délky by rychle způsobily desynchronizaci. Zároveň všechny pseudonáhodné generátory musejí mít stejný počáteční seed. Je třeba si dát pozor na aritmetriku s plovoucí desetinou čárkou, která na různých platformách může dopadnout trochu jinak. I malé rozdíly se mohou rychle projevit.
Rozšířenou architekturu vidíme na obrázku \ref{fig:multi_player_game}. Hned si všimneme, že se svět rozdvojil na instanci na serveru a instanci na klientovi. Jsou to právě tyto dvě instance, které se snažíme posíláním zpráv synchronizovat. Řídící logiku jsme rozdělili na Server World Controller a Client World Controller. Všimněme si, že ovladač na klientovi ne nutně obsahuje systémy, které by měnili stav hry, ale pouze kopíruje to, co mu server poslal ve zprávě pro snapshot. Na druhou stranu posílá akce, které přečetl od hráče. Oba ovladače ale zapisují do své instance světa.
@@ -1183,9 +1183,7 @@ Replikátor pro každého klienta zjistil jeho zájem a pro každou entitu v ně
\caption{Analýza optimalizace replikátoru pro ECS}
\end{figure}
Replikátor jsme začali analyzovat do větších detailů. Na obrázku \ref{fig:ecs_optimization_tracy_02} vidíme, které jeho části zabrali jakou dobu. Zjistili jsme, že problém byl samotný ProtoBuf. Formát je podobně jako JSON dělaný pro složité struktury objektů. V našem případě je ale zpráva pro snapshot světa primitivní. Rozhodli jsme udělat porovnání s FlatBuffers. V testu jsme simulovali 100 snímků, tak, abychom si mohli dopředu alokovat všechnu potřebnou paměť, kterou můžeme mezi snímky využívat. Dopředu si vytvoříme vektor pozic, které v testu budeme serializovat. Stejně jako v replikátoru používáme architekturu orientovanou na ECS a procházíme všechny pozice, ty pak umisťujeme do alokovaných bloků paměti pro každého klienta a simulujeme tak skládání rámců, které můžeme odesílat. Všimli jsme si, že v případě primitivní zprávy, jako je snapshot stavu světa, by nám stačila klasická funkce ze standartní C knihovny zvaná \inlcpp{memcpy} a do testu jsme ji zařadili. Výsledky vidíme v tabulce \ref{table:serialization_comparison}.
\begin{figure}
\begin{table}
\begin{center}
\begin{tabular}{ | m{5em} | m{3cm}| m{3cm} | m{3cm} | }
\hline
@@ -1195,9 +1193,11 @@ Replikátor jsme začali analyzovat do větších detailů. Na obrázku \ref{fig
\hline
\end{tabular}
\caption{Porovnání serializátorů}
\label{t:serialization_comparison}
\end{center}
\label{table:serialization_comparison}
\end{figure}
\end{table}
Replikátor jsme začali analyzovat do větších detailů. Na obrázku \ref{fig:ecs_optimization_tracy_02} vidíme, které jeho části zabrali jakou dobu. Zjistili jsme, že problém byl samotný ProtoBuf. Formát je podobně jako JSON dělaný pro složité struktury objektů. V našem případě je ale zpráva pro snapshot světa primitivní. Rozhodli jsme udělat porovnání s FlatBuffers. V testu jsme simulovali 100 snímků, tak, abychom si mohli dopředu alokovat všechnu potřebnou paměť, kterou můžeme mezi snímky využívat. Dopředu si vytvoříme vektor pozic, které v testu budeme serializovat. Tímto zajistíme, že nebudeme měřit čas včetně alokace paměti. Stejně jako v replikátoru používáme architekturu orientovanou na ECS a procházíme všechny pozice, ty pak umisťujeme do alokovaných bloků paměti pro každého klienta a simulujeme tak skládání rámců, které můžeme odesílat. Všimli jsme si, že v případě primitivní zprávy, jako je snapshot stavu světa, by nám stačila klasická funkce ze standartní C knihovny zvaná \inlcpp{memcpy} a do testu jsme ji zařadili. Výsledky vidíme v tabulce \ref{t:serialization_comparison}.
Zjistili jsme, že problémem byl ProtoBuf a FlatBuffers by nám nepomohl. Nepřekvapilo nás, že memcpy byl nejrychlejší. Rozhodli jsme se, že pro serializaci a deserializaci snapshotů světa budeme používat vlastní serializaci.
@@ -1213,7 +1213,7 @@ Všimli jsme si, že replikátor trval každou iteraci kolem 60 milisekund. Nejp
Jedna s datových struktur, která má nízkou složitost pro dotaz na seznam entit ve vzdálenosti maximálně, je klasická mřížka. Charakteristika hráčů ve hrách je, že se hodně pohybují. Mřížka nepotřebuje žádný přepočet, ale pouze vložit do předem alokovaného bufferu, nebo z něj naopak odebrat.
\begin{figure}
\begin{table}
\begin{center}
\begin{tabular}{ | m{5em} | m{3cm} | m{3cm} | m{3cm} | }
\hline
@@ -1231,7 +1231,7 @@ Jedna s datových struktur, která má nízkou složitost pro dotaz na seznam en
\caption{Porovnání algoritmů}
\label{table:range_query_comparison}
\end{center}
\end{figure}
\end{table}
Testovali jsme 4 implementace, z toho 3 různé datové struktury a naivní přístup. Simulovali jsme pohyb 100 000 různých entit po dobu 100 snímků. Všechny možnosti představíme. Naivní přístup využívá pouze Pythagorovu větu, aby získal vzdálenost dvou bodů. Jediná optimalizace je vynechat odmocninu a umocnit místo toho vzdálenost. Druhá a třetí implementace využívá mřížku a entity rozděluje do svých polí. První je fixní mřížka, která je vhodná pro světy, které nemění svou velikost, jako např. World of Warcraft. Naopak hashovací mřížka přiřazuje entity do polí pomocí hashe jejich pozice. Jsou tak ideální pro dynamické a potenciálně nekonečné světy, jako např. Minecraft. Poslední je quad tree. Jedná se o obdobu stromu, kde vrcholy mají právě 4 potomky nebo žádného potomka. V tabulce \ref{table:range_query_comparison} vidíme výsledky testu. Celkový čas je milisekundách. Ve třetím a čvrtém sloupci je změřená část vkládání a dotazování. Díky tomu vidíme, že Quad tree má rychlejší dotazování, ale delší vkládání. Nejrychlejší je fixní mřížka. Má ale vysokou paměťovou náročnost a při použití je tak nutné zvážit, jestli není hashovací mřížka vhodnější. Quad tree implementace se ukázala jako nevhodná. S přibývající hloubkou je navíc pomalejší. Ideální se ukázali varianty s fixní a hashovací mřížkou.