crypt of decay - June 7th, 2019 [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

June 7th, 2019

весёлые баги [Jun. 7th, 2019|12:19 am]
[Tags|]

я давно в курсе, что в демках (или по сетке — это одно и то же), ежели открыть дверь, а потом съёбать до того, как она закроется — то по возвращении дверь будет фактически закрыта, но визуально открыта. решил, наконец, починить.

надо сказать, что вавумчик — представитель племени «настоящего клиент-сервера», где server is The Authorithy. сам по себе клиент никаких действий не делает, даже двери не активирует: всё происходит на сервере, и присылается клиенту в виде обновлений.

поскольку слать обновления всего уровня никакого смысла нет, то вавумчик сначала опеределяет, что видит клиент. делает он это точно тем же алгоритмом, что и обычный рендер. рендер же тоже не обновляет положение вершин и текстуры, пока сегмент не попадает в камеру.

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



отгадка для табуретов типа меня. да, сетевой протокол оптимизирован. то есть, сервер шлёт клиенту что-то только если: 1) сектор видимый, и 2) у сектора что-то изменилось. второе, в нашем случае, несущественно.

теперь ситуация: видимую дверь открыли и убежали. дверь где-то там закрылась, но клиенту об этом никто не сказал, конечно. так и должно быть. потом клиент прибегает посмотреть на дверь. и…

ок, надо всё-таки догадываться, что такое «закрытая дверь» в думе. обычно это сектор, у которого высота потолка равна высоте пола. очевидно, что клипер может использовать этот факт чтобы не рендерить ничего за дверью, когда она закрыта. и использует. также очевидно, что внутренности двери (боковухи и ты пы) при этом не видно. ну, закрыта она, не видно.

всё, догадались? ну да. клиент в последний раз видел дверь открытой. прибежал — она закрыта. то есть, сектор, у которого изменилась высота (сектор двери) не видно. а поэтому никто клиенту его обновления и не посылает. не видно его — чего посылать-то? поэтому клиент видит дверь в том состоянии, в котором видел в последний раз — открытой.

почему клиент через неё пробежать тогда не может, раз она открыта? а потому что server is The Authority. поскольку я писал демку, то там нет никакого latency. и клиент пытается забежать в дверь, посылает серверу об этом инфу, и сразу получает от сервера ответ: «стой на месте, холоп!» (ну, на деле всё чуть проще, потому что при записи демки серверный и клиентский уровни совпадают, глюк видно только при проигрывании).

в общем, при построении карты видимых секторов сервер должен использовать как реальные данные с уровня, так и запомненые, и мержить обе карты. тогда в реальной карте закрытая дверь (её внутренности) не видна, а в запомненой — видна. следовательно, дверь видна, и надо послать апдейт. как только я приделал эту штуку — баг, натурально, пропал.


p.s.: а как же оригинальный вавум работал, не могли же там этого бага не заметить? хм… а там этот баг просто не проявлялся. потому что там был другой баг, в клипере, и из-за ошибок округления клипер почти никогда не клипал закрытые двери. я баг в клипере починил — и всё, чётность багов нарушилась.
Link21 meows|meow!

истинно с жиру бесятся [Jun. 7th, 2019|04:10 pm]
я как-то не особо задумывался, откуда вылезли всякие «pride of lions», «school of fish», «pack of wolves», с какого хуя они все такие разные, и почему, например, у львей гордость, а у рыбок школа. ну, типа, выглядят по-разному, надо что-то придумать — отчего бы и да. а оказывается, это аристократы с жиру бесились.
Link16 meows|meow!

navigation
[ viewing | June 7th, 2019 ]
[ go | Previous Day|Next Day ]