Професионална програма
Loading...
+ Нов въпрос
Valleri avatar Valleri 294 Точки

Зареждане на ресурси/асети при релийс билд

Привет!
Във лекцията видяхме как се зарежда картинка с макрото SDL_LoadBMP(file). Указахме пътя релативно на пътя на binary-то.
Това е окей за девелопмънт, но ако дадем байнърито си на Пешо, като се опита да го пусне, ще му изгърми понеже той няма да има "../assets/helloworld.bmp".

Идвам от Java и Javascript и там практиката е да има стъпка при билдването, която копира ресурсите в релийс папката за да бъдат налични в артефакта. Обикновенно, туулове като Maven ползват конвенции за това къде стоят статичните файлове в един стандартен Джава проект и се грижи да копира файловете в джара.
А в Javascript се копират в папка в директорията на index.html, където са JS и CSS файловете. Тулове като webpack се грижат за това с минимална конфигурация.
Тоест, и в двете билд системи, в папката билд има всичко необходимо за да се "прати на Пешо" приложението и да заработи. 

Каква е практиката при C++ приложенията?

Извинявам се за дългия въпрос, дадох всичко от себе си да го поясня :)

P.S. Форума вече не е празен! heart

Тагове:
1
C++ Applications Development 09/10/2021 23:26:09
j.petrov_90 avatar j.petrov_90 313 Точки
Best Answer

Привет, Валери,

Благодаря ти за хубавия въпрос.

За целите на курса не съм предвидил експортване на ресурси в папката на binary-то.

Обаче ми даваш солиден аргумент да помисля в тази насока.

Благодаря за обратната връзка.

 

Все пак ще се опитам да отговоря на въпроса ти с това каквото ми идва на ум.

Подобно на Maven, Cmake може да направи същотото нещо - да копира асетите в release папката на проекта.

Това става с командата copy.

Така "Пешо" ще има достъп до тях от своята машина.

 

Важна вметка - в C++ не можем да вкараме асететите вътре в binary-то. Те си стоят като отделни файлове извън него.

И тук можем да навлезем в доста дълбока теория, но предпочитам само да я спомена без да влизам в детайли.

Ако просто копираш асетите си - ти ще ги дадеш директно на крайния потребител.

Въпроса е дали го искаш или не.

Ако отговорът е не (или поне не директно) това, което съм виждал да правят много проекти е да "пакетират" асетите си в един файл - например resources.bin

Този файл ползва вътрешен proprietary формат и така крайния потребител не може да го прочете.

А в runtime асетите се четат и зареждат от този един файл.

 

Поздрави

2
10/10/2021 09:41:05
kolioi avatar kolioi 621 Точки

Ресурсите се компилират с resource compiler и се добавят към exe-то (или dll). Майкрософтския компилатор (за приложения под Windows) e rc.exe, компилатора на Qt е rcc.exe. И двата са вградени съответно в MS Visual Studio и Qt Creator, но могат да се викат и самостоятелно, от командния ред. Обикновено се вграждат малки по размер ресурси, например икони, курсори, акселератори, менюта и др. Могат да се отделят и в отделна библиотека ако са повече.

Ресурсите на всяко exe или dll могат да се видят с вградения във Visual Studio Resource Editor. Например DependencyWalker (depends.exe) има следните ресурси: Accelerator, "AVI", Bitmap, Dialog, "FILE", Icon, Menu, String Table, Toolbar, Version.

3
j.petrov_90 avatar j.petrov_90 313 Точки

Благодаря, kolioi,

Лично нямам опит с "вграждането" на ресурси с въпросните тулове.
Правил съм нещо подобно като съм include-вал съдържанието на файл директно като масив compile time.
Но това е било единицен случай, с който решавахме конкретен казус.

Както каза, ако ресурсите са по-големи като размер - обикновенно идват в друг файл или библиотека, от която вече се четат в run-time.
Никой не би искал 20 GB binary (.exe) :)

Поздрави

0
MartinBG avatar MartinBG 3904 Точки

Ако говорим за приложения с много файлове - напр. игрa, е по-практично binary-то да бъде копирано (ръчно или автоматично) в папката с ресурсите, откъдето да бъде стартирано, вместо ресурсите да бъдат копирани някъде по време или след билдването.

Папката с ресурсите може да има система за контрол на версиите, отделна от тази на source кода.

Готовото приложение (binary + ресурси + конфигурации) може да се пакетира в installer, който да се "прати на Пешо" :) 

2