Суббота, 21.06.2025, 10:37
| RSS
Главная | Ошибки компиляции - Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: GAL, r34_c7  
Ошибки компиляции
zombieДата: Пятница, 26.12.2008, 15:17 | Сообщение # 1
Admin
Группа: Администраторы
Сообщений: 401
Репутация: 33
Статус: Offline
Как известно, создание карты состоит из двух этапов: собственно, создание карты в Worldcraft или Valve Hammer Editor (файл rmf), и компиляция в bsp, который уже и загружается в Counter-Strike. Вот именно об этом мы сейчас и поговорим.
На самом деле компиляторы не понимают бинарный файл rmf, для компиляции карту нужно сначала сохранить в текстовый файл map. При использовании стандартной компиляции из WC или VHE (их компиляторы абсолютно идентичны) эта операция (Export to MAP) осуществляется автоматически при нажатии Run map (F9). А вот при компиляции с помощью ZHLT делать всё придёться вручную: File->Export to MAP.
Как уже упоминалось выше, существуют два принципиально разных типа компиляторов: стандартные (qcsg.exe, qbsp2.exe, vis.exe, qrad.exe), входящие в поставку WC, и ZHLT - так называемые Зонеры (hlcsg.exe, hlbsp.exe, hlvis.exe, hlrad.exe). Существует общепринятое и достаточно объективное мнение, что по всем параметрам ZHLT опережают стандартные компиляторы. С Зонерами проще искать и исправлять ошибки, качество обработки готовых BSP при компиляции Зонерами получается выше (меньше тормозов), к тому же, у ZHLT значительно больше параметров, что позволяет более гибко настроить компиляцию под конкретную карту. К преимуществам Зонеров следует также отнести возможность "вшивания" текстур в BSP, чего не позволяют стандартные компиляторы... О достоинствах ZHLT можно писать ещё много, особенно если рассматривать улучшенную версию ZHLT Custom build, имеющую такую полезнейшую функцию, как режим экономии clipnodes. Некоторые особо сложные карты откомпилировать чем-либо другим, кроме ZHLT Custom build просто невозможно...
Про стандартную компиляцию из WC было достаточно подробно написано в Уроке №1, по-этому я не буду на этом останавливаться. Хочу лишь заметить, что стандартная компиляция - это по большому счёту позапрошлый век... Рассматривать мы будем компиляцию с помощью ZHLT Custom build 1.7, т.к. на данный момент это самый лучший из всех возможных вариантов.
Есть мнение, что bat-файлы - пережитки эпохи DOS и что в наш высокотехнологичный век Windows следует использовать графические оболочки, наподобие Worldcraft. Тоесть, просо в настройках программы указать компиляторы Зонера (вместо стандартных) и компилировать нажатием F9. Всё вроде правильно: компиляция нажатием одной кнопки, не надо переводить карту в MAP, да и bat-файл выдумывать не надо... Только у такого подхода есть по меньшей мере два недостатка, заставляющие отказаться от этой идеи. Дело в том, что в Windows нет ничего быстрее консольных приложений, и компиляторы (и стандартные, и ZHLT) относятся именно к ним. А вот Worldcraft - нет. Это самое обычное GUI приложение, ещё и с использованием OpenGL! И не удивительно, что Worldcraft занимает аж 25 мегабайт оперативной памяти. А если учесть, что для компиляции крупной карты потребуеться не менее 400 мегабайт (с файлом подкачки), то выбрасывание "на ветер" 25 метров быстрой физической памяти в замен на медленную виртуальную в разы увеличит время обработки света... Ну и, как уже упоминалось, Worldcraft не есть консольным приложением, а компиляторы как раз таковыми являются, и естественно, что Worldcraft не будет успевать за компиляторами и не сможет отображать ход компиляции и процент завершения. Это может привести к тому, что мэппер поставит на компиляцию большую карту и не будет знать идёт ли компиляция или всё уже давно зависло... А вот cmd.exe (чем по сути и являеться bat-файл) - приложение консольное и лишено всех вышеперечисленных недостатков Worldcraft.
Это было, так сказать, вступление. Надеюсь, я всех убедил в необходимости использования ZHLT и именно посредством bat-файлов. Если это так, то тогда приступим. Допустим, карта у нас уже есть, переведём её в MAP, для чего выполним File->Export to MAP и в открывшемся окне выберем папку назначения (папку с ZHLT). На этом работа с WC закончена и его можно закрывать. Далее нужно создать bat-файл, для этого запускает любой текстовый редактор (Блокнот сойдёт) и пишем в нём следующий текст:
e:
hlcsg mapname
hlbsp mapname
hlvis mapname
hlrad mapname

В данном примере ZHLT, Worldcraft и Counter-Strike расположены на диске E: (обратите внимание, они должны распологаться на одном диске), что и указано в первой строке. Вторая строка запускает hlcsg.exe с параметром mapname, соответствующем имени карты (mapname.map). Далее, по завершении CSG-компиляции, запуститься hlbsp.exe, затем hlvis.exe и hlrad.exe. Это, так сказать, простейший случай. Результат будет близок к стандартной компиляции. Для отображения процесса компиляции в нормальном виде (в процентах) следует ко всем компиляторам добавить параметр -estimate:
e:
hlcsg -estimate mapname
hlbsp -estimate mapname
hlvis -estimate mapname
hlrad -estimate mapname

Для того, чтоб компилятор выдал информацию о карте (необходимо для отладки и оптимизации) укажите -chart. Данный параметр достаточно указать для одного компилятора, лучше для hlcsg.exe, т.к. он работает самым первым и с ним реже всего случаются ошибки. Тоесть, в случае чего, информация будет отпечатана до возникновения ошибки и значит, имея информацию, с этой ошибкой будет проще бороться...
Для более качественной обработки карты следует указать -full для hlvis.exe и
-extra для hlrad.exe. В таком случае будет производиться "чистовая" компиляция, которая, правда, займёт несколько больше времени, но результат будет значительно лучше:
e:
hlcsg -estimate -chart mapname
hlbsp -estimate mapname
hlvis -estimate -full mapname
hlrad -estimate -extra mapname

В принципе, этот вариант файла вполне подходит для компиляции большинства карт с отличным результатом. По-этому, сохраняем его с расширением *.bat (имя не имеет значения) в папке с ZHLT и запускаем его как обычную программу. По прошествии определённого времени, если нет ошибок, в этой же папке появиться готовый BSP. Кроме того, компиляторы создают текстовый log-файл, содержащий весь процесс компиляции. В случае же ошибки создаёться err-файл с информацией об ошибке, которую необходимо исправить.
Компиляция больших и сложных карт может занять значительное время, особенно, если на карте присутствуют некритические ошибки, корректируемые при полной VIS-компиляции. В таких случаях VIS-компиляция может занимать до 70% всего времени компиляции и растянуться на несколько часов. Как известно, время компиляции напрямую зависит от производительности системы и объёма оперативной памяти. Т.е. чем выше эти показатели, тем быстрее пройдёт компиляция. Именно с целью ускорить компиляцию и был создан клон hlvis.exe - программа netvis.exe, позволяющая компилировать одну карту на нескольких машинах одновременно! Это может существенно сократить время VIS-компиляции, т.к. над одним процессом одновременно будут трудиться 2, 3 или больше процессоров! Использовать netvis.exe крайне просто: нужно лишь иметь работоспособную сеть и немного изменить bat-файл. Вместо строки
hlvis -estimate -full mapname

следует указать строку
netvis -estimate -full -server mapname

И запустить этот файл на вашем компе, который будет основным и будет производить всю компиляцию (CSG, BSP, VIS, RAD). На остальных компах сети нужно запустить bat-файл следующего содержания (предварительно скопировав туда ZHLT):
netvis -connect IP_address

Вместо IP_address следует указать IP-адрес основного компа (сервера). В необходимый момент (при VIS-компиляции) клиенты подключатся к серверу и помогут ему произвести сложные и многочисленные рассчёты, тем самым сократив время. После этого netvis-клиенты благополучно завершатся, а сервер приступит к RAD-компиляции. Вы спросите, а почему существует лишь VIS-компиляция по сети? Нельзя ли сделать все компиляторы сетевыми и ускорить всю компиляцию. Ну по первым двум этапам ответ очевиден: CSG и BSP проходят и так достаточно быстро, т.е. их нет смысла компилировать на нескольких компах. А вот RAD-компиляция в большинстве случает проходит даже дольше, чем VIS. Но вот в чём дело: в отличие от VIS-компиляторов, компиляторы RAD не просто проводят сложные рассчёты, но и оперирует со значительными объёмами данных (для средней карты это несколько десятков-сотен мегабайт, обычно 150-200). Если при VIS-компиляции основная нагрузка приходится на процессор, то при RAD-компиляции нагружен как процессор, так и память. Другими словами, пропускной способности сети даже в 100Mbit/sec будет просто не хватать. И ускоритель превратится в "тормозитель" всего процесса.
Существует ещё много параметров компиляции, но это уже относиться к тонкостям работы движка и их использование оправдано лишь в редких случаях, когда другими способами устранить ту или иную ошибку просто невозможно. Их изменение, как правило, приводит к ухудьшению качества компиляции...

Ошибки компиляции

Выше мы рассматривали лишь идеальный вариант, когда карта компилируется без проблем с первого раза. Но на практике такое бывает редко, особенно если карта сложная. По-этому, нам просто необходимо рассмотреть возможные ошибки компиляции и способы их устранения. Лично я делю ошибки на объективные (связанные с особенностями движка) и появившиеся от "кривых рук", т.е. ошибки в самом map-файле, при чём в последних всегда виноват именно мэппер. Давайте сейчас рассмотрим ошибки, допущенные мэппером на этапе создания карты:

1. Brush with coplanar faces
Дело в том, что в движке HL плоскость и фэйс - понятия одинаковые, в отличие от Worldcraft, где в следствии неправильной работы с вертексами на одной плоскости может оказаться 2 и более фэйсов:

рис. 1 - Все фэйсы лежат в разных плоскостях

рис. 2 - Два фэйса лежат в одной плоскости

Методом устранения данной ошибки является удаление лишнего фэйса или всего браша с ошибкой и заменой его на нормальный. Найти бракованый браш можно, зная его номер, который указан в сообщении об ошибке в файле имя_карты.err или log-файле. В сообщении должна быть такая строка:
Entity 16, Brush 0, Side 5: has a coplanar plane at (-234, -9, 431), texture C1A0_LABGLU

Это обозначает, что ошибка содержится в entity №16 (какой-то solid-based entity). Далее уже в Worldcraft выполняем Map->Go to brush number... (Ctrl+Shift+G) и в открывшемся окне указываем номер нужного браша или entity. Затем или заменяем неправильный браш на нормальный, или заходим в Vertex tool и перетягиваем лишнюю вершину на другую:

рис. 3 - Перетаскиваем среднюю вершину

рис. 4 - Совмещаем её с другой вершиной

На вопрос Merge vertices? отвечаем Да.

2. Plane with no normal
Данная ошибка возникает также при неправильной работе с вертексами. Дело в том, что любая плоскость должна быть определена тремя точками. Если две из них совпадают, то это уже не плоскость, а прямая (а если все три - то точка). Исправляется удалением глючного браша и заменой на нормальный.

3. Brush 'outside world'
Ошибка вызвана "вылезанием" определённого браша за пределы рабочего пространства. Т.е. если одна из координат браша превышает +/-9000, то такой браш надо удалить. Также, возможно возникновение этой ошибки, если браш находится ближе 64 пунктов от границы пространства, в таком случае его надо сдвинуть к центру.

4. Mixed face contents
Ошибка появляется вследствие комбинирования текстур, несовместимых с другими, на одном браше с другими текстурами. Например, если браш со всех сторон окрашен обычной текстурой, а с одной текстурой CLIP, то это приведёт к ошибке. Лечится нанесением на все стороны совместимых текстур.

5. === LEAK in hull 0 ===
Очень распрастранённая ошибка. Возникает вследствие "дырки" на карте в окружающее пространство. Исправляется устранением "дырки". В самом простом случае достаточно окружить карту SKY-коробкой, но это не есть гуд (см. статью Оптимизация карты). По-этому, лучше воспользоваться поинтфайлом. Копируем в папку maps файлы BSP и PTS, загружаем карту и в консоли пишем pointfile. "Дырки" будут отмечены пунктиром...

6. Bad Surface Extents
Данная ошибка встречается в случаях использования излишне растянутых текстур (Scale более 10). Уменьшите Scale и ошибка исчезнет.

7. Missing [ in texturedef
Наиболее распрастранённой причиной данной ошибки является отсутствие на некоторых фэйсах текстур. Эту ошибку легко обнаружить по Alt+P в редакторе. Другие возможные причины: какая-то текстура имеет пробел в названии, карта импортирована из Worldcraft 3.3 в Worldcraft 2.1, 2.0, карта импортирована из Worldcraft 3.3 в Quark.

Следующие ошибки относятся к, так называемым, объективным, т.е. связанные с ограничениями в движке или компиляторах:

1. Memory allocation failure
Не хватает памяти. Увеличте ОЗУ или файл подкачки. Это именно то, о чём я писал при сравнении компиляции из WC с компиляцией bat-файлом.

2. Exceeded MAX_MAP_PLANES
Превышено максимальное количество плоскостей (32767). В данном случае нужно упрощать карту.

3. Exceeded MAX_MAP_TEXTURES
Превышено максимальное количество текстур. Необходимо уменьшить количество текстур.

4. Exceeded MAX_MAP_MIPTEX
Превышено максимально допустимое количество памяти для текстур (4194304 байт). Необходимо уменьшить количество или размер текстур. Также можно установить параметр -texdata x для всех компиляторов, чем увеличить этот лимит.

5. Exceeded MAX_MAP_BRUSHES
Превышено максимальное количество брашей (8192). Нет другого выхода, кроме как уменьшить число брашей.

6. Exceeded MAX_MAP_ENTITIES и Exceeded MAX_ENGINE_ENTITIES
Я не понимаю разницы между этими ошибками. Обе обозначают превышение максимального числа entity. Опять же способ один - уменьшить число entity.

7. Exceeded MAX_MAP_MODELS
Превышено максимальное количество solid-based entity (400). Необходимо уменьшить их число, например все func_wall превратить в один объект.

8. Exceeded MAX_MAP_CLIPNODES
Превышение максимального числа клипнодов (32767). Здесь следует пояснить. В движке HL вокруг каждого объекта создаётся определённое число клипнодов - невидимых плоскостей, через которые нельзя пройти. Количество клипнодов пропорционально числу фэйсов объекта, т.е. чем сложней конфигурация карты, тем больше клипнодов создаст компилятор. Уменьшить количество клипнодов можно несколькими способами: окружить сложные объекты CLIP-брашами, использование ZHLT Custom build 1.7 (режим экономии клипнодов, по-умолчанию включен), превращение некоторых объектов в func_illusionary (работает почему-то только с ZHLT Custom build 1.7). Теперь по-порядку. В комплект ZHLT 2.5.3 входит карта-пример, наглядно демонстрирующая использование CLIP-брашей для уменьшения числа клипнодов. Суть заключается в том, что некий сложный объект, создающий вокруг себя сотни клинодов полностью погружается в CLIP-браш, т.е. внешние стороны этого объекта скрываются плоскими гранями CLIP-браша. Получается, что объект перестаёт быть "сложным" с точки зрения клипнодов, оставаясь визуально сложным. Количество клипнодов резко уменьшается. К сожалению, данный метод работает лишь с простыми брашами, с entity эта фишка не "прокатит". Вторым способом является использование ZHLT Custom build 1.7 с включенным режимом экономии клипнодов. Достаточно просто компилировать этими компиляторами, и количество клипнодов уменьшится на 20 - 30%. Ну и третим, наиболее очевидным, способом является использование func_illusionary в местах, где это допустимо (например, светильники на потолке - в них игрок никогда не сможет упереться). Очевиден он потому, что клипнод - плоскость, через которую нельзя пройти, а через func_illusionary можно пройти (в этом и смысл этого объекта). Тоесть, очевидно, что func_illusionary не создаёт клипнодов (иначе через него нельзя было б пройти). Но по неизвестным мне причинам все компиляторы, кроме ZHLT Custom build 1.7, создают клипноды и для func_illusionary! Я предпологаю, что там создаются какие-нибудь NULL-клипноды, т.е. клипноды с размерами, равными нулю, но влияющие на число клипнодов на карте. Ещё хочу заметить, что в официальной и не очень документации по мэппингу сказано, что entity вообще не влияют на клипноды (не создают их), но тогда почему нельзя пройти сквозь func_wall? Я провёл эксперимент, и оказалось, что это утверждение (entity вообще не влияют на клипноды) не соответствует действительности. Более того, func_wall создаёт больше клипнодов, чем простой браш. И это просто объяснить, если внимательно прочитать статью Оптимизация карты, где сказано, что entity не разбивают фэйсы на полигоны своими гранями. Отсюда следует, что у, например, куба func_wall существует всегда 6 фэйсов, а у простого браша - 5 (один сливается с полом). Вот и выходит, что entity совершенно закономерно имеет больше клипнодов.

9. Exceeded MAX_MAP_FACES
Превышено максимальное число полигонов (65535). Способы уменьшения читайте в статье Оптимизация карты.

10. Exceeded MAX_MAP_NODES
Превышено максимальное число секций (32767). Я не совсем понимаю понятие "секция", но в данном случае нужно упростить карту.

Далее конкретно по компиляторам. HLCSG:

1. Brush type not allowed in entity
Неизвестный тип point-based entity (в движке такого нет). Необходимо удалить этот объект.

2. Brush type not allowed in world
Неизвестный тип solid-based entity (в движке такого нет). Необходимо удалить этот объект.

3. Exceeded MAX_SWITCHED_LIGHTS
Превышено максимальное число light и light_spot. Уменьшите количество этих объектов.

4. No visibile brushes
На карте отсутствуют видимые объекты. Создайте видимый объект. (Сказочная ошибка)

5. Entity with ONLY an ORIGIN brush
Это уже более реально. solid-based entity состоит только из невидимых брашей (ORIGIN). Создайте правильный solid-based entity.

6. Could not find WAD file
Тут, я думаю, и так всё ясно. Отсутствует необходимый WAD-файл.

HLBSP:

1. Empty Solid Entity
На карте присутствует "пустой" solid-based entity, не содержащий ни одного браша. Исправляется удалением "пустого" энтити. Для этого в редакторе нажимаем Alt+P, находим строчку, например, Solid Entity (func_illusionary) is empty., выделяем её и жмём Go to error. Дальше закрываем окно с ошибками. Указатель мыши будет в виде "плюса", как будто находится над выделенным объектом. Но т.к. объект пустой (empty), то Worldcraft не в состоянии определить его координаты. Вобщем, дальше нажимаем Delete на клавиатуре и всё. Эти операции необходимо проделать для каждого Empty Solid Entity в отдельности!

2. Exceeded MAX_LEAF_FACES
На карте присутствует поврежденный браш или Scale текстуры слишком маленький (от -1 до 1). Удалите браш с ошибкой.

3. Can't open имя карты.p0
Хоть эта ошибка очень редкая , но всеже иногда возникает . Возможно она связана с тем , что компилятор по какой то причине не может создать данный файл . В этом случае рекомендуется , либо сменить имя компилируемого исходника , либо попробовать скомпилить исходник в другой папке с другими компиляторами .

HLVIS:

1. Exceeded MAX_PORTALS_ON_LEAF
Данная ошибка возникает или из-за браша с ошибкой (легко находится по Alt+P), или из-за превышения числа порталов на одной плоскости (256). Допустим, у нас есть большая комната с множеством выступов на стенах:

рис. 5 - Комната с множеством выступов

Получается, что одна комната соеденина с 38 другими (углубления в стенах). Т.к. максимальное число таких углублений (порталов) равно 256, то ошибка эта возникает крайне редко. Замена выступов на func_wall или другой solid-based entity приведёт к устранению этой ошибки, т.к. порталы просто не будут образовываться.

2. Leaf portal saw into leaf
Точная причина данной ошибки мне не совсем понятна. Известно лишь что она возникает из-за неточности работы компьютеров при вычислениях значений с плавающей точкой. Это происходит при разбиении одного портала на два, а из-за неточности вычислений они как бы смещаються друг относительно друга. Смещение получается крайне малым (порядка 0.001 пункта), но этого достаточно для возникновения ошибки. Как исправить? Можно попробовать найти отклонения одной из вершин браша от координатной сетки в Worldcraft и пересоздать такой браш. Ещё можно попробовать установить параметр для hlvis.exe -full, который автоматически корректирует большинство ошибок вычислений.

HLRAD:

1. Exceeded MAX_TEXLIGHTS
Превышено максимальное число светящихся текстур. Необходимо убрать некоторые такие такстуры.

2. Malformed face normal
Одна из текстур неправильно расположена на фэйсе. Исправляется по Alt+P (Texture axis perpindicular to face).

3. No Lights!
На карте отсутствуют источники света. Поставьте на карту light, light_environment или light_spot.

На этом, пожалуй, рассмотрение ошибок можно закончить. Остальные возможные ошибки являются внутренними ошибками компиляторов и исправить их изменениями карты невозможно. Нужно просто перезапустить компиляцию карты сначала. Удачной компиляции!




 
  • Страница 1 из 1
  • 1
Поиск:

zombie h2o © 2025