doom2d.org

Главная база плоских морпехов
It is currently 23 Apr 2024, 20:48

All times are UTC + 3 hours




Post new topic Reply to topic  [ 7 posts ] 
Author Message
PostPosted: 13 Nov 2023, 18:22 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 6680
Location: Владивосток
Решил, что пора создать и такую тему.
Здесь я буду отчитываться по тем или иным вещам, которые почистил и/или исправил в текущих исходниках.
Всем остальным предлагаю делать то же самое.

Из недавнего:

  1. Убрал везде из исходников "rulez", "kastet" and "pulemet"; разве что оставил ITEM_WEAPON_SUPERPULEMET в качестве алиаса для совместимости с уже существующими текстовыми картами.
    https://repo.or.cz/d2df-sdl.git/commit/67d37ea13feeca0671d60d88b1963cf1e0e901c4
    https://repo.or.cz/d2df-editor.git/commit/a1e98e052e6d8dbf38d45d9ef7338bfd758b9f48
    https://github.com/Doom2D/DF-Res/commit/08172877ab51feafb50469523a6ebe738efdd16d

  2. Переделал работу с настройками сервера и "Своей игры" с низкоуровневых битовых операторов на родные паскалевские множества, как раз и предназначенные для таких вещей. Использование чистой битовой арифметики напрямую во FreePascal - это nekulturna, о чём говорит отсутствие даже отдельных операторов присваивания для них (то есть постоянно приходится писать 'x := x ...'). В целые же оно преобразуется точно так же, как будто это битовые поля обычные, но только если для представления связанного enum-типа хватит значений. Если не хватит - швырнёт ошибкой, так что здесь всё правильно.
    https://repo.or.cz/d2df-sdl.git/commit/5a9d04dfb16b32c84964c0940031606e7454259d
    Была мысль переделать это не на множества, а на структуру (или даже отдельные переменные), на что мне вдобавок указал DeaDDooMER в дев-чате, однако этого я делать не стал, так как иначе пришлось бы для передачи по сети собирать и разбирать их битовое представление вручную.

Что следующего из чисток приходит сходу на ум:

  • Переделать все константы-перечисления на нормальные enum'ы. Заодно устранить везде MAX-элементы (включая mapdef.txt) и вместо них использовать обычную функцию High(). Кетмар, если что, благословил. Естественно, для этого подобные перечисления не должны иметь разрывов в порядке нумерации. Также следует помнить, что Low() и High() для enum'ов возвращают минимальное и максимальное значение в них, а не индексы.

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

Из масштабных же переделок наиболее важными из-за своей критической необходимости видятся такие:

  • упрощение читалки карт с устранением mapdef.txt и переделыванием описания формата на основе RTTI (при всём уважении к ketmar'у);
  • перенос кода поддержки ZIP в игру, что позволит окончательно избавиться от sfs (опять же, при всём уважении к ketmar'у - именно благодаря ему оно у нас есть УЖЕ, а не потом).

Первостепенны они затем, что это позволит воссоединить обратно исходники игры и редактора, получив полноценную и единообразную поддержку ZIP'ов и текстовых карт.
Ну и вдобавок там ещё маячит допиливание ветки renders_updated, естественно.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 13 Nov 2023, 18:57 
Offline

Joined: 27 Apr 2020, 20:02
Posts: 220
Оффтоп:

Что это за кризис среднего возраста у тебя наступил?

Чёрный Думер wrote:
  • упрощение читалки карт с устранением mapdef.txt и переделыванием описания формата на основе RTTI (при всём уважении к ketmar'у);

Нет.

Чёрный Думер wrote:
  • перенос кода поддержки ZIP в игру, что позволит окончательно избавиться от sfs (опять же, при всём уважении к ketmar'у - именно благодаря ему оно у нас есть УЖЕ, а не потом).

Да.

Я очень старался над оформлением поста, не хватило на содержание.

Чёрный Думер wrote:
мне вдобавок указал DeaDDooMER в дев-чате

Теперь понятно, почему в основном чате катаются перекати поле, оказывается все тусят в девчате



Top
 Profile  
 
PostPosted: 13 Nov 2023, 22:03 
Offline
Приколист
User avatar

Joined: 04 Feb 2010, 14:42
Posts: 902
Location: Equestria
Чёрный Думер wrote:
Использовать везде по умолчанию элементарные типы (начиная от Integer с Cardinal и далее по списку), если только обратное не нужно явно. Особенно это относится к параметрам функций и индексным переменным в циклах типа for.
Не понял о фиксе чего идет речь.


Top
 Profile  
 
PostPosted: 14 Nov 2023, 11:06 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 6680
Location: Владивосток
DeaDDooMER» Не понял о фиксе чего идет речь.
Сейчас у нас код очень часто использует минимально необходимые по своим диапазонам типы. Скажем, если аргумент принимает значения от 0 до 15, то для него используется тип Byte. Проблема в том, что это не имеет ровным счётом никакого практического смысла, память таким образом никак толком не экономится - из-за выравнивания в структурах, передачи значений через регистры и тому подобного. А вот код от такого становится хуже. В-первых, производные от машинного слова типы обрабатываются медленнее, что связано с задержками невыровненного доступа. Во-вторых, конкретизация типов имеет смысл только при работе с памятью (и сетью как частным случаем этого), а поэтому неявно подразумевает, будто она имеет место, что ведёт к неправильным предположениям при чтении кода и затрудняет понимание. В-третьих, это требует дополнительных преобразований типов из-за строгой типизации. И так далее.

tl;dr: По умолчанию, если иное не требуется явно, везде должен использоваться следующий набор типов, в порядке от наиболее предпочтительных:

  • Integer - для всей простой арифметики (типа счётчиков в циклах) по умолчанию, причём как знаковой, так и беззнаковой.
  • Cardinal - для всех беззнаковых подсчётов, которым не хватило Integer.
  • Boolean - для всех логических выражений.
  • SizeUInt - для всех размеров данных и индексов по памяти, включая массивы (аналог size_t из Си).
  • SizeInt - для арифметики указателей (аналог ptrdiff_t из Си).
  • PtrUInt - если вдруг понадобилось работать с указателем в качестве целого числа (аналог uintptr_t из Си).
  • [U]Int{8|16|32|64} - для непосредственной работы с памятью, сетью и подобными вещами. Важно: эти типы не должны просачиваться в интерфейсы!

Этот перечень покрывает 80-90% случаев минимум.
Всё остальное, типа неявного по своему размеру LongInt со товарищи, вариаций вроде QWordBool (с True, равным -1), WinAPI'шных DWord и всяких там псевдонимных NativeInt / NativeUInt - от лукавого.
Про строковые и символьные типы здесь пока не заикаемся, это отдельная больная тема.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 15 Nov 2023, 20:04 
Offline
Приколист
User avatar

Joined: 04 Feb 2010, 14:42
Posts: 902
Location: Equestria
Использование беззнаковых тоже надо минимизировать. Вспоминается баг с залипанием на границах карты на не-x86. Не уверен, это баг фпц или undefined behavior в паскале.


Top
 Profile  
 
PostPosted: 15 Nov 2023, 20:14 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 6680
Location: Владивосток
DeaDDooMER» Использование беззнаковых тоже надо минимизировать. Вспоминается баг с залипанием на границах карты на не-x86.
Согласен, но это уже больше относится к полноценным переделкам, нежели обычному причёсыванию кода.

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
PostPosted: 01 Feb 2024, 19:27 
Offline
Принципиально неуничтожаем
User avatar

Joined: 18 Oct 2009, 04:01
Posts: 6680
Location: Владивосток
Задумчиво примериваясь к редактору, осуществил небольшую переделку:
https://repo.or.cz/d2df-editor.git/commit/c033a0384eaf960b3559a6f0dd374d5bf9c39d49

Теперь все формы создают себя сами в секции initialization, а не в начальном исходнике проекта, как это обычно принято в VCL / LCL / CLX и что там ещё было. Единственным исключением из этого является f_main, так как класс TApplication не предполагает иного варианта назначения главной формы приложения, кроме как создавать её первой исключительно через метод CreateForm().

Это позволило избавиться в Editor.lpr от длинной и ненужной этажерки из подключаемых модулей. Теперь там только то, что нужно непосредственно местному коду, либо же модули, которым требуется зарегистрироваться (сейчас это WADEDITOR_dfzip и WADEDITOR_dfwad).

Сюда решил написать потому, что между CreateForm() и TForm.Create() есть одно отличие, стоящее внимания: первый вариант перед вызовом TForm.Create() внутри себя успевает инициализировать глобальную переменную (singleton), соответствующую создаваемой форме. Это делается затем, чтобы можно было в условном обработчике FormCreate() вызывать внешний код, который к ней обращается. Однако это - антипаттерн, потому что во-первых остальные формы к этому моменту всё равно не проинициализированы, а во-вторых внешний код не должен быть привязан к конкретным экземплярам форм. Более того, синглтоны форм должны использоваться только самими формами для связи между собой, а в собственном коде им всегда следует обращаться к себе лишь через /неявный/ Self. Не поверите, но до моего коммита у нас было и обратное.

Напоследок хочу отметить ещё вот такое эмпирическое наблюдение. Если у нас есть экземпляр класса, обращение к которому производится не напрямую (скажем, через чужую промежуточную property), но для полноценной работы с ним всё равно приходится подключать содержащий его модуль, то такой код уже как бы сам намекает на свою кривоватость. У подобных классов все необходимые для их использования типы, константы и статические методы должны быть по возможности засунуты внутрь них самих - FreePascal это позволяет.

Ещё надо бы подумать об использовании class constructor / class desctructor вместо блоков initialization (begin..end) / finalization:
https://www.freepascal.org/docs-html/ref/refsu29.html

_________________
Чёрный Думер, Чёрный Думер
С монстрами сражается.
Чёрный Думер, Чёрный Думер
Рокетланчер плавится.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 7 posts ] 

All times are UTC + 3 hours


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
doom2d.org, since 2005