No i dla zainteresowanych krótka informacja odnośnie ww. systemu rysowania nametagów, z posta RoyAwesome na Reddicie.
W skrócie chodziło o to, że dotąd żeby pokazać nametag potrzebne były 3 kroki. Pierwszy - sprawdzenie czy nie ma przeszkód pomiędzy sojusznikiem a Tobą, drugi - sprawdzenie czy jest on we właściwej drużynie, trzeci: czy nametag może być pokazany.
Sprawdzenie braku przeszkód odbywało się poprzez robienie tzw "raycastów" - termin znany każdemu kto próbował chociażby przez chwilę swoich sił w robieniu gier. Chodzi o wyznaczenie linii łączącej punkty (w tym przypadku kamerę gracza z głową, tułowiem, oraz 4 punktami na kończynach sojusznika). Jeżeli nie ma przeszkód na tej drodze to nametag jest generowany, ale sami widzicie ile testów musiało zostać zrobionych. 6 "strzałów" razy X graczy na serwerze, co klatkę. Milisekundy w plecy. Zmieniono to na obecną w UE wartość "WasRecentlyRendered", która jest prawdziwa jeżeli obiekt był ostatnio widoczny. Ot taki tam tryk. Jedna linijka kodu.
Pełny tekst:
No i źródło: https://www.reddit.com/r/joinsquad/comme...75/d7u22bx
W skrócie chodziło o to, że dotąd żeby pokazać nametag potrzebne były 3 kroki. Pierwszy - sprawdzenie czy nie ma przeszkód pomiędzy sojusznikiem a Tobą, drugi - sprawdzenie czy jest on we właściwej drużynie, trzeci: czy nametag może być pokazany.
Sprawdzenie braku przeszkód odbywało się poprzez robienie tzw "raycastów" - termin znany każdemu kto próbował chociażby przez chwilę swoich sił w robieniu gier. Chodzi o wyznaczenie linii łączącej punkty (w tym przypadku kamerę gracza z głową, tułowiem, oraz 4 punktami na kończynach sojusznika). Jeżeli nie ma przeszkód na tej drodze to nametag jest generowany, ale sami widzicie ile testów musiało zostać zrobionych. 6 "strzałów" razy X graczy na serwerze, co klatkę. Milisekundy w plecy. Zmieniono to na obecną w UE wartość "WasRecentlyRendered", która jest prawdziwa jeżeli obiekt był ostatnio widoczny. Ot taki tam tryk. Jedna linijka kodu.
Pełny tekst:
Cytat:RoyAwesomeLead Programmer 3 punkty 3 godziny temu
So like, for example, the change made today to the nametags was pretty big in terms of performance, but was only a single line of code change.
So, to display nametags, we need to see if the other player is 1) Visible to you 2) On your team and 3) Can show his nametag. The #2 and #3 checks were very easy and quick (code wise) to do, but #1 is a total pain in the butt.
Any time you think "I need to check if something is visible", that means you need to figure out if something is in the way, and that usually means doing a physx raycast to see if there is anything blocking the ray between you and a player. A raycast isn't the most performant thing to do a bunch of times a frame, so we had to figure out a different way to do this because there was just too much time spent doing raycasts.
Luckily for us, UE4 has a "WasRecentlyRendered" call which returns true if the player's mesh was drawn the last frame. Meshes aren't drawn if they are occluded (blocked by something in your view) so we just used the previous frame's occlusion data to determine if the nametag should be displayed, instead of doing expensive raycasts. Turns out that the occlusion system does what it damn well pleases and sometimes will render something behind a wall, but it's good enough for almost every case. During hotfix testing, the testers felt that it gave them better awareness and didn't really hurt gameplay, so we just went with it.
So, while the logic and knowledge is kinda heavy, the actual change was very small. It was a single line of code to change "Visible To" from a raycast to checking if the other player was recently rendered.
No i źródło: https://www.reddit.com/r/joinsquad/comme...75/d7u22bx