Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » Ковыряем новый движок (моддинг) | страница 12
Конференция предназначена для общения пилотов. Для удобства она разделена на каналы, каждый из которых посвящен определенной игре. Пожалуйста, открывайте темы только в соответствующих каналах и после того, как убедитесь, что данный вопрос не обсуждался ранее.

Поиск | Правила конференции | Фотоальбом | Регистрация | Список пилотов | Профиль | Войти и проверить личные сообщения | Вход

   Страница 12 из 31
На страницу: Пред.  1, 2, 3 ... 11, 12, 13 ... 29, 30, 31  След.    Перейти:   Все страницы
Поиск в этой теме:
Канал X Rebirth » Модовый и скриптовый отсек X Rebirth: «Ковыряем новый движок (моддинг)»
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
HikeR :
на Lua действительно возможно полиморфное программирование

Lua тут не причём. Так работает (любой) JIT - он меняет код "самого себя" (т.е. интерпритатора). Нормальная сегментация запрещает выполнять данные и писать в код. А чтобы написать и запустить динамически сгенерированный код его нужно или записать в код, или записать данные и выполнить их. Добро пожаловать в современный мир.

HikeR :
не, каких-то отличий нет. любой код для Lua 5.1 можно выполнить при помощи luajit вплоть до 2.0.2,

Речь про реализацию виртуальной машины. Вроде бы понятно из контекста, нет? Выполнить raw-bytecode для luajit на виртуальной машине lua невозможно, даже если вы сумеете загрузить в неё опкоды.

HikeR :
1) если True была где определена раньше

Это я перевёл ваше
t[4] = t[3] and t[3] * 2 or "tru-la-la". Т.к. все участники - константы, то в байткоде они будут записаны как результат вычисления во время компиляции. Результат этот будет true или nil или, скорее всего, просто не скомпилируется. Ибо нельзя умножить nil на 2 (t[3] не существует).

HikeR :

по остальному у меня совершенно противоположная точка зрения, поэтому не буду холиварить Подмигиваю

Главное убедитесь, что у вас противоположная точка зрения к тому что написано, а не к тому, что вы прочитали Улыбка

P.S. Подождите-ка, а откуда у вас
HikeR :
не помню точно, но вроде как в скрипте detailmonitor это дело активно используется.
такие знания? Подозрение.

P.P.S. Всё даже намного проще чем я думал - luajit вообще не запаривается даже схлопывать объявления таблиц подобные. Что было сделано при инициализации, то идёт через TDUP. Остальное - ручками, ручками. А вот вложенные таблицы в конструктор не попадают - они тоже идут ручками. Аналогично со всякими странными (не строка, примитивный тип, инт или "номер") ключами - всё запихивается руками во время выполнения.

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

Код:

t = {
    [1] = "blabla",
    foo = function(x)
         print(self[x])
    end
}

(так не работает - говорит, что не знаю 'self')

P.P.P.S По сути весь декомпилятор сводится к написанию своей примитивной виртуальной машины, которая вместо выполнения будет просто печатать код. Sounds like a plan!

Последний раз редактировалось: Night Nord (13:47 21-12-2013), всего редактировалось 4 раз(а)
    Добавлено: 12:54 21-12-2013   
HikeR
 145 EGP


Рейтинг канала: 4(57)
Репутация: 30
Сообщения: 886
Откуда: Великий Новгород
Зарегистрирован: 20.09.2005
Night Nord :
чтобы написать и запустить динамически сгенерированный код его нужно или записать в код, или записать данные и выполнить их.

ок, no jit on consoles, вы открыли мне глаза, серьезно.

Night Nord :
Выполнить raw-bytecode для luajit на виртуальной машине lua невозможно, даже если вы сумеете загрузить в неё опкоды.

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

Night Nord :
Это я перевёл ваше
t[4] = t[3] and t[3] * 2 or "tru-la-la". Т.к. все участники - константы, то в байткоде они будут записаны как результат вычисления во время компиляции.

все намного проще, это "краткая" форма обычного сишного a?b:c. расшифровка на Lua:
Код:
if t[3] ~= nil then
    t[4] = t[3] * 2
else
    t[4] = "tru-la-la"
end


еще очень частая конструкция, обычно идет чуть ли не первой во всех .xpl-файлах
Код:
Menus = Menus or {}

-- превращается дословно в:
if not Menus then
    var = {}  -- глобальная !!
end
Menus = var

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

Night Nord :
Подождите-ка, а откуда у вас ... такие знания?

то что выдает luajit -bl ... вполне хватает для опознавания таких конструкций.

Night Nord :
так не работает - говорит, что не знаю 'self'

немного изменю пример:
Код:
t = {}
t[1] = "blabla"
t.x = "i'm the X!"

function t:foo1() print(self.x) end
function t.foo2(self) print(self.x) end

t:foo1()
t.foo2(t)


эти две ф-ии равнозначны, но использование двоеточия для вызова метода просто автоматически передает первым параметром саму таблицу и обзывает её self. юзается обычно как замена классов и this (если планируется использование нескольких членов "класса")

Night Nord :
какой-нибудь реалистичный пример с вложенными функциями?

с этим еще проще, я выкладывал шрифтовые и моделековырятельные скрипты, там активно юзаю костыль для бинарного чтения файлов
там вам и вложенные ф-ии, и переменные ) юзается примерно так:
 Cкрытый текст   (кликните здесь для просмотра)
Код:
require("mod_binary_reader")
local r = BinaryReader
r:open(arg[1])
print(r:size())
local i32 = r:uint32()
local s16 = r:sint16()
local str = r:str(8)
r:close()

для превращения его в полноценный класс не хватает пары строчек
    Добавлено: 17:06 21-12-2013   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
HikeR :
ессно. тогда я не понимаю, что вы подразумеваете под "шаблонными таблицами", которых нет в обычной Lua.

В raw-дампе, что делает luajit -b[g] blabla.lua blabla.xpl (.raw, .ljr, что угодно кроме .c, .h и .o/.obj) есть описания прототипов (читай - функций). В прототипе помимо собственно опкодов есть ещё upvalues (ссылки на переменные внешнего прототипа для closures) и разнообразные константы. Константы численные - вещественные или целочисленные, что не влезли в литерал - и всякие сложные - строки и таблицы (и ещё, почему-то, указание на то, что предыдущий прототип в стэке является дитём этого). Вот эти "константные" таблицы называются шаблонными в luajit.

Суть в том, что если у нас есть что-то вроде
Код:

a = {
    ["foo"] = 1,
-- много всего --
    ["bar"] = 2
}

a.bar = 3

то таблица a в том виде, что она представлена в конструкторе (в фигурных скобочках) пойдёт как шаблонная и будет собрана во время компиляции байткода (посчитаны хэши, отсортированы поля и т.п.), а во время выполнения она попросту будет скопирована из констант (TDUP) и потом в ней будет изменено одно единственное поле - bar. Для больших константных таблиц (которые весьма часто встречаются в lua, т.к. его часто используют аля XML/markup/конфиг) это серьёзно ускоряет работу машины, ибо вся тяжёлая работа делаеться во время компиляции + уменьшает число аллокаций (размер таблицы известен заранее).

HikeR :
все намного проще, это "краткая" форма обычного сишного a?b:c. расшифровка на Lua:

Да я вообще не про это, я про то, что a[3] не существует. Собственно попробуйте скомпилировать свой пример. Ладно, проехали.

HikeR :
немного изменю пример:

И этим вы окончательно убили его смысл Улыбка

Суть в том, что в шаблонные таблицы попадает только то, что в конструкторе. Эти t.x и t[1] - не попадают. Мне было любопытно, можно ли сделать функцию прямо в конструкторе так, чтобы она вела себя как функция с двоеточием. Из вашего примера я так понимаю, что можно - просто self надо указывать руками. В любом случае я уже выяснил, что в шаблонные таблицы попадают только простые типы - числа и строки. Всё остальное, включая странные ключи, идёт в момент выполнения.

HikeR :
там вам и вложенные ф-ии, и переменные ) юзается примерно так:

Что-то я их там не нашёл. Подозрение. Вложенные - тобишь функция объявленная в функции, closure. Впрочем тоже неважно - я уже разобрался.

У меня уже есть полностью распарсенный дамп и вся дебажная информация - там есть всё-всё-всё, включая имена локальных переменных и аргументов. Плюс восстановил дерево прототипов корректно. Завтра попробую сделать продвинутый "дизассемблер" - т.е. тоже самое, что кидает -bgl, но с подробными описаниями, именами переменных, корректным порядком прототипов и описаниям констант (в т.ч. константных таблиц). Следующим пунктом будет получить AST (в основном для арифметических выражений), приписать его к строкам и сдампать в виде кода. К НГ у нас будет компилируемый Lua-код.

Единственное, что огорчает - не будет комментариев. Комментарии в raw-dump попросту не попадают. Максимум можно попробовать сохранить пустые места.
    Добавлено: 23:35 21-12-2013   
HikeR
 145 EGP


Рейтинг канала: 4(57)
Репутация: 30
Сообщения: 886
Откуда: Великий Новгород
Зарегистрирован: 20.09.2005
Night Nord :
Вот эти "константные" таблицы называются шаблонными в luajit

я все-таки до конца хочу вникнуть, откуда такой термин взялся?
в обычной Lua все точно также происходит, какой-никакой, но некоторый анализ перед исполнением производится. для нее компилятор идет отдельно и тоже умеет показывать листинг (luac -l -l ...), кстати более "удобный", все константы и upvalues выводятся отдельным списком.

Night Nord :
Да я вообще не про это, я про то, что a[3] не существует. Собственно попробуйте скомпилировать свой пример.

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

Night Nord :
функция с двоеточием...

есть просто syntactic sugar, если быть до конца точным. также как #t => table.getn(t) или print"qqq" => print("qqq").

Night Nord :
функция объявленная в функции, closure.

если вы про что-то типа этого
Код:
function add(a)
  return function (b) return a + b end
end
var = add(10)
print(var(2))

то оно чаще встречается в учебниках, чем в реальной жизни ;)

Night Nord :
там есть всё-всё-всё

вы лучше скажите, что там есть сверх того, что дает luajit -bl

и для "тренировки на кошках" все же посоветую хотя бы jit\bcsave.lua из стандартной поставки (он же ui\core\Lua\jit\bcsave.xpl), есть исходник и полный комплект всех фишек, разве что сложной математики нет.
    Добавлено: 02:01 22-12-2013   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
HikeR :
я все-таки до конца хочу вникнуть, откуда такой термин взялся?

Из кода и вики luajit. template table. Вот даже в bytecode_2.0 в описании TDUP они так называются.

HikeR :
вы лучше скажите, что там есть сверх того, что дает luajit -bl

Вложенность прототипов, константы (включая upvalues), имена локальных переменных (а не только глобальных) и описание биндингов ffi.
    Добавлено: 10:54 22-12-2013   
HikeR
 145 EGP


Рейтинг канала: 4(57)
Репутация: 30
Сообщения: 886
Откуда: Великий Новгород
Зарегистрирован: 20.09.2005
если кто не следит, то на оффоруме юзер arc_ почти добил до конца импорт/экспорт xmf-моделей через Collada DAE формат.

"почти" - потому что формат на самом деле до конца не разобран. некоторые значения, судя по экзешнику, даже не читаются, некоторые читаются, но не используются, однако зачем-то переодически меняются патчами.
версия arc_ — это "мусор" от кривого эгософтовского экспортера, он забил такие значения числом 0xCCCCCCCC и все вроде бы работает. но если заменить на 0x00000000, то работает не всегда Подмигиваю

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

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

Night Nord :
...

не забросили еще свою задумку?
    Добавлено: 18:26 27-12-2013   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
Нет, конечно. Сегодня надеюсь закончить с дизассемблером - я на нём обкатываю логику определения имён переменных по слоту (надо скопировать логику из luajit'овской функции). Если сегодня добью, то запощу примерчик дизассемблирования Event Monitor.xpl

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

Пока всё идёт по плану - к НГ должен быть уже всполне нормальный/читаемый код.

HikeR :

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

Ну да, но читаемость требуется как минимум Улыбка

На данный момент есть вот такие результаты (осторожно, простыня!). Резолв переменных вроде уже работает нормально - есть пара косяков в циклах, но на них можно забить, ибо там всё достаточно жёстко определено и чем являются контрольные слоты и так понятно по контексту. В принципе уже видно, что и как надо будет схлопывать (MULTRES'ы и т.п).

Завтра уйдёт на написание построения AST и дампа его в lua, а вск (если всё сложится хорошо) - на написание тестов и отладку крайних случаев. После чего можно будет заняться прихорашиванием результата.

P.S. Пародоксально, но в некоторых моментах декомпиляция luajit даже проще lua. Lua делает всё честно, раскладывая каждую операцию на много примитивных инструкций, а luajit зачастую пытается скосить углы и делает специализированные инструкции на особые случаи. Например MULTRES в коде означает вложенные вызовы func1(func2(asd)).

Последний раз редактировалось: Night Nord (01:06 28-12-2013), всего редактировалось 3 раз(а)
    Добавлено: 21:10 27-12-2013   
HikeR
 145 EGP


Рейтинг канала: 4(57)
Репутация: 30
Сообщения: 886
Откуда: Великий Новгород
Зарегистрирован: 20.09.2005
Night Nord :
Получение текста луа схожего с оригиналом...

...в целом и не требуется, достаточно чтобы "компилировалось" обратно без ошибок.
    Добавлено: 22:19 27-12-2013   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
Столкнулся с проблемами, основная из которых то, что я сижу в поезде и еду в Саратов. В поезде розеток нет и ноутбук сел - пишу с планшета Расстроен На данный момент я сделал элиминацию слотов (временных переменных), так что код уже компактнее дизассемблера и с поддержкой арифметических выражений. Осталось реализовать поддержку логических выражений (сейчас они выглядят как куча вложенных ифов), elseif'ов и подправить алгоритм определения имен логических переменных - сейчас он теряет названия для всех переменных кроме последней если они были объявлены в одну строку. LuaJIT почему-то записывает переменные с началом блока видимости исходя из адреса макроинструкций, а не из реально выпущенных. Если смогу реанимировать завтра ноутбук, то залью последние изменения и запощу разбор Event Monitor'а.
    Добавлено: 20:48 30-12-2013   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
Мда. "Место проклятое" ©

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

На данный момент из такого получается вот такое (без дизасма).

Не обращайте внимание на --BLOCK - пока вставка пустых строк (и вообще толком форматирование) не реализовано так даже более читаемо (это просто техническая информация). slot* - это неиспользуемые переменные.

Собственно коммент "oh crap" в оригинале описывает, в чём проблема - вместо того чтобы посчитать значение выражения и сделать иф с этим выражением, luajit прям так и делает макароны из ифов. В результате давятся и разборщик ифов и разборщик выражений. Надо их как-то сливать...

На данный момент код выложен на гитхабе (ветка warps, скоро перелью в master, надеюсь) и уже насчитывает 5к+ строк питонячего кода.

P.S. А на Event Monitor'е он просто давится и дохнет ещё даже не доходя до этой стадии. Я уже пару testcase'ов дополнительных увидел, но видно там ещё что-то есть. Я пока особо не разбирался - сначала надо добиться, чтобы всё работало в простом случае.

Последний раз редактировалось: Night Nord (00:41 07-01-2014), всего редактировалось 1 раз
    Добавлено: 00:36 07-01-2014   
HikeR
 145 EGP


Рейтинг канала: 4(57)
Репутация: 30
Сообщения: 886
Откуда: Великий Новгород
Зарегистрирован: 20.09.2005
а на недебажном байткоде работать будет?
    Добавлено: 01:16 07-01-2014   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
Теоретически - да. От дебажной инфы зависит только маркировка слотов как локальных переменных. Без этой маркировки удалятель слотов может переусердствовать и нагородить огромных выражений там где было с десяток локальных переменных. Но практически он скорее всего просто где-то упадёт, ибо проверки на существование дебажной инфы особо нигде нет Улыбка

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

X:R'овые скрипты с дебажной информацией, так что для них это не принципиально.

P.S. Что делать с логическими выражениями я уже придумал. Надеюсь за сегодня добью логику и начну отладку уже на основе Event Monitor'а - там какие-то пробелемы с вложенными циклами и изменением байткода. Может вообще откажусь от изменений - больно опасная операция.
P.S.S. То что local не декомпилируются как local - просто маркировка присваиваний сломана после перехода на варпы.

Последний раз редактировалось: Night Nord (12:21 07-01-2014), всего редактировалось 2 раз(а)
    Добавлено: 12:14 07-01-2014   
HikeR
 145 EGP


Рейтинг канала: 4(57)
Репутация: 30
Сообщения: 886
Откуда: Великий Новгород
Зарегистрирован: 20.09.2005
Night Nord :
X:R'овые скрипты с дебажной информацией, так что для них это не принципиально.

это пока они с дебажной информацией. я как-то краем уха через Olly смотрел на инициализацию Lua state-ов и закралось подозрение, что при каждом вызове карты, менюшек, статистики и прочих гуев там каждый раз заново создаются эти самые state-ы (то есть загрузка/компиляция). отсюда дикие паузы и общая тупизна перед появлением каждого нового окна.
так похабно испортить неплохой, в принципе, Anark Gameface — это реально нужен талант
поэтому если у немцев дойдут руки до оптимизации гуя, то удаление дебаг-инфы — это первое что они сделают.


Night Nord :
начну отладку уже на основе Event Monitor'а

если упор делается на всевозможные языковые конструкции, то за основу желательно брать то, к чему уже есть исходники (для сравнения), т.е. ранее упомянутое содержимое каталога jit. а если нужны только X:R-овские скрипты, то в них нет и десятой доли того, что вы там в парсере понаворотили ;)
несколько констант, несколько невложенных ф-ий и куча if-else. а уж навороченные циклы в гуе, по идее, вообще недопустимы.


p.s.
кстати, почему питон?
    Добавлено: 13:03 07-01-2014   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
HikeR :
поэтому если у немцев дойдут руки до оптимизации гуя, то удаление дебаг-инфы — это первое что они сделают.

Да вообще дебажная инфа никак на рантайм не влияет. Я думаю, что более вероятно то, что они наконец-то откроют исходники без всяких декомпиляций Улыбка

HikeR :
если упор делается на всевозможные языковые конструкции, то за основу желательно брать то, к чему уже есть исходники (для сравнения), т.е. ранее упомянутое содержимое каталога jit. а если нужны только X:R-овские скрипты, то в них нет и десятой доли того, что вы там в парсере понаворотили Подмигиваю

Я перфекционист Улыбка Понятно, что брать надо то, к чему есть исходники. Просто я переодически пытаюсь тыкать Event Monitor, в надежде что я уже доделал всё что было нужно. Но увы, пока не всё. Вот щас выяснил, что мой замечательный разбиратель выражений давится выражением в стиле (((x or y) and z) or xi), т.е. когда порядок выражений обратен порядку написания.

Компилятор у luajit'а однопроходный (как сказали бы англичане: Whhhyyyy???) и потому он всё генерирует в том порядке, что в коде. А потом спохватывается "ой, да у меня же тут порядок операций другой!" и начинает ковырять что было сзади и вообще подставлять костыли и подпорки. Поэтому результат такой, что плакать хочется.

Это, кстати, ответ на ваш вопрос - почему к luajit ещё нету декомпилятора. Потому что когда компилятор нормальный, то и декомпилятор написать несложно, даже не зная исходников (по факту я их смотрел только когда парсер байткода писал). А когда компилятор - набор костылей и подпорок к костылям, то и декомпилятор написать - задача нетривиальная. Даже зная исходники. Оптимизации тут, к сожалению, совсем не причём. Оптимизаций на уровне байткода нет практически никаких. Он даже if false не вырезает (сам if вырезает, а тело - нет). Собственно, никаких оптимизаций и нельзя сделать в однопроходном компиляторе.

HikeR :
кстати, почему питон?

Ну луа-то я не знаю Ой, не могу!.. А питон знаком по работе, да и на нём можно набыдлокодить чего-нибудь довольно просто. Работает медленно, но тут скорость не важна. Я ещё мог на перле написать, но боюсь тогда было бы как с самим luajit - никто кроме автора даже и прочитать не может.
    Добавлено: 20:04 07-01-2014   
ss39
 61 EGP


Рейтинг канала: 1(6)
Репутация: 2
Сообщения: 192

Зарегистрирован: 10.12.2013
Кхе-кхе, извиняюсь конечно, за вопрос, не то, что бы шибко умный, но мне правда очень интересно знать: движок XR действительно новый или модифицированный от X3?
    Добавлено: 21:42 07-01-2014   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
Новый, во многих местах принципиально. В некоторых - не столь принципиально.

Изменения:
1. Основаная логика захардкожена. Возможно дадут SDK, но не факт - Эгософты обещали, что новый движок ещё более модифицируем, но пока это не так. Впрочем обещанных "утилит" и "документации" (обещаны они были когда-нибудь после релиза) тоже пока нет, так что ждём.

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

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

4. Изменена структура объектов - теперь все объекты модульные. Т.е. можно сооружать очень сложные вещи не нагружая очень сильно движок логики (т.е. без костылей вроде комплексов из X3). Это самый большой вин нового движка, имхо.

5. Ну в плане графики движок явно научился переваривать ранее невиданное число треугольников. В одном кадре X:R треугольников как во всём секторе из X3. Тормозит, правда Улыбка В остальном без особых улучшений.

Из минусов:
6. Число активных объектов явно уменьшилось (во всяком случае пока что). Оттуда и сильный уклон в капитальные корабли и отсутствие возможности покупать истребители игроку. Небольшой флот истребителей как из Х3 (штук 100-200) рискует увеличить популяцию объектов во вселенной вдвое и размер сейва - втрое.
    Добавлено: 00:33 08-01-2014   
HikeR
 145 EGP


Рейтинг канала: 4(57)
Репутация: 30
Сообщения: 886
Откуда: Великий Новгород
Зарегистрирован: 20.09.2005
Night Nord :
Да вообще дебажная инфа никак на рантайм не влияет.

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

Night Nord :
Поэтому результат такой, что плакать хочется.

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

а вот когда начинает работать непосредственно ВМ, там одним проходом и не пахнет, есть и DCE, и развертка циклов, и перевод чисел в int-ы, и (о ужас) выключение проверок границ массивов.

Night Nord :
почему к luajit ещё нету декомпилятора... когда компилятор нормальный, то и декомпилятор написать несложно


GCC - нормальный компилятор?
    Добавлено: 03:17 08-01-2014   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
Сводки с фронтов:

Event Monitor (ну наконец-то!): https://gist.github.com/8325621 https://gist.github.com/8326391
С версии 1.18, емнип. Форматирование пока хромает, завтра исправлю.

Версия для ознакомления - там как минимум пока нету нормальных elseif'ов и local'ы не обозначены как таковые. Да и не компилируется оно - проблемы с таблицами, удалятель слотов переусердствовал. компилируется Улыбка

(Обратите внимание на сей замечательный фрагмент - https://gist.github.com/8324494 - это я тестировал почему у меня падает декомпилятор на какой-то очень странной конструкции. Вроде как elseif, но не elseif. А оказалось это и есть elseif, только развёрнутый руками Улыбка А вы - гуй тормозит...)

Цитата:

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

Предрасчёт константых выражений, вырезание блоков, удаление неиспользуемых переменных - это всё тоже влияет на портируемость? Конечно нет. Не оправдывайте вы косость компилятора - ему и быстрым быть не нужно и простейших оптимизаций можно было бы сделать вагон. А сейчас его максимум хватает JMP -> JMP заменить на один JMP, да и то не всегда.

Слотов он плодит кучу лишних - а это, между прочим, прямая нагрузка на VM. Он даже elseif и else if по разному обрабатывает, что вообще нонсенс.

Но так кода было бы раза в два больше. А автор строки и символы экономит - куда ему ещё разделять синтаксический анализатор и ассемблер, вы что.

Промежуточность продукта (байткода) не есть оправдание кривой архитектуры.

Цитата:
GCC - нормальный компилятор?

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

Но зато там всё чётко - лексер, синтаксический анализатор, ассемблер... В clang'е ещё лучше - там ещё и ассемблер разбит на три куска, один из которых сам llvm, который производит универсальные оптимизации байткода (не теряя его совместимости, между прочим).

Впрочем их декомпилировать проще, но получить что-то стоящее - сложнее, ибо очень много информации теряется. А так да, у luajit даже if false восстановить можно Хы...

Последний раз редактировалось: Night Nord (02:06 09-01-2014), всего редактировалось 6 раз(а)
    Добавлено: 01:22 09-01-2014   
HikeR
 145 EGP


Рейтинг канала: 4(57)
Репутация: 30
Сообщения: 886
Откуда: Великий Новгород
Зарегистрирован: 20.09.2005
Night Nord :
Event Monitor...

это реально достижение, впечатляет. ждем local-ы, без них все довольно зыбко. ужасные вложенные if-ы, надеюсь, будут расово правильными if-elseif-else на "одном уровне" Подмигиваю

Night Nord :
Слотов он плодит кучу лишних - а это, между прочим, прямая нагрузка на VM

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

Night Nord :
Промежуточность продукта (байткода) не есть оправдание кривой архитектуры.

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

Night Nord :
clang потому и начали делать, что GCC - устарел и оказался запутан.

clang - дитя копирастии, которой мешала gpl-ная лицензия GCC, загляните как-нить в список спонсоров проекта. в том же luajit все самые интересные и нужные фичи появились только после акции "утром деньги - вечером фича".

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

добавлено спустя 54 минуты:
-----------
клонировал master, сразу ошибка, что не так?
Код:
d:\devel_src\ljd>python --version
Python 2.7.5

d:\devel_src\ljd>python main.py test.luac
Traceback (most recent call last):
  File "main.py", line 28, in <module>
    import ljd.rawdump.parser
  File "ljd/rawdump/parser.py", line 8, in <module>
    from ljd.util.log import errprint
  File "ljd/util/log.py", line 17
    print(fmt.format(*args), file=sys.stderr)
                                 ^
SyntaxError: invalid syntax


Последний раз редактировалось: HikeR (04:51 09-01-2014), всего редактировалось 1 раз
    Добавлено: 04:51 09-01-2014   
Night Nord
 130 EGP


Рейтинг канала: 2(15)
Репутация: 16
Сообщения: 501
Откуда: Санкт-Петербург
Зарегистрирован: 31.10.2013
Вот более читаемая версия: https://gist.github.com/NightNord/8334382

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

Цитата:
если под "слотами" вы понимаете обычные временные переменные...

Слоты это и есть регистры. В регистровой машине не бывает временных переменных в понимании стэковой машины. Но зато, в отличие от стека, их фиксированное число и перевыделение очень дорого. Вот на верхнем уровне Event Monitor'а почему-то 76 регистров (адовый ... = nil в начале), хотя большая часть из них никогда не используется (может JIT себе подготовил место).

Вы вот лучше скажите - это нормально, что функции self.что-то = function используются на верхнем уровне? Там ещё везде используется upvalue private, но я не пойму где она определёна. Либо это нормально, либо что-то потерялось.

Цитата:
клонировал master, сразу ошибка, что не так?

Вы верно указали версию питона. Нужен третий питон (3.3 пойдёт). Это в вашем виндовом мире python 3 не особо используется, а в нашем линуксовом про второй уже и забыли. Улыбка

Последний раз редактировалось: Night Nord (17:02 09-01-2014), всего редактировалось 1 раз
    Добавлено: 16:59 09-01-2014   
Канал X Rebirth -> Модовый и скриптовый отсек X Rebirth: «Ковыряем новый движок (моддинг)»
На страницу: Пред.  1, 2, 3 ... 11, 12, 13 ... 29, 30, 31  След.    Перейти:   Все страницы
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Иногда, когда едешь на машине по правилам, а тебя останавливает гаишник только, чтоб проверить документы, так и хочется сказать: "Ваши действия бессмысленны, вы теряете прибыль!" (Zandrex-XXX)

  » Ковыряем новый движок (моддинг) | страница 12
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18