Cheb's Game Engine

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

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

Re: Cheb's Game Engine

Сообщение runewalsh » 03.02.2018 02:45:47

>над XMM регистрами побитовые операции невозможны, а напрямую в регистр общего назначения тоже невозможно передать
Точно? Я в ассемблере мало что понимаю, но гугл говорит ровно обратное: что есть варианты MOV[D|etc.] для xmm → регистр общего назначения, равно как и сдвиги и побитовые операции для xmm.
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 03.02.2018 03:42:41

что есть варианты MOV[D|etc.] для xmm → регистр общего назначения, равно как и сдвиги и побитовые операции для xmm.

:shock:
Буду разбираться!

..малина ещё не закончила..
Код: Выделить всё
Raspberry Pi 3 + PC2-6400 (RAM limit 0.8 GFLOPS):
    ..checking rsqrt() -- на этой платформе это копия bd_rsqrt()
      ..ok, in 1433 (pure 271) seconds (0.00787 GFLOPS)
      ..md5 checksum = 5D3136ECCF66CB8F5D278CD651B1DB07
    ..checking bd_rsqrt()
      ..ok, in 1432 (pure 270) seconds (0.00789 GFLOPS)
      ..md5 checksum = 5D3136ECCF66CB8F5D278CD651B1DB07
    ..checking sqrt()
      ..ok, in 1208 (pure 56.3) seconds (0.0378 GFLOPS)
      ..md5 checksum = 5A50783537304E8D28DDC3C7D7FC3E6A
    ..checking multiplication by Pi..
      ..ok, in 1290 (pure 78.7) seconds (0.0533 GFLOPS)
      ..md5 checksum = 9CA6E7B818FA046C3DAE722C35196729
    ..checking bd_sin()..
      ..ok, in 379 (pure 78.4) seconds (0.0136 GFLOPS)
      ..md5 checksum = 9E39629C4577EEF4BDE30EE13047F9F9
    ..checking sin()..

Но уже сейчас видно нечто шокирующее!
Обычный квадратный корень -
а) детерминистичный
б) быстрее "быстрого обратного" по методу Кармака - на писи в два раза, а на малине - аж в пять.
Завтра повторю, добавив в тест вариант 1/sqrt() (а эта байда служит для нормализации векторов).
Понятно, что быстрый инверсный из SSE2 на писях немного быстрее (а когда AVX запрягу - вообще зверь, интеловские процы нормализуют чуть не до одного вектора за такт). Но те - не детерминистичные, в физике не используешь.

Добавлено спустя 8 часов 57 минут 27 секунд:
Код: Выделить всё
    ..checking sin()..
      ..ok, in 602 (pure 298) seconds (0.00359 GFLOPS)
      ..md5 checksum = 4DE8EFC27CBB692E5E3DEB7A7E561EAB

Ииии, чётко видно, что синус в пятнадцать раз медленней умножения *на всех платформах*
Зато детерминистичный. :lol:

Сейчас модифицирую тесты, померю насколько честный 1/sqrt() окажется быстрее быстрого обратного квадратного корня по методу Кармака :shock:

Добавлено спустя 50 минут 1 секунду:
Рукалицо :shock:

На замшелом AMD честный 1/sqrt(x) одинаков по скорости с кармаковским хаком.
На интеле - на 20% медленнее.

Зато на Raspberry Pi 3 - в два с половиной раза быстрее. В два с половиной! :shock:

У малины, похоже, просто перекачан fpu мускул... :lol:

Добавлено спустя 4 часа 24 минуты 8 секунд:
Финальный результат:
Код: Выделить всё
win32 + sse2 @ i5-2450M 2.5GHz + PC3-10600 (RAM limit 1.3 GFLOPS):
(intel burn test gives ~20 GFLOPS for a single core)
  Checking CPU/compiler combo for floating point determinism...
    ..checking 1/sqrt()
      ..ok, in 67 (pure 21.7) seconds (0.0981 GFLOPS)
      ..md5 checksum = 923C6EB0CDC9F67EB190EB5DEE8E3B14
    ..checking sqrt()
      ..ok, in 56 (pure 10.8) seconds (0.197 GFLOPS)
      ..md5 checksum = 5A50783537304E8D28DDC3C7D7FC3E6A
    ..checking rsqrt()
      ..ok, in 52 (pure 7.11) seconds (0.3 GFLOPS)
      ..md5 checksum = 95389BA76240737D6323FA5F7A549852
    ..checking division..
      ..ok, in 72 (pure 21.3) seconds (0.197 GFLOPS)
      ..md5 checksum = 2D84289D63C27EC1F701E7B20960A3A1
    ..checking multiplication by Pi..
      ..ok, in 58 (pure 7.03) seconds (0.597 GFLOPS)
      ..md5 checksum = 9CA6E7B818FA046C3DAE722C35196729
    ..checking bd_rsqrt()
      ..ok, in 63 (pure 18.4) seconds (0.116 GFLOPS)
      ..md5 checksum = 985241AB7340A4550C995119AEEC5E7B
    ..checking bd_sin()..
      ..ok, in 18 (pure 5.62) seconds (0.19 GFLOPS)
      ..md5 checksum = 9E39629C4577EEF4BDE30EE13047F9F9
    ..checking sin()..
      ..ok, in 40 (pure 27.3) seconds (0.0393 GFLOPS)
      ..md5 checksum = 4DE8EFC27CBB692E5E3DEB7A7E561EAB


    
win32 + sse2 @ Phenom II X6 1090T 3.2GHz + PC3-8500 (RAM limit 1.0 GFLOPS):
(intel burn test gives ~10 GFLOPS for a single core)
    ..checking 1/sqrt()
      ..ok, in 56 (pure 17.8) seconds (0.12 GFLOPS)
      ..md5 checksum = 923C6EB0CDC9F67EB190EB5DEE8E3B14
    ..checking sqrt()
      ..ok, in 48 (pure 9.91) seconds (0.215 GFLOPS)
      ..md5 checksum = 5A50783537304E8D28DDC3C7D7FC3E6A
    ..checking rsqrt()
      ..ok, in 49 (pure 10.8) seconds (0.198 GFLOPS)
      ..md5 checksum = 099065E6029AB6F582165CC92DECF8AC
    ..checking division..
      ..ok, in 63 (pure 16) seconds (0.262 GFLOPS)
      ..md5 checksum = 2D84289D63C27EC1F701E7B20960A3A1
    ..checking multiplication by Pi..
      ..ok, in 59 (pure 10.8) seconds (0.387 GFLOPS)
      ..md5 checksum = 9CA6E7B818FA046C3DAE722C35196729
    ..checking bd_rsqrt()
      ..ok, in 57 (pure 18.4) seconds (0.116 GFLOPS)
      ..md5 checksum = 985241AB7340A4550C995119AEEC5E7B
    ..checking bd_sin()..
      ..ok, in 20 (pure 7.95) seconds (0.135 GFLOPS)
      ..md5 checksum = 9E39629C4577EEF4BDE30EE13047F9F9
    ..checking sin()..
      ..ok, in 43 (pure 31.8) seconds (0.0337 GFLOPS)
      ..md5 checksum = 4DE8EFC27CBB692E5E3DEB7A7E561EAB


    
Raspberry Pi 3 + PC2-6400 (RAM limit 0.8 GFLOPS):
    ..checking rsqrt()
      ..ok, in 1433 (pure 271) seconds (0.00787 GFLOPS)
      ..md5 checksum = 5D3136ECCF66CB8F5D278CD651B1DB07
    ..checking bd_rsqrt()
      ..ok, in 1432 (pure 270) seconds (0.00789 GFLOPS)
      ..md5 checksum = 5D3136ECCF66CB8F5D278CD651B1DB07
    ..checking sqrt()
      ..ok, in 1208 (pure 56.3) seconds (0.0378 GFLOPS)
      ..md5 checksum = 5A50783537304E8D28DDC3C7D7FC3E6A
    ..checking multiplication by Pi..
      ..ok, in 1290 (pure 78.7) seconds (0.0533 GFLOPS)
      ..md5 checksum = 9CA6E7B818FA046C3DAE722C35196729
    ..checking bd_sin()..
      ..ok, in 379 (pure 78.4) seconds (0.0136 GFLOPS)
      ..md5 checksum = 9E39629C4577EEF4BDE30EE13047F9F9
    ..checking sin()..
      ..ok, in 602 (pure 298) seconds (0.00359 GFLOPS)
      ..md5 checksum = 4DE8EFC27CBB692E5E3DEB7A7E561EAB


- и оставляю пока это.

Выводы - воодушевляющие.

1. Я могу спокойно использовать чистые вычисления с плавающей запятой и не париться.
2. Оптимизировать можно потом, уже после того, как будет работающий мультиплеер: всякие функции пакетного просчёта физики и нормализации векторов, на SSE, AVX или что там ещё взбредёт.

По крайней мере, камень с плеч - большой и толстый :lol:

Добавлено спустя 1 минуту 31 секунду:
равно как и сдвиги и побитовые операции для xmm.

Сдвиги, самка собаки, побайтовые :evil: А нужен shr 1.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение скалогрыз » 04.02.2018 02:00:31

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

н.р. собираешь все функции с математикой под все поддерживаемые fpc оттенки процессоров.
а реальный вызов функции заменяешь либо на заглушку (=максимальному размеру кода для соотвествующей функции)
при запуске смотришь на тип процессора, и переписываешь все заглушки их желательным кодом.

в итоге никаких лишних if-ов, jit-ов - только динамическая перекомпоновка кода.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Cheb's Game Engine

Сообщение Mirage » 04.02.2018 04:46:35

Судя по всему, планируется мультиплейер с фиксированными тиками, когда на всех машинах симулируется все одинаково. Иначе зачем детерминизм?
Если так, то рекомендую по-быстрому сделать прототип, чтобы убедиться, что сие не работает. И не тратить много времени.
А с корнями странно, да. Вроде я мерял и метод Кармака (вручную на асме) был куда быстрее. Надо перемерять.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Cheb's Game Engine

Сообщение Cheb » 04.02.2018 16:00:49

Если так, то рекомендую по-быстрому сделать прототип, чтобы убедиться, что сие не работает. И не тратить много времени.

Как я уже писал ранее, планируется продвинутый вариант этой системы, с локстепом в прошлом (0.3..0.5 секунд) поверх которого - нашлёпка лагокомпенсации. Сама идея оформилась где-то в 2008-м, кажется, и с тех пор ничего принципиально нового я не придумал.

и метод Кармака (вручную на асме) был куда быстрее.

Через классический FPU или через SSE?
Оно именно из-за последнего не работает, из-за отсутствия такой штуки, как сдвиг на один бит вправо.

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

Примерно так.
Причём, будет всё устроено очень тупо: 95% кода, что занимают 5% времени, будут статическими, безо всяких изысков. А 5% кода, что занимают 95% времени - будут иметь как базовые варианты (по 1 штуке) так и пакетные (например, нормализация 4 векторов на SSE2 или нормализация 8 векторов за раз на AVX) и процедура "а нормализуй-ка мне N векторов" будет во время выполнения, на if'ах и case'ах, вызывать их в нужной комбинации при проходе по массиву: например, что делится на 8 - на AVX, остаток - по одной штуке на обычной математике.

Добавлено спустя 18 минут 34 секунды:
Провёл новую серию тестов. Встал вопрос: а зачем?
На писях, реализованное на SSE, тупое в лоб решение 1/sqrt() обгоняет метод Кармака просто за счёт брутфорса - т.к. делает 4 операции одновременно. И оно детерминистично!
(а когда AVX запрягу - вообще все лягут)
На малине, тупое в лоб решение 1/sqrt() обгоняет метод Кармака как бог черепаху просто потому что у малины перекачаный FPU. И оно детерминистично!

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

Код: Выделить всё
CPU Phenom II X6 1090T
  TSC frequency: 3.16 GHz
  Checking CPU/compiler combo for floating point determinism...
    ..checking 1/sqrt using SSE packed 4-SIMD asm
      ..ok, in 43 (pure 5.19) seconds (0.411 GFLOPS)
      ..md5 checksum = 923C6EB0CDC9F67EB190EB5DEE8E3B14
    ..checking 1/sqrt()
      ..ok, in 55 (pure 17.9) seconds (0.119 GFLOPS)
      ..md5 checksum = 923C6EB0CDC9F67EB190EB5DEE8E3B14
    ..checking sqrt()
      ..ok, in 47 (pure 9.94) seconds (0.214 GFLOPS)
      ..md5 checksum = 5A50783537304E8D28DDC3C7D7FC3E6A
    ..checking SSE RSQRTPS packed 4-SIMD
      ..ok, in 40 (pure 2.21) seconds (0.966 GFLOPS)
      ..md5 checksum = 099065E6029AB6F582165CC92DECF8AC
    ..checking rsqrt()
      ..ok, in 50 (pure 10.9) seconds (0.196 GFLOPS)
      ..md5 checksum = 099065E6029AB6F582165CC92DECF8AC
    ..checking division..
      ..ok, in 63 (pure 16.1) seconds (0.261 GFLOPS)
      ..md5 checksum = 2D84289D63C27EC1F701E7B20960A3A1
    ..checking multiplication by Pi..
      ..ok, in 58 (pure 10.8) seconds (0.389 GFLOPS)
      ..md5 checksum = 9CA6E7B818FA046C3DAE722C35196729
    ..checking bd_rsqrt()
      ..ok, in 58 (pure 19.2) seconds (0.111 GFLOPS)
      ..md5 checksum = 985241AB7340A4550C995119AEEC5E7B
    ..checking bd_sin()..
      ..ok, in 20 (pure 8.07) seconds (0.133 GFLOPS)
      ..md5 checksum = 9E39629C4577EEF4BDE30EE13047F9F9
    
CPU Core i5-2450M 2.50GHz
  TSC frequency: 2.44 GHz)
  Checking CPU/compiler combo for floating point determinism...
    ..checking 1/sqrt using SSE packed 4-SIMD asm
      ..ok, in 50 (pure 5.27) seconds (0.404 GFLOPS)
      ..md5 checksum = 923C6EB0CDC9F67EB190EB5DEE8E3B14
    ..checking 1/sqrt()
      ..ok, in 65 (pure 20.8) seconds (0.102 GFLOPS)
      ..md5 checksum = 923C6EB0CDC9F67EB190EB5DEE8E3B14
    ..checking sqrt()
      ..ok, in 56 (pure 10.6) seconds (0.201 GFLOPS)
      ..md5 checksum = 5A50783537304E8D28DDC3C7D7FC3E6A
    ..checking SSE RSQRTPS packed 4-SIMD
      ..ok, in 48 (pure 2.14) seconds (0.996 GFLOPS)
      ..md5 checksum = 95389BA76240737D6323FA5F7A549852
    ..checking rsqrt()
      ..ok, in 52 (pure 6.97) seconds (0.306 GFLOPS)
      ..md5 checksum = 95389BA76240737D6323FA5F7A549852
    ..checking division..
      ..ok, in 72 (pure 20.8) seconds (0.201 GFLOPS)
      ..md5 checksum = 2D84289D63C27EC1F701E7B20960A3A1
    ..checking multiplication by Pi..
      ..ok, in 58 (pure 6.85) seconds (0.613 GFLOPS)
      ..md5 checksum = 9CA6E7B818FA046C3DAE722C35196729
    ..checking bd_rsqrt()
      ..ok, in 66 (pure 20) seconds (0.106 GFLOPS)
      ..md5 checksum = 985241AB7340A4550C995119AEEC5E7B
    ..checking bd_sin()..
      ..ok, in 19 (pure 5.59) seconds (0.191 GFLOPS)
      ..md5 checksum = 9E39629C4577EEF4BDE30EE13047F9F9


Ну, и?... Нету методу Кармака места в современном программировании.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Mirage » 05.02.2018 01:04:54

Cheb писал(а):Как я уже писал ранее, планируется продвинутый вариант этой системы, с локстепом в прошлом (0.3..0.5 секунд) поверх которого - нашлёпка лагокомпенсации. Сама идея оформилась где-то в 2008-м, кажется, и с тех пор ничего принципиально нового я не придумал.


Просто когда я делал сетевую игру для эйрхоккея (2004), то мне говорили умные люди, и я тоже не поверил. А зря.
Гимора много так делать, а работает приемлемо только в LAN с пингом < 1ms.
Потому как каждый тик сервер должен принять и отправить обратно.

Cheb писал(а):Через классический FPU или через SSE?


Да на pure pascal. Кстати на асме через FPU настолько не быстрее, что смысла нет.
И это точно быстрее, чем fsqrt.
А на SSE наверное уже быстрый sqrt.
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: Cheb's Game Engine

Сообщение Cheb » 05.02.2018 07:53:08

Гимора много так делать, а работает приемлемо только в LAN с пингом < 1ms.

Естессно, если *чистый* lockstep то оно годится только для 2-3 игроков по локалке с FPS 20.
Подробнее - лень воздух сотрясать, ищи вдоль темы взад.

А на SSE наверное уже быстрый sqrt.

Ну, не магически быстрый, но достаточно, чтобы 1/sqrt() на sse asm почти не отставал от простого умножения на чистом паскале.
Но это детерминистичный.
Там есть спецкоманды 1/x и 1/sqrt(x), выполняющиеся за пару тактов - при правильном написании кода на пару миллиардов операций в секунду точно выйдешь.
См. выше результат для "..checking SSE RSQRTPS packed 4-SIMD".
Как я уже упоминал, у интела есть пример, как на AVX нормализовать по вектору за такт с хвостиком. Это где-то два миллиарда векторов вв секунду выйдет на среднем процессоре (и это только один поток!).
Но я такие чудеса могу только разве что для анимации на CPU применить, т.к. они не детерминистичные и для моей физики не годятся:

интел
..checking SSE RSQRTPS packed 4-SIMD
..ok, in 48 (pure 2.14) seconds (0.996 GFLOPS)
..md5 checksum = 95389BA76240737D6323FA5F7A549852

амд
..checking SSE RSQRTPS packed 4-SIMD
..ok, in 40 (pure 2.21) seconds (0.966 GFLOPS)
..md5 checksum = 099065E6029AB6F582165CC92DECF8AC

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

Добавлено спустя 7 часов 20 минут 3 секунды:
P.S. Кстаааати, оно у меня неоптимально работает: сначала заполняя 32 Мб массив, потом вторым проходом выполняя вычисления. И 0.9 гигафлопса подозрительно похоже на пропускную способность памяти (8Гб/с) - т.к. размер числа 4 байта, и делим на два поскольку идут и чтение и запись.

Я так сделал поскольку на малине доступный таймер не очень высокого разрешения (1МГц).
Надо переделывать.
[тяжкий стон] :x

Добавлено спустя 1 час 47 секунд:
Оооо-кей.
Частично переделал под размер чанка 16 Кб, чтобы с запасом уклалось в L1 кэш.
Во превых, обычное умножение побежало в полтора раза шустрее.
Во вторых...
Checking CPU/compiler combo for floating point determinism...
..checking x * Pi (typed const)..
..ok, in 56 (pure 4.29) seconds (0.978 GFLOPS)
..md5 checksum = 9CA6E7B818FA046C3DAE722C35196729
..checking x * 3.141592653589793 (inline const)..
..ok, in 57 (pure 5.39) seconds (0.778 GFLOPS)
..md5 checksum = 0FC3738303DEA3CFC8C6F7AFBF585BE6 - SURPRISE BUTTSECKS
..checking x * float(3.141592653589793) (inline const with type-cast)..
..ok, in 56 (pure 4.25) seconds (0.986 GFLOPS)
..md5 checksum = 9CA6E7B818FA046C3DAE722C35196729
.. без тайпкаста он в даблах считал, курва :evil:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 07.02.2018 15:57:06

Поучаствовал в интересном обсуждении на gamedev.ru. Появились идеи, *как* запрячь дополнительные ядра, не делая основную логику распараллеливаемой.
Ок, кпд будет заметно < 100%, но это, в принципе, пофиг.

1. Тщательно расслаиваем логику и физику на реально сложные взаимодействия, на классах, занимающие 10% времени - и тупые вычисления, работающие с record'ами по ссылкам, занимающие 90% времени и разделяемые на потоковые задачи.
2. Потоковые задачи разделяются от логики по времени - т.е. перед их запуском логика останавливается (и делается только для чтения, если осилю спец. дичпетчер памяти) и запрещаются счётчики ссылок в _AddRef/_Release.
3. Потоковые задачи оформляют свои результаты в виде спец.классов в пуле результатов. Никакой взаимосвязи не допускается, модификация основной логики не допускается.
4. Потоковые задачи стираются без следа.
5. Реактивируется логика, разблокируются счётчики ссылок, работаем с результатами.

Как пример, движение партиклов
1. Основная логика - поток №1
2. Обход чанков, расчёт изменений в освещении, уровнях текущей воды и прочая - распараллелено.
3. Сведение результатов, модификация чанков согласно полученным дельтам - поток №1.
4. Обход партиклов, проверка столкновений и суммирование сил - распараллелено
5. Снова логика, реакция на силы (например, две из частиц были баундинг сферами капли никотина и ёжика, и последнего разорвало) - поток №1
6. Обход партиклов, перемещение под действием сил - распараллелено
7. Снова логика
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение vitaly_l » 07.02.2018 17:35:09

Cheb писал(а):Частично переделал под размер чанка 16 Кб, чтобы с запасом уклалось в L1 кэш.
запрещаются счётчики ссылок в _AddRef/_Release
разблокируются счётчики ссылок

Эх примера кода нет (а так всё понятно), а ведь наверняка можно использовать эту фичу не только в игровых движках.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Cheb's Game Engine

Сообщение Cheb » 13.02.2018 20:40:33

Чё-то вспомнилось, как изобрёл для дума новый уровень сложности, тупо перескриптовав в Doomsday последовательности анимации, чтобы у каждого монстра кадр боли вёл на кадр атаки, а не ходьбы. Казалось бы, такая тривиальность - а монстры сразу стали гораздо агрессивнее. Ты ему в лоб - а он тебе по лбу. Особенно с манкубусами в ближнем бою стало весело, когда они мгновенно лупили в ответку.
Драки между монстрами тоже гораздо свирепее стали.

Ностальгирую, хочу игровую логику программировать уже :cry:
Ну, по крайней мере мой фанфик пишется хорошо. Правда Риски Бутс получилась какая-то уж слишком кровожадная. Не переборщил ли я для зеттинга этой франшизы :x

По ходу прикидываю, как бы ещё так свой роман по будущему геймплею Чентры переписать, чтобы перестал быть хардкорным пopно. Пока не получается, хоть и верю, что возможно. Хотя бы до 18+ его прикрутить... [тяжкий вздох]
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 18.03.2018 20:54:20

Поковырял немного, чтобы совсем уж в мозге не слежалось.
Научил собирать _hub.dll , которая заменит встроенный функционал матки (встроенные меню и т.п.). В который раз порадовался, что не бросил совместимость с фпц2.6.4. Под 3.0.4 собирается, но падает так страшно, что концов не найти. Ибо переколбашенный код накладывается на целый новый набор нежданчиков от новой работы со строками (а возможно, и на нестабильность компилятора?).
Собрав в 2.6.4 хотя бы удаётся отловить места ошибок.
Пока что новая длл упорно падает, при этом вызывается старый код переключения на встроенные процедуры (чтобы нарисовать сообщение об ошибке), что приводит к загрузке новой длл... Учитывая, что при падении приложение кричит страшным голосом через DirectSound, результат получается душераздирающим. Или ушераздирающим, если хотите.

..короче, грести и грести и грести.
Попутно не стем делом начал писать кроссовер Шантэ и брутального дума :oops:

По игре следующие наметки:
1. Первое, что я сделаю, будет не GPL. У меня есть куча низкополигональных md2 моделей к Doomsday, в которые я в 2003-м вгрохал кучу сил. Припахать их сделать мод для дума (движок мой, ассеты - дума и думсдэй). С пердящими манкубусами.
2. Идея сделать террейн смесью вокселей и крупных брашей (вроде секторов в думе). Чтобы 95% мира была угловатой, как во второй кваке или первом анрыле, и границы этих многогранников можно было располагать произвольно. А разрушаемость - за счёт того, что подо всем этим лежит обычная воксельная сетка, как в майнкрафте. Только воксель - не кубический воксель в вакууме, а может дробиться гранями брашей на части, имеющие разные свойства.
Соответственно 95% расчётов освенщения можно было бы сделать упрощённым, на посекторном уровне.
Но над этим ещё думать и думать.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 29.03.2018 14:44:19

Jim Valavanis выложил на sourceforge свой FPCDoom :twisted:
Обычный дум. На Фри Паскале.

Скачал, облизываюсь на исходники, хочу встроить в свой движок и сделать метаигру: чтобы внутри игрового мира чебсдэй были компьютеры, на которых можно было бы поиграть в дум. :roll:

Может получиться прикольно, но работы - воз и маленькая тележка. Надо перехватить весь менеджмент ассетов, чтобы они брались из менеджера чентры, инкапсулировать всю логику дума в объект игрового мира и убедиться, что всё это не ломает детерминизм, и включить в механизм лагокомпенсации чтобы люди, играющие в сетевую игру в чебсдэй, могли сесть за компьютеры и устроить сетевую зарубу в дум :roll:

Задача выглядит вполне решаемой. 8)
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 27.04.2018 13:12:17

Cheb писал(а):НЕВОЗМОЖНО построить свой диспетчер памяти как надстройку над системным (расширяя размер блока доп. полями), поскольку системный... (фанфары)... обращается к текущему диспетчеру памяти через методы переменной MemoryManager, в которую кастомный менеджер памяти как раз устанавливает свои функции.

Руки бы отрывать этим людям.

Потом соберусь, сочиню багрепорт на эту тему. Бардак, ё.

Тот баг исправили, кстати. Только сейчас заметил.
SysReallocMem.png
SysReallocMem.png (9.51 КБ) Просмотров: 15715
Аватара пользователя
runewalsh
энтузиаст
 
Сообщения: 579
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 28.04.2018 10:22:16

О, спасибо! :D
(Пользы мне, конечно... С заявленной вечной поддержкой фпц 2.6.4.. :x )

Проект сейчас заморожен. У меня, фактически, несколько проектов стоят в очереди, отодвинутые друг другом.

1а: скрыт. Подробности разглашу если взлетит.
1б: тулза Cheskymp для композиции скайбоксов, поддерживающая выходной формат как сферических так и кубических карт (в формате Quake 3, для Open Arena). Выложу, скорей всего, в эти выходные.
2: фанфик "Too Nice for such Brutality" (Шантэ попадает в брутал дум) - дописан до половины
3а: фанфик "Танцуй-танцуй заварушка" ("Dance, Dance, Rumble")
3б: перевод на русский моего же фанфика "Слишком добрая для подобных зверств" - сейчас всего три главы
3в: создание самодельного портативного компьютера (в котором главная фишка - самодельный блок питания ATX с промежуточной стадией 28 вольт для включения в параллель батареи) - закупил компоненты, восстановил радиолюбительское рабочее место, наполовину выстругал корпус.
3в-2: модернизация осциллографа C1-19Б (1970 года выпуска, 25 ламп и один (один) "полупроводниковый триод") - планирую вставить ему ограничитель пускового тока на NTC термисторах.
3г: собственно Чентра.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 29.07.2018 07:38:45

Попинал проект слегка, чтобы совсем уж не слежался.

По ходу выяснил, какой я былинный дятел. Долбический.

Для понтов и удобства у меня отладочная информация извлекается из екзешника/длл во внешний файл, чтобы потом этот екзешник/длл обработать strip и, по возможности, upx. Меньше четырёхсот килобайт, что.

Я не дурак (думал, что) поэтому файл с отладочной инфой подписывается md5 суммой екзешника

Выглядит это так: из лазаруса вызывается build.bat, в котором стоит последовательность
- удалить старый екзешник
- удалить старую отладочную инфу
- скомпилировать
- извлекатор отладочной инфы
- strip+upx
- подписатор отладочной инфы, прописывающий md5 уже окученного екзешника.

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

Всё бы ничего, но с некоторой версии пор лазарус перестал отображать в своей консоли вывод извлекатора и подписатора, насрав на галочку "Show all". То есть, чтобы увидеть, что с этим происходит, надо вручную запускать build.bat из консоли.

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

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

Пилите, Шура, пилите Изображение

Добавлено спустя 15 минут 31 секунду:
З.Ы. Хаха, нет! Погибель моя таилась в совсем другом месте.
Связано с тем, что dll (и отладочная инфа вместе с нею) перед запуском копируются во временную папку чтобы позволить перекомпиляцию во время выполнения. И угадайте, кто только копировал файлы, не удаляя лишние?

Исправил
Код: Выделить всё
  procedure TModule.Load;
    procedure CopyOne(a, b: TFileNameString; CrashIfMissing: boolean = false);
    begin
     if FileExists(a) or CrashIfMissing then begin
       if Mother^.Debug.Verbose then AddLog('   ..copying file %0 to %1', [a,b]);
       chCopyFile(a, b);
     end
     else begin
       if Mother^.Debug.Verbose then AddLog('   ..no such file: %0', [a]);
     end;
    end;
  begin 
 
  ...
 
        if Mother^.State.DeveloperMode then begin
          CopyOne(_Fromdir + _FName, _ToDir + _FName, true);
          CopyOne(_Fromdir + ChangeFileExt(_FName, TFileNameString('.zdwarf2')),
                  _ToDir + ChangeFileExt(_FName, TFileNameString('.zdwarf2')));
          CopyOne(_Fromdir + 'bin' + DS + 'lineinfo' + DS + ChangeFileExt(_FName, TFileNameString('.zdwarf2')),
                  _ToDir + ChangeFileExt(_FName, TFileNameString('.zdwarf2')));
          CopyOne(_Fromdir + ChangeFileExt(_FName, TFileNameString('.zstabs')),
                  _ToDir + ChangeFileExt(_FName, TFileNameString('.zstabs')));
          CopyOne(_Fromdir + 'bin' + DS + 'lineinfo' + DS + ChangeFileExt(_FName, TFileNameString('.zstabs')),
                  _ToDir + ChangeFileExt(_FName, TFileNameString('.zstabs')));
          _dllname:= _ToDir + _Fname; 


на

Код: Выделить всё
  procedure TModule.Load;
    procedure CopyOne(a, b: TFileNameString; CrashIfMissing: boolean = false);
    begin
     if FileExists(a) or CrashIfMissing then begin
       if Mother^.Debug.Verbose then AddLog('   ..copying file %0 to %1', [a,b]);
       chCopyFile(a, b);
     end
     else begin
       if Mother^.Debug.Verbose then AddLog('   ..no such file: %0', [a]);
       if FileExists(b) then begin
         if Mother^.Debug.Verbose then AddLog('   ..deleting existing: %0', [b]);
         DeleteFile(b);
       end;
     end;
    end;
  begin   


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

Добавлено спустя 17 минут 36 секунд:
..ооокей, я в полном... в непонятках, короче.

Фри паскаль 3.0.4

- если вызвать с одной -gl (по идее, Stabs по умолчанию?) - генерирует Dwarf2
- если вызвать с -gl -gw2 (прямым текстом потребовать Dwarf2) - генерирует Stabs
- если вызвать батник из лазаруса - *гарантировано* ничего не генерирует. Только из консоли.

КАКОГО. :evil:

Добавлено спустя 18 минут 56 секунд:
То есть, я *могу* использовать фпц 3, и *всё работает*, но я обязательно должен запускать build.bat из консоли, не из лазаруса!
..какое гемороище.

Добавлено спустя 11 часов 53 минуты 39 секунд:
З.Ы. Длл генерируется Ок, с включённой stabs. Это извлекатор глючит.
Потом добавлю журналирование, разберусь почему.

Добавлено спустя 12 часов 37 минут 7 секунд:
Всё оказалось *гораздо* интереснее!
Обновил лазарус с 1.4.4 до 1.8.4, коий зело многословнее - выяснилось, что у него встроенный интерпретатор .BAT файлов, причём - неполноценный! Он парсит батник при запуске, вычисляя переменные окружения и вштыривая их напрямую.
И получалось, что переменная окружения, которая задавалась ниже по течению, внутри блока if, тупо не работала! :evil:
И екзешник собирался с неправильными ключами.
Может, из-за этого были все мои проблемы с фпц 3?

Перенёс все определения в самое начало - сразу всё заработало!
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Пред.След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru