ПрограммированиеФорумОбщее

Написание скрипт движка для игры (Delphi)

Страницы: 1 2 Следующая »
#0
12:26, 22 ноя 2010

Интересуют на данный момент такие вопросы:
Можно ли сделать так чтоб из скрипта можно было обращаться к переменным программы по их имени.
Я конечно понимаю, что при компиляции все лишнее выбрасывается и оптимизируется. Но небось есть же способ узнать  Новые имена переменных, чтоб их сопоставить как -то со старыми и к ним обратиться.
К примеру есть у меня глобальная объект Win
в скрипте чтоб можно было написать вот так
Win.Visible False

#1
12:34, 22 ноя 2010

Kavis
Не во всех языках есть reflection. В це# и в жабе есть, а в цэпэпэ - теоретически можно сказать что есть.

#2
13:44, 22 ноя 2010

в Lua можно переопределить __index и __newindex для глобальной таблицы
на днях (может даже сегодня) выложу библиотеку (как раз для Delphi), которая позволяет качественно взаимодействовать с Lua

#3
14:27, 22 ноя 2010

DevilDevil
Жду

#4
21:16, 22 ноя 2010

http://www.gamedev.ru/projects/forum/?id=140784

#5
12:11, 23 ноя 2010

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

Вот, я пишу на досуге свой двиг, посмотри на мой класс хеш таблицы (она кстати динамическая):

http://code.google.com/p/orionphp/source/browse/trunk/libs/HashList.pas

#6
14:38, 23 ноя 2010

DevelS
А можно небольшой пример как работать с этим модулем, чтоб чисто начать.

#7
14:45, 23 ноя 2010

DevelS
внутри Lua - очень хорошие хеш-алгоритмы

что касается конкретно моей реализации (вышеупомянутая CrystalLUA) - то хеш алгоритм там ещё лучше )
всё написано на ассемблере, быстрые бинарные поиски, быстрые сравнения строк )

но библиотечка ничо так )
если хочешь поделюсь своими алгоритмами (хешпоисками и хеш по строкам) - я в своё время долго над этим думал )
реализовал просто )

#8
17:39, 23 ноя 2010

DevilDevil
> внутри Lua - очень хорошие хеш-алгоритмы
Какие? :)

>что касается конкретно моей реализации (вышеупомянутая CrystalLUA) - то хеш алгоритм там ещё лучше )
Математически показал, что коллизий меньше? :)

> всё написано на ассемблере, быстрые бинарные поиски, быстрые сравнения строк
Сравнение строк от конца к началу - не кеш френдли. Префетчер на core умеет следить за 12 потоками "вперед", и только за 4 потоками "назад".

#9
18:01, 23 ноя 2010

RPGman
я тут тестировал его на 1000 похожих строк и ужаснулся - один и тот же хеш мог пог повторяться по 7-8 раз
пришлось усовершенствовать алгоритм и на 1000 похожих строк повторения были 2 раза максимум
но это на похожих строках. и на 1000. на непохожих вероятность коллизии меньше

поиск не от конца к началу и не от начала в конец, а с конца и начала к середине
таким образом 100 хешей перебираются за 7 итераций. 1000 - за 10.
бинарный поиск ёп )

одна хеш запись - 8 байт (хеш и указатель/ID)
даже если в твоём классе будет 20 свойств/методов, то хеш таблица занимает 160 байт, что вполне укладывается в кеш )

#10
18:05, 23 ноя 2010

DevilDevil
> поиск не от конца к началу и не от начала в конец
Я не про поиск. Я про вот это:

function SameStrings (const S1, S2 : string) : boolean; overload;
...
@loop_dword:
   mov ebx, [eax + ecx*4 - 4]
   cmp ebx, [edx + ecx*4 - 4]
   jne @exit_false_pop
   dec ecx
   jnz @loop_dword
...
end
#11
18:11, 23 ноя 2010

это сравнение строк
у свойств и методов есть обыкновение быть маленькими. кроме того я думаю S[1] и S[50] будут в одной кешированной странице. Не ?
ну и проверка на равенство тут не побайтовая, а по возможности по 4 байта

так что должно быть быстро
значительно быстрее чем какой-нибудь strcomp()

#12
18:26, 23 ноя 2010

DevilDevil
> кроме того я думаю S[1] и S[50] будут в одной кешированной странице. Не ?
Только при условии выравнивания начала строки на размер кеш линии - 64 байта большинстве современных x86 (всех?)
Прыжок в конец строки из 50 символов практически наверняка даст промах.

> ну и проверка на равенство тут не побайтовая, а по возможности по 4 байта
>так что должно быть быстро
При условии, что "у свойств и методов есть обыкновение быть маленькими", то код, который сначала пытается сравнить байты, потом сравнивает двордами, читаемыми по невыравненным адресам, это офигенский тормоз против тупого побайтового strcmp().

#13
19:10, 23 ноя 2010

RPGman
я тебе не верю )

где взята инфо ?

#14
19:11, 23 ноя 2010

Ну, райнтайм скрипт движка вполне может работать с своей программы, так в чем проблема?

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.