• Когда точно в Lua массив ( таблица только с array-part ) приобретает hash-part ( становится hash )?

    starius
    @starius
    программист, аспирант МГУ
    В файле ltable.c сказано следующее:

    The actual size of the array is the largest 'n' such that at least half the slots between 0 and n are in use.

    Таким образом, массив охватывает ключи от 0 до такого числа n, что используется хотя бы половина. Давайте ещё посмотрим на код функции computesizes, которая решает, каким будет размер массива при изменении размера таблицы. Эта функция перебирает степени двойки (1, 2, 4, 8 ...) и смотрит, какая доля массива была бы занята, если бы он был такого размера. Останавливается, когда эта доля становится меньше половины. Нетрудно доказать, что при таком алгоритме выбора размера массива и при сплошном заполнении всех ключей от 1 до n обязательно будет выбран размер массива, больший или равный n.

    Кстати говоря, из этого же следует, что при добавлении в конец массива элементов будут накладные расходы, но не на хеш-часть, а на пустые элементы массива, выделенные "про запас". Но так и должно быть, чтобы не перестраивать массив при каждом новом элементе. (В C++ vector.push_back ведёт себя так же.) Если заранее знаете окончательный размер массива и хотите на этом выгадать, то напишите сишное расширение, которое вызывает lua_createtable(L, размер-массива, 0).

    По поводу того, не появится ли хеш-часть при замене значений на различные типы. Не появится. Дело в том, что в паре ключ-значение ключ и значения хранятся в разных полях. Я отследил как используется поле i_val, оказалось только в макросе gval, тип которого нигде не фигурирует (только проверки на nil).

    Кроме того, могу посоветовать использовать rawset и lua_rawseti, так как они не проверяют метаметоды, поэтому должны работать быстрее. Про lua_rawseti я уверен, что работает быстрее, а про rawset подозреваю.
    Ответ написан
    Комментировать
  • Cocos2d-x для настольных компьютеров (Win, Mac, Linux) и производительность

    R10
    @R10
    Выгодными преимуществами cocos2d-x оказались:
    — open source
    — MIT License — меняй что хочешь и годна для коммерческого использования
    — по сравнению с конкурентами (даже с платными) не такой то он сырой оказался,
    регулярно переписывается и дополняется + довольно обширное коммьнити, к которому примыкает и коммьюнити obj-c-шного cocos2d
    — C++ — легко дополнять сторонними и самописными либами, при правильной архитектуре Ваша кодобаза может существовать и без кокоса, в случае чего можно перенестись на другой движок (в отличие, к примеру от платного и мега-раскрученного Юнити)
    По части кроссплатформенности меня пока устраивает связка иОС + Винда.
    Очень удобно вести разработку на зрелой винде в нормальной вижуал студии и потом просто перекомпилить в икс-коде для иОС.

    По поводу настольных компов — думаю надо сразу изначально целиться на планшетный/телефонный рынок.
    Ответ написан
    Комментировать
  • Cocos2d-x для настольных компьютеров (Win, Mac, Linux) и производительность

    Lerg
    @Lerg
    Defold, Corona, Lua, GameDev
    2. Вы только сразу делайте поддержку разных разрешений монитора. Если тач интерфейс ещё можно докрутить потом, то вот с разрешением не всё так просто. От 480х320 до 2048х1536 и 2560x1600. Чтобы везде графика выглядела чётко. Ещё учитывайте слабые возможности железа мобилок — какие-то крутые эффекты придёться упростить или вовсе отключить, также существуют ограничения по оперативной памяти и максимальному размеру загружаемых текстур.
    Если это всё сразу будете иметь ввиду при написании игры, то портирование будет безболезненным.

    Ещё можно посмотреть в сторону Moai SDK — тоже бесплатная и кросплатформенная, на ней делают Double Fine Adventure и Shadowrun Returns.
    Ответ написан
    Комментировать
  • Cocos2d-x для настольных компьютеров (Win, Mac, Linux) и производительность

    ertaquo
    @ertaquo
    1. cocos2d-x под Windows использует GLEW, работая с OpenGL напрямую (см. cocos2dx\platform\third_party\win32\OGLES\GL).
    Насчет других PC-платформ не знаю, но под Linux вроде все должно быть нормально (используется та же библиотека GLEW).
    2. Смысл есть. Портировать с Windows на Android — довольно просто: проект компилируется с Android NDK и поверх него цепляется обертка на Java. Менять ничего не приходилось. Насчет других мобильных платформ — не знаю, но думаю, тоже не слишком сложно.
    Ответ написан
    Комментировать