Из темы РА-3:
maisvendoo писал(а): ↑04 авг 2022, 20:45
Предупреждение: перекраска почему-то долго грузится, секунд десять после нажатия "Старт" задумчиво запускается вьювер. Но не надо пугаться - всё потом работает как надо.
Mikhail писал(а): ↑06 авг 2022, 17:46
Вьювер с трёхвагонным РА-3 в ливрее РЖД на моём, не спорю, слабеньком компьютере загружался почти полторы минуты.
Итак, попробовав перекраску РА-3 в ливрее РЖД, столкнулся я с неприлично долгой загрузкой вьювера, причём с нагрузкой на ЦП 80-90%. С обычным РА-3 вьювер загружается у меня секунд 8-10, а с перекраской в 10 раз дольше! Первое, что я проверил - что проблема не в самой текстуре, указав в конфиге в качестве перекраски папку с исходной ливреей ЮППК:
Код: Выделить всё
<ExtTexturesDir>ra3/images</ExtTexturesDir>
Результат - теперь обычный РА-3 тоже грузится полторы минуты. Собственно, весь остальной день я провёл, ковыряясь в
исходниках и пытаясь найти тот лишний код, который компьютер выполняет все эти полторы минуты. И нашёл!
Замена текстуры производится в файле
/viewer/viewer/src/model-texturing.cpp в следующем цикле:
Код: Выделить всё
for (unsigned int i = 0; i < geode.getNumDrawables(); ++i)
Этот цикл последовательно перебирает все элементы модели. А таких элементов в модели РА-3 - сотни! И для каждого затекстуренного элемента производится загрузка нового изображения из newPath, содержащей путь к папке с перекраской, указанной в конфиге:
Код: Выделить всё
osg::ref_ptr<osg::Image> newImage = osgDB::readImageFile(newPath);
if (newImage.valid())
texture->setImage(newImage.get());
То есть для перекрашивания РА-3 вьювер при загрузке сотни раз открывает файл с новой текстурой. Но для РА-3 все текстуры собраны в одном файле RA3_kuzov.tga. Потому я попробовал оптимизировать код, чтобы вьювер мог использовать графический файл с предыдущей итерации цикла:
Код: Выделить всё
// Проверяем, что новая текстура не использовалась в предыдущем цикле
if (newPath != previousPath)
{
newImage = osgDB::readImageFile(newPath);
previousPath = newPath;
}
if (newImage.valid())
texture->setImage(newImage.get());
Собрав себе из исходников новую версию RRS с этим фиксом, запустил снова РА-3 в цветах РЖД. И он запустился за те же 10 секунд, что и раньше!
Я создал pull request с этими изменениями, надеюсь Дмитрий
maisvendoo на их основе вскоре выпустит ещё патч к 1.0.7
Для тех, кто хочет уже сейчас решить проблемы с загрузкой перекрасок, выкладываю свой оптимизированный viewer.exe:
https://drive.google.com/file/d/1MN3lNX ... sp=sharing
Скачанный архив распаковать в папку RRS/bin с заменой.