Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Lua C Api, референс на значение, время жизни, сборщик мусора (2 стр)

Lua C Api, референс на значение, время жизни, сборщик мусора (2 стр)

Поделиться

Страницы: 1 2

MrGobusПользовательwww6 ноя. 201711:39#15
loyso

где то в lua:

  function event(self, x, y)
    print("click at x:", x, "y:", y)
  end

  player.on("click", event)

где то в си

void onClickEvent(int x, int y) {
  Object* obj = firstObject;
  while(obj) {
    if (inObject(obj, x, y)) {
      // вот тут надо вызвать эвент установленный в луа
      // а значит надо иметь указатель на plaeyr внутри obj (obj.self), а это значит нужен залоченый референс
      // но тогда объект станет неубиваемым, и может затеряться в памяти
    }
    obj = obj->next;
  }
  
}

loysoПостоялецwww6 ноя. 201711:49#16
MrGobus
> тогда объект станет неубиваемым, и может затеряться в памяти
Строго говоря, в паттерне ивентов (publisher/subscriber) player должен уметь подписываться на уведомления (от UI?) и _отписываться_ (удаление из твоего списка)
Внутри malloc/free scope существует еще subscribe/unsubscribe scope для соответствующих подсистем.

Если придерживаться симметрии:

local player = Player:new()
player:SubscribeToEverything();
...
player:UnsubscribeFromEverything(); // вместо delete
// ну а дальше player может даже пожить в "предбаннике" отписанным. И его можно передобавить. И т.д.
// free - не единственный сценарий.
Я за все симметричное! (явные shutdown в порядке, обратном init)

Правка: 6 ноя. 2017 11:52

MrGobusПользовательwww6 ноя. 201711:58#17
loyso
> Оставь в своем С++ просто классы с одинарным public наследованием. А из stl
> типично надо немного - vector и map :)
> Все легче будет.

Не будет =)
stl контейнеры не предназначены хранить классы.

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

А морока с копирующим конструктором при присваивании.

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

в результате с++ ненужен =)

MrGobusПользовательwww6 ноя. 201712:00#18
loyso
> Внутри malloc/free scope существует еще subscribe/unsubscribe scope для
> соответствующих подсистем.

Я тут не совсем понимаю терминологию. Это часть lua или то, как должно быть?

Правка: 6 ноя. 2017 12:02

loysoПостоялецwww6 ноя. 201712:05#19
MrGobus
> stl контейнеры не предназначены хранить классы.
Ты имеешь ввиду что объекты классов придется хранить по укзаателю?

> Например класс сохраненный в map не будет иметь доступ к ключу. Предположим
> ключ - это имя класса, тогда у нас либо будут дубли, либо сложна система
> указания, и лишние указатели.
В простом случае ключ будет smart pointer'ом на shared объект ключа.
Но я понял - ты хочешь интрузивные контейнеры и интрузивное все.
Возьми EASTL или скрафти все сам - нет блокеров.

> А морока с копирующим конструктором при присваивании.
Не надо объекты копировать вот так :) Это от неопытности.

Правка: 6 ноя. 2017 12:06

loysoПостоялецwww6 ноя. 201712:16#20
MrGobus
> Это часть lua или то, как должно быть?
К lua не имеет никакого отношения.
publisher/subscriber (signal/slot) - это паттерн.
https://ru.wikipedia.org/wiki/Издатель-подписчик_(шаблон_проектирования)
(форум ссылку не матчит, url тег тоже)

Scope - это просто здравый смысл. Простой как push eax/pop eax. Расцепленность и сплоченность подсистем должны обеспечиваться инкрементальными действиями add/remove, register/unregister, new/delete и так далее.
https://ru.wikipedia.org/wiki/Область_видимости
(статья сильно хуже, чем английская блин)
Короче scope в широком смысле.

Правка: 6 ноя. 2017 12:25

innuendoПостоялецwww6 ноя. 201712:19#21
MrGobus
> Я тут не совсем понимаю терминологию.
observer/listener
loysoПостоялецwww6 ноя. 201712:29#22
MrGobus
local ui = UI:new()
local player = Player:new()
ui:Subscribe(player)
...
ui:Unsubscribe(player)
Ну и player:UnsubscribeFromEverything() - просто полезный хелпер.

Правка: 6 ноя. 2017 12:50

MrGobusПользовательwww6 ноя. 201712:32#23
loyso
> > stl контейнеры не предназначены хранить классы.
> Ты имеешь ввиду что объекты классов придется хранить по укзаателю?

Я имею в виду, что и так и так неудобно.

> Возьми EASTL или скрафти все сам - нет блокеров

Угу, так и есть, скрафти все сам.
И зачем тут c++?

> Не надо объекты копировать вот так :) Это от неопытности.

Как это не надо O_x

class Texture {
public:
GLint texture;
Texture() {
  glGenTextures(1, &this->texture);
}
~Texture() {
  glDeleteTextures(1, &this->texture);
}
};

std::map<std::string, Texture> textures;
Texture t = texture; // и вот тут у нас два экземпляра класса указывающие на одну и туже текстуру

Да можно & или * или даже shared ptr, но рано или поздно всплывет, слишком много способов прострелить ногу =)

loysoПостоялецwww6 ноя. 201712:37#24
MrGobus
> но рано или поздно всплывет
Не вижу как Си тебе во всех описанных проблемах помогает. GLint и в C++ можно поюзать напрямую.
Но метания понятны - от страха, да в полымя :)

Правка: 6 ноя. 2017 12:38

MrGobusПользовательwww6 ноя. 201712:42#25
loyso
> Не вижу как Си тебе во всех описанных проблемах помогает. GLint и в C++ можно
> поюзать.

Да никак по сути, просто не тащу за собой груз stl библиотек =) exe меньше будет =)

loysoПостоялецwww6 ноя. 201713:11#26
MrGobus
local renderer = Renderer:new()
local ui = UI:new(renderer)
local player = Player:new()

renderer:Subscribe(player)
ui:Subscribe(player)
...
ui:Unsubscribe(player)
renderer:Unsubscribe(player)
В таком подходе lua ref в глобальный registry работать не будет. поэтому он luaL_ref а не lua_ref (тип ключа тоже лучше сменить).
Нужны локальные registry для каждой подсистемы, очевидно (просто луа таблицы и генерация next_integer_key++;)

Правка: 6 ноя. 2017 13:34

loysoПостоялецwww6 ноя. 201713:45#27
loyso
> lua ref в глобальный registry работать не будет
Я не прав! Там FREELIST_REF в качестве индекса. Т.е. g_next_integer_key++;
Много luaL_ref на одну и туже таблицу просто задают _каждый вызов_ по новому вхождению kv с уникальным ключом k и с одной и тоже же ссылкой v.

Страницы: 1 2

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

2001—2017 © GameDev.ru — Разработка игр