весёлые баги |
[Jun. 7th, 2019|12:19 am] |
я давно в курсе, что в демках (или по сетке — это одно и то же), ежели открыть дверь, а потом съёбать до того, как она закроется — то по возвращении дверь будет фактически закрыта, но визуально открыта. решил, наконец, починить.
надо сказать, что вавумчик — представитель племени «настоящего клиент-сервера», где server is The Authorithy. сам по себе клиент никаких действий не делает, даже двери не активирует: всё происходит на сервере, и присылается клиенту в виде обновлений.
поскольку слать обновления всего уровня никакого смысла нет, то вавумчик сначала опеределяет, что видит клиент. делает он это точно тем же алгоритмом, что и обычный рендер. рендер же тоже не обновляет положение вершин и текстуры, пока сегмент не попадает в камеру.
на этом месте люди, знакомые с работой современных думодвижков (или особо сообразительные) могут уже догадаться, где фигня. в принципе, информации достаточно. я не догадался, попробуйте вы.
отгадка для табуретов типа меня. да, сетевой протокол оптимизирован. то есть, сервер шлёт клиенту что-то только если: 1) сектор видимый, и 2) у сектора что-то изменилось. второе, в нашем случае, несущественно.
теперь ситуация: видимую дверь открыли и убежали. дверь где-то там закрылась, но клиенту об этом никто не сказал, конечно. так и должно быть. потом клиент прибегает посмотреть на дверь. и…
ок, надо всё-таки догадываться, что такое «закрытая дверь» в думе. обычно это сектор, у которого высота потолка равна высоте пола. очевидно, что клипер может использовать этот факт чтобы не рендерить ничего за дверью, когда она закрыта. и использует. также очевидно, что внутренности двери (боковухи и ты пы) при этом не видно. ну, закрыта она, не видно.
всё, догадались? ну да. клиент в последний раз видел дверь открытой. прибежал — она закрыта. то есть, сектор, у которого изменилась высота (сектор двери) не видно. а поэтому никто клиенту его обновления и не посылает. не видно его — чего посылать-то? поэтому клиент видит дверь в том состоянии, в котором видел в последний раз — открытой.
почему клиент через неё пробежать тогда не может, раз она открыта? а потому что server is The Authority. поскольку я писал демку, то там нет никакого latency. и клиент пытается забежать в дверь, посылает серверу об этом инфу, и сразу получает от сервера ответ: «стой на месте, холоп!» (ну, на деле всё чуть проще, потому что при записи демки серверный и клиентский уровни совпадают, глюк видно только при проигрывании).
в общем, при построении карты видимых секторов сервер должен использовать как реальные данные с уровня, так и запомненые, и мержить обе карты. тогда в реальной карте закрытая дверь (её внутренности) не видна, а в запомненой — видна. следовательно, дверь видна, и надо послать апдейт. как только я приделал эту штуку — баг, натурально, пропал.
p.s.: а как же оригинальный вавум работал, не могли же там этого бага не заметить? хм… а там этот баг просто не проявлялся. потому что там был другой баг, в клипере, и из-за ошибок округления клипер почти никогда не клипал закрытые двери. я баг в клипере починил — и всё, чётность багов нарушилась. |
|
|