Jump to content
Korean Random
Polyacov_Yury

Центр управления танковыми моделями: Ремодомод и Шкуродёр

Recommended Posts

Да ты что, собирать 

PS да на здоровье 

А с каких это пор ты у нас параноик? :gg:

Share this post


Link to post

Short link
Share on other sites
 

привет!

собстно вопроса два

есть ли данные на сколько возрастёт нагрузка на железо ? либо не возрастёт

пилится под формат SD или HD ? (имеется в виду формат шкур)

Share this post


Link to post

Short link
Share on other sites
есть ли данные на сколько возрастёт нагрузка на железо ? либо не возрастёт

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

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

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

 

 

пилится под формат SD или HD ? (имеется в виду формат шкур)

Мод сделан таким образом, что формат шкур может быть любой. Главное - на HD-клиент SD-шкурки не ставить. Что тогда будет - не могу прогнозировать.

 

P.S. От'cProfile'ил распаковку пакаджей.

62722936 function calls (61048256 primitive calls) in 292.269 seconds

Надо что-то делать.

Edited by Polyacov_Yury

Share this post


Link to post

Short link
Share on other sites
.. Главное - на HD-клиент SD-шкурки не ставить. Что тогда будет - не могу прогнозировать.

 

P.S. От'cProfile'ил распаковку пакаджей.

62722936 function calls (61048256 primitive calls) in 292.269 seconds

Надо что-то делать.

Привет !

с первой частью в принципе всё понятно, ремоделинг подразумевает под собой замену, естественно приоритет будет из  res_mods

по поводу распаковки, пообщайся с лисом (блендер) , там очень быстро всё происходит

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

между SD и HD клиентами, как такового, различия в работе нет, это как и  у  автомобилей, базовая комплектация (SD), ну и базовая + плюшки (HD), тем более HD начинает работать только если ползунок текстур в положении "максимум", до этого положения HD работает как SD клиент (стандартная и улучшенная графика и тд и тп, всё одинаково)

по задумке WG, при включении максимальных настроек текстур, открывается доступ к работе с HD контентом, который начинает отображаться только вблизи, отдалил, переключилось на SD, поэтому и два файла с разными названиями и разными по размеру полотнами...так задумали WG, но...ты ж понимаешь, пару тестов (в своё время) и всё встаёт на свои места..

беру шкуру из HD контента с таким названием  .. блабла_hd  большое полотно, рисую, стираю суффикс _hd  получаю   блабла  большое полотно (формат без изменений DXT1)...название от SD, а размер от HD ..ставлю в клиент..работает на SD, HD клиентах, при любом положении ползунка текстур, в высоком качестве, не пропадает при приближении или отдалении и тд и тп, в общем получился универсальный файл, с тех пор так и делаю шкуры, и клиент хавает

да, чуть не забыл, последнее изменение от WG, они отрезали HD клиент от х86 битных систем, теперь только х64

Edited by tricsi

Share this post


Link to post

Short link
Share on other sites

 

 

клиент хавает
И это хорошо (с)

 

 

с первой частью в принципе всё понятно, ремоделинг подразумевает под собой замену, естественно приоритет будет из res_mods

Ремоделинги нагрузку вообще не создают. Все, что я делаю - это подмена путей к модлеям внутри vDesc'а. Остальное клиент сам может.

Share this post


Link to post

Short link
Share on other sites

Отпрофилировал тот же метод при перезапуске клиента с уже отпатченными моделями.

12619 function calls in 1.031 seconds

UPD. Переписал метод с нуля.

Код ужало в два раза и не нужны внешние модули типа Packed_Section.

3501114 function calls (3501105 primitive calls) in 192.515 seconds

Как видим, времени тратится меньше на треть.

Edited by Polyacov_Yury
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

мне нужно распаковать из клиента и пропатчить огромную кучу файлов .model, .visual и .primitives (последние просто распаковать).

primitives распаковывать не нужно

нужно просто указать в visual путь к primitives, который в pkg.

<root>
  ...
  <primitivesName>path_to_primitives</primitivesName>
  ...
</root>
Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

primitives распаковывать не нужно

нужно просто указать в visual путь к primitives, который в pkg.

<root>
  ...
  <primitivesName>path_to_primitives</primitivesName>
  ...
</root>

По временной трассировке распаковка примитивов - намного незатратнее, чем правка путей к ним :)

 

P.S. На данный момент пытаюсь обернуть обработчик в yield по образцу и подобию Вгшного обновления ресурсов при логине. Знатоки, отзовитесь! D:

Share this post


Link to post

Short link
Share on other sites

По временной трассировке распаковка примитивов - намного незатратнее, чем правка путей к ним :)

Что?

Share this post


Link to post

Short link
Share on other sites

Что?

Ну смотри.

Тут получается два метода.

Либо extract'ить файлы примитивов, либо добавлять в visual'ы пути к ним.

Второе по времени по идее больше времени займет. Сужу по уже затрачиваемому времени.

Edited by Polyacov_Yury

Share this post


Link to post

Short link
Share on other sites

@Polyacov_Yury, я думал, что Вы visual распаковываете и меняете пути текстур...

Я так и делаю :) И замена строки одной больше времени занимает, чем ZipFile.extract(primitiveFile)

Share this post


Link to post

Short link
Share on other sites

Да пожалуйста :)

res = ResMgr.openSection('../paths.xml')
sb = res['Paths']
vl = sb.values()[0]
if vl is not None and not hasattr(BigWorld, 'curCV'):
    BigWorld.curCV = vl.asString

texReplaced = False
skinsFound = False

def skinEnabler():
    global texReplaced, skinsFound
    skinVehNamesLDict = {}
    CRC32cacheFile = '%s/vehicles/skins/CRC32_textures.txt' % BigWorld.curCV
    CRC32cache = None
    if os.path.isfile(CRC32cacheFile):
        CRC32cache = open(CRC32cacheFile, 'rb').read()
    skinsPath = '%s/vehicles/skins/textures/' % BigWorld.curCV
    if os.path.isdir(skinsPath):
        if len(glob.glob(skinsPath + '*')):
            skinsFound = True
            print 'RemodEnabler: listing %s/vehicles/skins/textures for CRC32' % BigWorld.curCV
            CRC32 = 0
            for skin in glob.iglob(skinsPath + '*'):
                skinName = os.path.basename(skin)
                for nation in glob.iglob(skin + '/vehicles/*'):
                    for vehicleName in glob.iglob(nation + '/*'):
                        vehName = os.path.basename(vehicleName)
                        skinVehNamesLDict.setdefault(vehName, []).append(skinName)
                        for texture in glob.iglob(vehicleName + '/*.dds'):
                            CRC32 ^= CRC32_from_file(texture)

            if CRC32cache is not None and str(CRC32) == CRC32cache:
                print 'RemodEnabler: skins textures were not changed'
            else:
                if CRC32cache is None:
                    print 'RemodEnabler: skins textures were reinstalled (or you deleted the CRC32 cache)'
                else:
                    print 'RemodEnabler: skins textures were changed'
                cf = open(CRC32cacheFile, 'w+b')
                cf.write(str(CRC32))
                cf.close()
                texReplaced = True
        else:
            print 'RemodEnabler: skins folder is empty'
    else:
        print 'RemodEnabler: skins folder not found'
    resVer = ResMgr.openSection('../version.xml')
    vlVer = resVer['version']
    lastVersionPath = '%s/vehicles/skins/last_version.txt' % BigWorld.curCV
    clientIsNew = True
    if os.path.isfile(lastVersionPath):
        lastVersion = open(lastVersionPath, 'r').read()
        if vlVer.asString == lastVersion:
            clientIsNew = False
        else:
            print 'RemodEnabler: client version changed'
    else:
        print 'RemodEnabler: client version cache not found'

    modelsDir = '%s/vehicles/skins/models/' % BigWorld.curCV
    skinsModelsMissing = True
    if os.path.isdir(modelsDir):
        if len(glob.glob(modelsDir + '*')):
            skinsModelsMissing = False
        else:
            print 'RemodEnabler: skins models dir is empty'
    else:
        print 'RemodEnabler: skins models dir not found'
    needToReReadSkinsModels = skinsFound and (
        clientIsNew or skinsModelsMissing or texReplaced)
    if clientIsNew:
        if os.path.isdir(modelsDir):
            shutil.rmtree(modelsDir)
        lastVersionFile = open(lastVersionPath, 'w+')
        lastVersionFile.write(vlVer.asString)
        lastVersionFile.close()
    if skinsFound and not os.path.isdir(modelsDir):
        os.makedirs(modelsDir)
    elif not skinsFound and os.path.isdir(modelsDir):
        print 'RemodEnabler: no skins found, deleting %s' % modelsDir
        shutil.rmtree(modelsDir)
    elif texReplaced and os.path.isdir(modelsDir):
        shutil.rmtree(modelsDir)

    modelFileFormats = ('model', 'primitives', 'visual', 'primitives_processed', 'visual_processed')
    if needToReReadSkinsModels:
        print 'RemodEnabler: starting to unpack vehicles packages'
        Waiting.show('Remod: ' + _config.i18n['UI_loading_header_models_unpack'])
        for vehPkgPath in glob.iglob('./res/packages/vehicles*.pkg'):
            print 'RemodEnabler: unpacking %s' % os.path.basename(vehPkgPath)
            vehPkg = ZipFile(vehPkgPath, 'r')
            for memberFileName in vehPkg.namelist():
                if 'normal' in memberFileName and os.path.basename(memberFileName).split('.')[1] in modelFileFormats:
                    for skinName in skinVehNamesLDict.get(os.path.normpath(memberFileName).split('\\')[2], []):
                        if 'primitives' in memberFileName:
                            vehPkg.extract(memberFileName, modelsDir + skinName)
                        elif 'model' in memberFileName:
                            oldModel = ResMgr.openSection(memberFileName)
                            newModelPath = modelsDir.replace('%s/' % BigWorld.curCV, '') + skinName + '/' + memberFileName
                            curModel = ResMgr.openSection(newModelPath, True)
                            curModel.copy(oldModel)
                            if curModel is None:
                                print modelsDir.replace('%s/' % BigWorld.curCV, '') + skinName + '/' + memberFileName
                            if curModel.has_key('parent') and 'vehicles/skins' not in curModel['parent'].asString:
                                curParent = modelsDir.replace('%s/' % BigWorld.curCV, '') + '/' + skinName + '/' + \
                                    curModel['parent'].asString
                                curModel.writeString('parent', curParent.replace('\\', '/'))
                            if 'vehicles/skins' not in curModel['nodefullVisual'].asString:
                                curVisual = modelsDir.replace('%s/' % BigWorld.curCV, '') + '/' + skinName + '/' + \
                                    curModel['nodefullVisual'].asString
                                curModel.writeString('nodefullVisual', curVisual.replace('\\', '/'))
                            curModel.save()
                        elif 'visual' in memberFileName:
                            oldVisual = ResMgr.openSection(memberFileName)
                            newVisualPath = modelsDir.replace('%s/' % BigWorld.curCV, '') + skinName + '/' + memberFileName
                            curVisual = ResMgr.openSection(newVisualPath, True)
                            curVisual.copy(oldVisual)
                            for curName, curSect in curVisual.items():
                                if curName == 'renderSet':
                                    for curSubName, curSubSect in curSect['geometry'].items():
                                        if curSubName == 'primitiveGroup':
                                            for curPrimName, curProp in curSubSect['material'].items():
                                                if curPrimName == 'property' and curProp.has_key('Texture'):
                                                    if 'vehicles/skins/' not in curProp[
                                                        'Texture'].asString and os.path.isfile(
                                                            modelsDir.replace('models',
                                                                              'textures') + '/' + skinName + '/' +
                                                            curProp['Texture'].asString):
                                                        curDiff = modelsDir.replace('%s/' % BigWorld.curCV,
                                                                                    '').replace(
                                                            'models', 'textures') + '/' + skinName + '/' + curProp[
                                                            'Texture'].asString
                                                        curProp.writeString('Texture', curDiff.replace('\\', '/'))
                                                    elif 'vehicles/skins/' in curProp[
                                                        'Texture'].asString and not os.path.isfile('%s/%s' % (
                                                            BigWorld.curCV, curProp['Texture'].asString)):
                                                        curDiff = curProp['Texture'].asString.replace(
                                                            modelsDir.replace('%s/' % BigWorld.curCV, '').replace(
                                                                'models', 'textures') + '/' + skinName + '/', '')
                                                        curProp.writeString('Texture', curDiff.replace('\\', '/'))

                            curVisual.save()

            vehPkg.close()
        Waiting.hide('Remod: ' + _config.i18n['UI_loading_header_models_unpack'])

Если надо, могу импорты написать :)

ПыСы. Как оказалось, знатоков async'а в сообществе нету. Буду рыться сам :) CompoundAppearance, походу, был первой ласточкой -_-
Только надо разобраться в работе декораторов вообще... :gg:

Edited by Polyacov_Yury
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

ПыСы. Как оказалось, знатоков async'а в сообществе нету.

) Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

Перерыл половину исходников клиента и часть интернетов. Вышел напрямую на автора adisp'а. Пообщаться, правда, не рискнул. Выяснил, что это такое, с чем его едят, как оно работает, etc.

При большом количестве async call'ов (а у меня количество такое, что ого-го) алгоритм вываливается с Runtime Error'ом. Не клиент, а именно алгоритм. Мол, рекурсия у тебя большая, парень.

Разбил цепочку вызовов. Сижу наблюдаю черный экран зависшего клиента.
Вот думаю - а может черт с ним, если оно и так и так виснет?

 

UPD. Декораторы увеличили время выполнения обратно до 250 секунд.

 

P.S. Я слышал про трансформацию кода из рекурсивного в итеративный, но вот трансформацию итерации в рекурсию вижу впервые, честно говоря о_О

 

 

'Nuff said.'

RemodEnabler: unpacking vehicles_level_01.pkg # рапорт о начале работы
433 # всего интересовало файлов в пакадже
0 # было извлечено/отResMgrено файов из пакаджа
         25013 function calls in 0.020 seconds # ушло времени на пакадж

RemodEnabler: unpacking vehicles_level_02.pkg
2736
0
         151068 function calls in 0.124 seconds

RemodEnabler: unpacking vehicles_level_03.pkg
3759
0
         205710 function calls in 0.184 seconds

RemodEnabler: unpacking vehicles_level_04.pkg
3795
0
         206164 function calls in 0.173 seconds

RemodEnabler: unpacking vehicles_level_05.pkg
4314
1083
         370804 function calls in 11.010 seconds

RemodEnabler: unpacking vehicles_level_06.pkg
4164
1233
         381959 function calls in 11.527 seconds

RemodEnabler: unpacking vehicles_level_07.pkg
4561
1848
         478231 function calls in 20.026 seconds

RemodEnabler: unpacking vehicles_level_08.pkg
5239
3049
         718092 function calls in 30.507 seconds

RemodEnabler: unpacking vehicles_level_09.pkg
3088
2749
         555962 function calls in 29.057 seconds

RemodEnabler: unpacking vehicles_level_10.pkg
2657
1614
         441139 function calls in 23.644 seconds

         65553 function calls (64930 primitive calls) in 136.712 seconds #общее время

Edited by Polyacov_Yury

Share this post


Link to post

Short link
Share on other sites

'DA MATRIX HAZ U'

post-8065-0-68002400-1468420567_thumb.jpg

 

'And I have da matrix :)'

post-8065-0-84103000-1468438397_thumb.jpg

 

Таки да, GUI-модуль для коллижн-моделей готов и работает. Небольшая бага видна на скрине, но я НЕ считаю ее критичной, поэтому атстаньти.

 

Жду релиза 9.15.1.

Edited by Polyacov_Yury
  • Upvote 4

Share this post


Link to post

Short link
Share on other sites

UPD. Исправил выгрузку моделей. Теперь она не вызывает зависаний клиента (только лаги :P) и не рвет стек. Спасибо BigWorld.callback().

 

Также исправил вызов при прожатии клавиш. Теперь вызывается колесо загрузки с "Обновлением Ангара".

 

Также закончил работу над target'ами в Фарах.

 

На очереди "Ангарный Краскопульт" :)

Edited by Polyacov_Yury

Share this post


Link to post

Short link
Share on other sites

Приступаю к редактированию шапки под версию 2.0. Сам мод выложу позже, когда пересоберу mod_PYmodsGUI.py.

 

Диспетчер управления танковыми моделями aka Ремодомод v.2.0

 

  • Конфиги переведены в JSON. Новая инструкция - в шапке темы.
  • Переработан Шкуродёр. Теперь единственное, что требуется от пользователя - скопировать пак шкурок в папку res_mods/0.9.15.X.X.X.X/vehicles/skins/textures/Имя_Пака _ Шкурок так, чтобы внутри была папка vehicles и запустить клиент. Мод сам сделает все остальное, правда, на это может потребоваться значительное количество времени.
  • Доведена до ума система предпросмотра моделей в ангаре. По нажатию Ctrl+F2 переключаются режимы: Игрок -> Союзник -> Противник (-> Все ремоделинги с игнорированием белых списков, полезно для авторов ремоделингов, отключается в настройках мода) -> Игрок...
  • В каждом режиме предпросмотра отдельно настраивается текущий ремоделинг в соответствии с их настройками белых списков. Переключение по клавишам Ctrl+F3. Триггер пробегает все доступные для данного танка ремоделинги и стандартную модель. Стандартная модель по приоритету приравнена к шкуркам (если для танка есть шкурка - ставится шкурка, если шкурки нет - ставится стандартная модель).
  • Шкурки выбираются по приоритету, который настраивается в файлике scripts/client/gui/mods/RemodEnabler/skinsPriority.json. Мод автоматически вычищает несуществующие паки шкурок из приоритетов, поэтому будьте внимательны. Для игрока, союзников и противников приоритеты настраиваются отдельно (на всякий случай).
  • Мод запоминает ваш выбор ремоделинга в файлик scripts/client/gui/mods/RemodEnabler/remodsCache.json. Не редактируйте его без особой надобности, мод все равно вычищает несуществующие ремоделинги ("" - стандартная модель. Выбор пользователя надо уважать.)
  • Доведен до ума отображатель коллижн-моделей бронирования в ангаре. Включение - Ctrl+F4. Работает в трех режимах: ВЫКЛ, только коллижн, коллижн и сверху текущий ремоделинг (или шкурка, или стандартная модель). Также добавлена табличка соответствия цветов и толщины бронелистов на коллижн-моделях.
  • Ну и конечно, интеграция с GUI. Это не только настройки, но и всплывающие сообщения от мода о его действиях (Установлен ремоделинг, Установлена шкурка, Включен режим предпросмотра танка союзника, etc.)

 


Что мне теперь требуется. Мне нужна помощь со стороны авторов ремоделингов. Тему надо контентом наполнять. С установкой шкурок благодаря мне пользователь и сам справится, а вот с ремодами надо помочь. Нет, пользователь все так же может простым копипейстом поставить ремоделинг с готовым конфигом в клиент, и все будет работать, но ведь этот самый конфиг еще и написать надо :)

  • Upvote 3

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...