Cheb's Game Engine

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: Cheb's Game Engine

Сообщение debi12345 » 18.01.2020 23:46:24

Кстати сейчас во всех языках мода (а может и устойчивый трэнд) на дженерики, некоторые новые уже завоевашие место под солнцем (Go, Rust) сразу идут без ООП но с дженериками - трэйтами. Даже в С++ появились трэйты (специализации дженериков под конкретые типы данных)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5543
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Alex2013 » 19.01.2020 00:20:01

debi12345 писал(а):Кстати сейчас во всех языках мода (а может и устойчивый трэнд) на дженерики, некоторые новые уже завоевашие место под солнцем (Go, Rust) сразу идут без ООП но с дженериками - трэйтами. Даже в С++ появились трэйты (специализации дженериков под конкретые типы данных)


ИМХО: Лучше бы Лямбда-функции в лазарус добавили . А то я пока великой-силы-дженериков не ощутил. :roll:
Только пару раз путался в библиотеке где их применяли . (Что дает ООП понятно сразу, а вот смысл дженериков( по русски "универсальников" :wink: ) ускользает что-то вроде "смеси обычного свойства класса с типом вариант" - что там такого, что нельзя сделать в обычном классе непонятно )
Alex2013
долгожитель
 
Сообщения: 1651
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 19.01.2020 00:31:19

, само по себе было ненормальностью и частным солучаем

Ага. Только вот почему-то в php строки не поломали, несмотря на все тектонические сдвиги на пути от 4 до 7 пыха. В Си строки никто не ломал поломали. Однажды написанный код - работает. В жаваскрипте никто строки не ломает.

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

Или этот " этот дождь на долго" ?

Строго говоря, пути - два. Переходить на C-style и использовать везде PAnsiChar в комбинации с strlen(), или просто забить на Паскаль как таковой, что проще и сделает тебя сильнее и универсальнее, как программиста.

По Фри Паскалю был нанесён чудовищной силы удар. Разрушение - без объективных причин, замечу - существующей кодовой базы, подрыв доверия старых пользователей, усложнение вхождения для новичков. И всё ради чего? Ради слепого копирования за Дельфи 10, где непойми кто принимает непойми какие решения на фоне съёживания пользовательской базы корпорации?

Результат:
1. Моё доверие к команде разработчиков утрачено необратимо.
2. Я не рекомендую никому учить или использовать Паскаль
(в отличие от, например, года 2014-го). Просто молчу об этом.

Движок я, конечно, доделаю, просто потому что. Объектная модель с её RTTI по прежнему остаётся удобной для моих целей, строки в игровом движке - не главное, существующую уродливую кривизну RTL Фри Паскаля я уже заткнул собственными заплатками. Но в перспективе стоит проблема выбора языка для дальнейшей работы. Потому что сломали строки - сломают ещё что-нибудь жизненно важное.

а любая ненормальность или частный случай рано или поздно фиксится или уходит в архив.

С точки зрения кого? Дремучих академиков - теоретиков?
Борланд Дельфи создавался практиками, которые наплевали на теоретизирования и изыски - и создали рабочий инструмент. Кто сейчас ковыряет стандарт, после того, как интеллектуальная собственность прошла через третьи руки, я не знаю.

То, что строки (а не байтовые массивы - фиксированные буферы, открытые и динамические) раньше "из коробки" (без перекодировки, без передачи информации о локали и т.д.) без искажения проходили через сетевые соедиения, само по себе было ненормальностью

Сказал кто?
Покажите мне эту суку.
Потому что в остальных языках никто подобным теоретизированием не страдает.
Достаточно было объявить по умолчанию String = UnicodeString и вставить автоматическую перекодировку при преобразовании в неё и из неё. А 8-битовые оставить в покое. Так бы поступили практики, а не сопливые теоретики, которым нужно всех заставить "делать как правильно"

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

Добавлено спустя 39 минут 41 секунду:
З.Ы. По идее, нормальная практика парсинга - сразу переводить в WideString и работать уже в ней. Мой парсер романов не поломался потому, что у меня после чтения из файла в AnsiString сразу стоял UTF8Decode(), а этой функции насрать на актуальную кодировку, она кастует переданную строку к pchar перед обработкой.
Причём, заметьте, не потому, что "так правильно" а потому, что обращаться к строке, как к массиву, тупо удобнее, а Utf8String такого не позволяет.
Но это - в коде, который ты написал сам.

Ещё одна проблема - проповедуя с пеной у рта этот свой юникодный джихад, они оставили стандартные классы 8-битными. Сказав А - надо сказать Б, не? Иии... вся эта кухня работала постольку, поскольку, *только* если текущей кодировкой выставлена утф-8 (то есть, в линуксе). Под виндовс же - получается жопа. Или на Фри Паскаль как отдельную сущность уже забили болт и предполагается, что я использую лазарус с эго утф8 заплатками везде-везде?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение debi12345 » 19.01.2020 01:13:10

(Что дает ООП понятно сразу, а вот смысл дженериков( по русски "универсальников" :wink: ) ускользает что-то вроде "смеси обычного свойства класса с типом вариант" - что там такого, что нельзя сделать в обычном классе непонятно )
Есть плюсы - иначе эту тему бы не продвигали. Дженерики без ООП заставляет программить без поднего связывания - а значит код быстрее, упрощается компилятор, резко усложняется обмен через глобальные переменные (что подталкивает к передовому функциональному программированию), на этапе компиляции можно выловить все потенциальные рантайм-проблемы (Rust на этом буквально помешан), также вся мощь функционала макросов...

Добавлено спустя 15 минут 31 секунду:
Очень жаль что Мартин так рано ушел - у него было в планах (MSElang на базе CLang, достигший стадии первых бенчмарков) сделать из Паскаля конфетку, в которой все по уму и минималистично.

Добавлено спустя 11 минут 56 секунд:
Я не рекомендую никому учить или использовать Паскаль (в отличие от, например, года 2014-го). Просто молчу об этом.

Наверное нужна была сперва очень объемная (задействующая максимум фишек) амбициозная задача с неограниченным количеством юзеров-тестеров (фидбэка), а уже к ней - язык, наилучшим образом ее решающий. "Gо" сразу попал в амбициозную нишу "как С но намного проще", "Rust" - в амбициозную нишу "резко улучшенный движок крайне популярного семейства вэб-браузеров"

Добавлено спустя 11 минут 6 секунд:
По идее, нормальная практика парсинга - сразу переводить в WideString

Вне паскаля (например прилетает из сети) даже в этом вроде бы универсальном типе может храниться множество кодировок, зависящих даже от порядка байтов в слове. Тогда уж лучше всегда однобайтная UTF-8, но строки в ней не поиндексируешь как элементы символьного массива (что ломает очень много кодовой базы). Или UCS-4 - очень расточительная по памяти, но зато индексируемая.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5543
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Alex2013 » 19.01.2020 04:29:17

debi12345 писал(а):"Gо" сразу попал в амбициозную нишу "как С но намного проще", "Rust" - в амбициозную нишу "резко улучшенный движок крайне популярного семейства вэб-браузеров"

А куда попали "F#" и "haskell" ? :idea:

Добавлено спустя 31 минуту 35 секунд:
Cheb писал(а):Я не рекомендую никому учить или использовать Паскаль (в отличие от, например, года 2014-го). Просто молчу об этом.

Паскаль жив пока жива "кодовая база"... А она сейчас все еще в основном от дельфи - от сюда и страх "отрываться от папочки" с концами . Кроме того исходник есть и есть разрабы прислушивающиеся к пользователем (Не так давно вроде даже наш "софрумник" Zub кляузу в сапорт писал и его уважили ) Что мешает например предложить свой вариант типа String и его реализацию ?

Да и вообще проблема "массива символов" как мне кажется сильно надуманная ( достаточно посмотреть исходники SynEdit или даже TMemo точнее TStrings ) Там есть возможность индексировать текст как угодно! Хоть по словам, хоть по символам, невзирая на кодировку и заведомо переменную длину строки . А совместимость реализуется через банальное чтение "нетипизированных блоков". (До того момента, как ты что-то присваиваешь строке или ее "коллекционному изданию" TStrings "это просто данные"... )
Alex2013
долгожитель
 
Сообщения: 1651
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 19.01.2020 05:24:27

даже в этом вроде бы универсальном типе может храниться множество кодировок, зависящих даже от порядка байтов в слове.

Заранее подложил соломки, объявив
Код: Выделить всё
  Utf16String = UnicodeString;
  Ucs2Char = UnicodeChar;
  PUcs2Char = PUnicodeChar;

и переименовав везде у себя в движке.
Вроде, не планирую - а вдруг? (китайский понадобится). Тип Ucs4String = array of Ucs4Char в паскале уже объявлен.

Тогда уж лучше всегда однобайтная UTF-8,

Хранить в ней, а при парсинге перегонять в USC4. Вон, видеокарты умеют хранить текстуры в памяти сжатыми и распаковывают на лету, при обращении к текстуре. Мы что - хуже?
Вспомнился драйвер сжатия памяти (по факту, ram disk со сжатым файлом подкачки), заметно ускорявший работу виндовс на 486-м с 8Мб памяти...
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Alex2013 » 19.01.2020 05:36:14

debi12345 писал(а):всегда однобайтная UTF-8
:shock:
Стоп, это где это UTF-8 однобайтная и тем более "всегда "?
"Символы с кодами от 128 кодируются 2-мя байтами, с кодами от 2048 — 3-мя, от 65536 — 4-мя. "
(Или я что-то путаю? )
Alex2013
долгожитель
 
Сообщения: 1651
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 19.01.2020 08:32:50

Поймал ужосныя баг в одной из процедур конвертора типов при чтении:
procedure CP_Utf8StringToUtf16String (PField: pointer; Tind1, Tind2: integer); register;
var
v: Utf8String;
begin
ReadField(@v, Tind1);
WideString(PField^):= Utf8Decode(v);
end;
:shock:

Добавлено спустя 2 минуты 40 секунд:
З.Ы. Фтопку! Ссаными тряпками! :evil:
Код: Выделить всё
{$ifdef windows}
  //On Windows platform, these types are *DIFFERENT*!
  //  The encoding is identic (utf16), but memory management is NOT!
procedure CP_Utf16StringToWideString (PField: pointer
                                            ; Tind1, Tind2: integer); register;
var
  v: Utf16String;
begin
  ReadField(@v, Tind1);
  WideString(PField^):= v;
end;
procedure CP_WideStringToUtf16String (PField: pointer
                                            ; Tind1, Tind2: integer); register;
var
  v: WideString;
begin
  ReadField(@v, Tind1);
  Utf16String(PField^):= v;
end;
{$endif}


Добавлено спустя 25 минут 4 секунды:
..потом это назовут "январская резня типа WideString"...
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение debi12345 » 19.01.2020 11:26:23

А куда попали "F#" и "haskell" ?

С микро-нишу "для оригиналов и гиков". Таковая найдется на любой язык.

Добавлено спустя 6 минут 36 секунд:
Заранее подложил соломки, объявив

UCS2-BE, UCS2-LE, UTF16-BE, UTF16-LE

Добавлено спустя 20 минут 21 секунду:
Стоп, это где это UTF-8 однобайтная и тем более "всегда "?

В C/C++ проходит как "single byte" (то есть нет темы "порядок байтов")
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5543
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Cheb » 19.01.2020 12:49:01

Ааааххх, какое облегчение >_< Наконец-то перестало падать, пытаясь сохранить сессию после предшествующей загрузки. Какие трудновыколупываемые были баги! Косяками.
Вставьте здесь много матерных слов в адрес глобальных переменных, которые оказывались не инициализированы, инициализированы не тогда, когда надо, или инициализированы через анус. :x
Всё таки архитектура развивалась эволюционно, у меня сил бы не хватило переделать сотни работающего кода с нуля. А создавалось оно когда я ещё плохо в этом разбирался, представлял конечный результат совсем не так. Изначально всё расчитывалось на абсолютную невозможность двух операций сериализации/обхода графа одновременно. Но я таки вштырил запорожцу реактивный двигатель, научив выполнять вложенные обходы. При этом гонял табуны параметров, как курей веником. Из глобальных переменных - в поля класса, из класса в класс, потом снова в глобальные переменные для удобства, потом учил вложенные матрёшки обходчиков эти глобальные переменные правильно сохранять и восстанавливать... Изображение

UCS2-BE, UCS2-LE, UTF16-BE, UTF16-LE

Ну, это в основном на гипотетический случай, что в будущем !внезапно! объявят UnicodeString = UCS4String. Чтобы опять всё не переделывать.
Это как я у себя объявил абстракции TFileNameString, ещё до того, как разобрался, в каком виде работать с путями. Мысли были, в т.ч., использовать WideString везде, включая линукс. Или оставить под виндовс цп1251. Или использовать в виндовс UnicodeString начиная с фпц 3.
В конечном итоге приравнял ея к Utf8String для всех платформ - но функции
Код: Выделить всё
function FileNameToUtf16(f: TFileNameString): Utf16String;
function Utf16ToFileName(u: Utf16String): TFileNameString;
function FileNameToUtf8(f: TFileNameString): Utf8String;
function Utf8ToFileName(u: Utf8String): TFileNameString;

уже были, и в них уже везде всё было обёрнуто, оставалось лишь имплементации подправить.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение debi12345 » 19.01.2020 13:19:44

!внезапно! объявят UnicodeString = UCS4String.

4 байта - не панацея. Даже нынешняя UTF-8 закладывется на 5 байт. А в случае обнаружения внеземеных цивилизаций или выхода ИИ из лабораторий (не шутка, нужно уже сейчас повсеместно внедрять закрывающее решение) для включения их алфавитов потребуютя еще и еще байты - для чего UTF8 подходит как нельзя лучше.

Добавлено спустя 16 минут 33 секунды:
Изначально всё расчитывалось на абсолютную невозможность двух операций сериализации/обхода графа одновременно. Но я таки вштырил запорожцу реактивный двигатель, научив выполнять вложенные обходы. При этом гонял табуны параметров, как курей веником. Из глобальных переменных - в поля класса, из класса в класс, потом снова в глобальные переменные для удобства, потом учил вложенные матрёшки обходчиков эти глобальные переменные правильно сохранять и восстанавливать...
Любимая пища для параноика Rust - он бы Вас по этим лабиринтам водил за руку и не дал бы сделать ни шага в сторону :roll: Страшно выбешивает на самом деле - но в глубине души понимаешь, что он прав и желает только добра.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5543
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Cheb » 20.01.2020 05:40:10

Вроде, всё догрёб.
На следующей неделе доделаю служебное меню (выбор модуля, языка и прочая) и выложу таки Вращающийся кубик №21.

Обновил http://chentrah.chebmaster.com/?what=tech

Жучнал перзистентной системы:
Planned for 1.3:
1. Add support for layers lockable using VirtualProtect / its Linux equivalent to raise an AV on write.
2. Implement cloning helper and the Clone method
3. Support shortstrings (because ansistrings are too bloated in 3.x for simple tasks like storing identifiers)
4. Added an optional debugging tool thаt traverses the tree searching for dangling references before cleaning graveyards
5. Add heaptrace mode (keeping a full backtrace of allocating call for each block)

Changelog 1.1.21 -> 1.1.22
1. FINAL decision of Chepersy staying single-threaded forever.
2. Dropped backward compatibility (again)
3. Dropped interface support, reverted TChepersyObject back to a simple descendant of TObject
4. Created a specialized class instance memory manager supporting accelerated fields and evicted the cache-unfriendly traversing index and mask into accelerated fields.
5. Returned support for scraped flag, scraping and local graveyards. The graveyards are designed to be cleaned each frame: this is a game engine, not a spherical cow.
6. Switched all graph traversal, including serializing and deserializing, to descendants of a specialized abstract class.
7. Support for up to 4 nested graph traversing operations. Intended for resource cloning, on-the-fly game world packing and other such operations in the middle of saving the game and such.
8. Dropped cloning as a form of graph traversal. Will be re-implemented in a later version as a helper function of cloning a single object, designed for layered game world support.
9. Dropped support for types: fixed32, WideString.
10. 8-bit string serialization keeps encoding (if compiled in fpc 2.6.4, is ignored at reading and always treated as utf-8 at writing)


Любимая пища для параноика Rust

А я как раз занимался обратным. Менеджер памяти, хитропридуманные побитовые операции с указателями, сериализация в поток с кучей хаков, обращений по указателям и сомнительного качества тайпкастов...
Когда взлетит основа слоёной игровой логики - станет легче. А если осилю таки отдельные запираемые пулы в менеджере памяти для отдельных слоёв... (делаешь память конкретного слоя только для чтения - и кусок кода, где ты забыл вызов ThisLayer(), получает AV в бубен)

Кстати, в Паскале уже движение в нужную сторону: var параметр - это указатель, в котором нельзя передать NIL.
Когда будет
Последний раз редактировалось Cheb 20.01.2020 11:02:35, всего редактировалось 1 раз.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Alex2013 » 20.01.2020 06:03:27

http://chentrah.su/?what=tech
Не открывается даже через тор.... :cry:
Alex2013
долгожитель
 
Сообщения: 1651
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 20.01.2020 11:02:09

[рукалицо]
Ну, естественно я запостил ссылку на свой локальный сервер, а не на боевой:
http://chentrah.chebmaster.com/?what=tech
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 789
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Alex2013 » 20.01.2020 17:26:35

Cheb писал(а):[рукалицо]
Ну, естественно я запостил ссылку на свой локальный сервер, а не на боевой:
http://chentrah.chebmaster.com/?what=tech

"Ночь улица фонарь... в аптеку не пустили! " :D Бывает ...
Alex2013
долгожитель
 
Сообщения: 1651
Зарегистрирован: 03.04.2013 11:59:44

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: MailRu[bot] и гости: 2

Рейтинг@Mail.ru