crypt of decay - vavoom, рендер [entries|archive|friends|userinfo]
ketmar

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

vavoom, рендер [Oct. 1st, 2018|08:31 am]
Previous Entry Add to Memories Tell A Friend Next Entry
там, короче, плохо абсолютно всё. кроме того, конечно, что хорошо — а хорошо там почти всё.

а если серьёзно, то он был написан во времена одноядерных процессоров и OpenGL 1. поэтому на карте типа planisphere2, если смотреть вдоль улицы, то ~30 миллисекунд уходит на апдейт секторов (текстуры, высоты, всё вот это), а из оставшегося времени (осталось ~100 мсек — да, вот такой вот FPS) — две трети на бесполезную выборку примерно сорока тысяч сурфэйсов, и треть на то, чтобы затоссить их в GPU. это около ста тысяч вертексов всего.

естественно, по чистой логике — современный GPU должен всё это отрендерить быстрее чем фурри ебутся. но… OpenGL 1. он там был до тех пор, пока я не форкнул. а в то время даже display lists были медленные — и их в рендере нет.

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

не поймите меня неверно: рендер хороший. он делает вполне неплохой beam clipping, и нормально справляется с ~3000-7000 сурфэйсов, чего вполне достаточно для большинства нормальных уровней. на то время (>10 лет назад) этого было достаточно, да и других методов особо не существовало (consumer GPUs и сейчас сосают, а тогда вообще турбопылесосили). при этом там даже потенциально есть раздельный рендер пола/потолка и стен (на горизонтальных поверхностях текстуры меняются реже, например).

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

ну, то есть, тупо разбить view frustum на части, запустить в каждой по потоку с trace line (точнее, trace beam), отмечать каждый субсектор, попадающий в cell, как «рендерировай», а заодно использовать его для генерации cell coverage. всё равно преимущества zero overdraw от BSP не используются.

если кто не понял, почему planisphere2 так плохо: там у домов нет top texture. а клиппер умеет отмечать только полностью перекрытые вертикальные регионы. в итоге взгляд вдоль улицы рендерит абсолютно все дома, попавшие в FoV — хотя большинство из них и закрыты другими. даже если сделать вертикальное отсечение — это поможет мало, потому что карта сама по себе двухмерная, и BSP тоже. поэтому время на скан дерева (которое две трети кадра отъедает, напомню) всё равно никуда не денется. ну, станет вместо восьми FPS каких-нибудь десять-двенадцать. маргинальное улучшение — и куча бесполезного кода.

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

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


и про kdizd: kdizd делали жопорукие дегенераты. абсолютно все уровни — сверху донизу — засыпаны очень хуёво выравнеными слопами, которые неплотно примыкают к соседним секторам. gzdoom залепливает эти дырки текстурами, а вавум — нет. проверить же в gz я догадался далеко не сразу, и долгое время был уверен, что у вавума где-то баг.

вообще, если автор(ы) вада говорит(ят), что вад сделан под [g]zdoom — это в подавляющем большинстве случаев знак антикачества.
Linkmeow!

Comments:
From:(Anonymous)
Date:October 1st, 2018 - 09:09 am
(Link)
Почему ты не работаешь в GSC Game World?
(Replies frozen) (Thread)
[User Picture]
From:[info]ketmar
Date:October 1st, 2018 - 09:13 am
(Link)
а им что, нужен Самый Главный Директор По Всему?
(Replies frozen) (Parent) (Thread)
From:(Anonymous)
Date:October 1st, 2018 - 09:27 am
(Link)
работающий за еду над своими проектами и не мешающий другим процессам? я бы даже сказал "почему бы и нет".
(Replies frozen) (Parent) (Thread)
[User Picture]
From:[info]ketmar
Date:October 1st, 2018 - 09:34 am
(Link)
вот только еда им будет стоить дорого. $250,000/yr минимум.
(Replies frozen) (Parent) (Thread)
From:(Anonymous)
Date:October 1st, 2018 - 09:35 am
(Link)
ну тогда, видимо, нахуй?
(Replies frozen) (Parent)
From:(Anonymous)
Date:October 1st, 2018 - 09:57 am
(Link)
> $250,000/yr минимум
$60,000/yr твой потолок максимум
(Replies frozen) (Parent) (Thread)
[User Picture]
From:[info]ketmar
Date:October 1st, 2018 - 10:02 am
(Link)
когда мне понадобится консультация идиота — я тебя обязательно спрошу. а пока не спрашивал.
(Replies frozen) (Parent)
From:(Anonymous)
Date:October 1st, 2018 - 09:39 pm
(Link)
>осталось ~100 мсек — да, вот такой вот FPS

Это 8 (=1000/130) что ли?

А как это замеряется? Внутри когда счетчики, да?
From:(Anonymous)
Date:October 1st, 2018 - 09:41 pm
(Link)
>Это 8 (=1000/130) что ли

Ой. Я макака, сорри. Дочитал до несколько строчек ниже.
[User Picture]
From:[info]ketmar
Date:October 1st, 2018 - 09:43 pm
(Link)
да, это примерно 8 FPS для случая «смотрим на ОЧЕНЬ длинную улицу». катастрофа.

>А как это замеряется? Внутри когда счетчики, да?
угу. тупо `Sys_GetTime()` до и после.