Polyacov_Yury Posted July 7, 2016 Author Share Posted July 7, 2016 Да ты что, собирать PS да на здоровье А с каких это пор ты у нас параноик? @ Quote Link to comment Short link Share on other sites More sharing options...
tricsi Posted July 7, 2016 Share Posted July 7, 2016 привет! собстно вопроса два есть ли данные на сколько возрастёт нагрузка на железо ? либо не возрастёт пилится под формат SD или HD ? (имеется в виду формат шкур) @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 8, 2016 Author Share Posted July 8, 2016 (edited) есть ли данные на сколько возрастёт нагрузка на железо ? либо не возрастёт На данный момент пытаюсь понять, где в моем алгоритме "бутылочное горлышко". Ситуация следующая. При установке шкурки или при выходе обновления клиента клиент при запуске примерно на три-пять минут зависает. То есть в процессе "зависона" клиент на самом деле работает, но Форточки агрятся на процесс, мол, у вас зависло. После перечитывания моделей, в том числе при повторном запуске клиента, каких-либо просадок не замечено, да им и браться особо неоткуда. пилится под формат SD или HD ? (имеется в виду формат шкур) Мод сделан таким образом, что формат шкур может быть любой. Главное - на HD-клиент SD-шкурки не ставить. Что тогда будет - не могу прогнозировать. P.S. От'cProfile'ил распаковку пакаджей. 62722936 function calls (61048256 primitive calls) in 292.269 seconds Надо что-то делать. Edited July 8, 2016 by Polyacov_Yury @ Quote Link to comment Short link Share on other sites More sharing options...
tricsi Posted July 8, 2016 Share Posted July 8, 2016 (edited) .. Главное - на 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 July 9, 2016 by tricsi @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 8, 2016 Author Share Posted July 8, 2016 клиент хавает И это хорошо (с) с первой частью в принципе всё понятно, ремоделинг подразумевает под собой замену, естественно приоритет будет из res_mods Ремоделинги нагрузку вообще не создают. Все, что я делаю - это подмена путей к модлеям внутри vDesc'а. Остальное клиент сам может. @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 8, 2016 Author Share Posted July 8, 2016 (edited) Отпрофилировал тот же метод при перезапуске клиента с уже отпатченными моделями. 12619 function calls in 1.031 seconds UPD. Переписал метод с нуля. Код ужало в два раза и не нужны внешние модули типа Packed_Section. 3501114 function calls (3501105 primitive calls) in 192.515 seconds Как видим, времени тратится меньше на треть. Edited July 9, 2016 by Polyacov_Yury 1 @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted July 9, 2016 Share Posted July 9, 2016 (edited) мне нужно распаковать из клиента и пропатчить огромную кучу файлов .model, .visual и .primitives (последние просто распаковать).primitives распаковывать не нужнонужно просто указать в visual путь к primitives, который в pkg. <root> ... <primitivesName>path_to_primitives</primitivesName> ... </root> Edited July 9, 2016 by ShadowHunterRUS @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 9, 2016 Author Share Posted July 9, 2016 primitives распаковывать не нужно нужно просто указать в visual путь к primitives, который в pkg. <root> ... <primitivesName>path_to_primitives</primitivesName> ... </root> По временной трассировке распаковка примитивов - намного незатратнее, чем правка путей к ним :) P.S. На данный момент пытаюсь обернуть обработчик в yield по образцу и подобию Вгшного обновления ресурсов при логине. Знатоки, отзовитесь! D: @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted July 9, 2016 Share Posted July 9, 2016 По временной трассировке распаковка примитивов - намного незатратнее, чем правка путей к ним :)Что? @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 9, 2016 Author Share Posted July 9, 2016 (edited) Что? Ну смотри. Тут получается два метода. Либо extract'ить файлы примитивов, либо добавлять в visual'ы пути к ним. Второе по времени по идее больше времени займет. Сужу по уже затрачиваемому времени. Edited July 9, 2016 by Polyacov_Yury @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted July 9, 2016 Share Posted July 9, 2016 (edited) @Polyacov_Yury, я думал, что Вы visual распаковываете и меняете пути текстур... Edited July 9, 2016 by ShadowHunterRUS @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 9, 2016 Author Share Posted July 9, 2016 @Polyacov_Yury, я думал, что Вы visual распаковываете и меняете пути текстур... Я так и делаю :) И замена строки одной больше времени занимает, чем ZipFile.extract(primitiveFile) @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted July 9, 2016 Share Posted July 9, 2016 (edited) @Polyacov_Yury, странно... Без сорсов не поймешь... Edited July 9, 2016 by ShadowHunterRUS @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 9, 2016 Author Share Posted July 9, 2016 (edited) Да пожалуйста :) 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, походу, был первой ласточкой -_-Только надо разобраться в работе декораторов вообще... Edited July 9, 2016 by Polyacov_Yury 1 @ Quote Link to comment Short link Share on other sites More sharing options...
SkepticalFox Posted July 10, 2016 Share Posted July 10, 2016 (edited) ПыСы. Как оказалось, знатоков async'а в сообществе нету.) Edited July 10, 2016 by ShadowHunterRUS @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 10, 2016 Author Share Posted July 10, 2016 ) Я неправ? о_О Может, научите тогда? @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 11, 2016 Author Share Posted July 11, 2016 (edited) Перерыл половину исходников клиента и часть интернетов. Вышел напрямую на автора 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 July 12, 2016 by Polyacov_Yury @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 13, 2016 Author Share Posted July 13, 2016 (edited) 'DA MATRIX HAZ U' 'And I have da matrix :)' Таки да, GUI-модуль для коллижн-моделей готов и работает. Небольшая бага видна на скрине, но я НЕ считаю ее критичной, поэтому атстаньти. Жду релиза 9.15.1. Edited July 13, 2016 by Polyacov_Yury 4 @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted July 14, 2016 Author Share Posted July 14, 2016 (edited) UPD. Исправил выгрузку моделей. Теперь она не вызывает зависаний клиента (только лаги :P) и не рвет стек. Спасибо BigWorld.callback(). Также исправил вызов при прожатии клавиш. Теперь вызывается колесо загрузки с "Обновлением Ангара". Также закончил работу над target'ами в Фарах. На очереди "Ангарный Краскопульт" :) Edited July 16, 2016 by Polyacov_Yury @ Quote Link to comment Short link Share on other sites More sharing options...
Polyacov_Yury Posted August 21, 2016 Author Share Posted August 21, 2016 Приступаю к редактированию шапки под версию 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.) Что мне теперь требуется. Мне нужна помощь со стороны авторов ремоделингов. Тему надо контентом наполнять. С установкой шкурок благодаря мне пользователь и сам справится, а вот с ремодами надо помочь. Нет, пользователь все так же может простым копипейстом поставить ремоделинг с готовым конфигом в клиент, и все будет работать, но ведь этот самый конфиг еще и написать надо :) 3 @ Quote Link to comment Short link Share on other sites More sharing options...
Recommended Posts
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.