vavoom, рендер |
[Oct. 1st, 2018|08:31 am] |
там, короче, плохо абсолютно всё. кроме того, конечно, что хорошо — а хорошо там почти всё.
а если серьёзно, то он был написан во времена одноядерных процессоров и 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 — это в подавляющем большинстве случаев знак антикачества.
|
|
|