From c268071314d64f5f555b13a658bab752c45125ed Mon Sep 17 00:00:00 2001 From: "anton.gurov" Date: Fri, 8 Nov 2019 14:34:13 +0300 Subject: [PATCH] footnote --- story/linux_go_blt_install_quickstart.md | 40 +++++++++++++++++------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/story/linux_go_blt_install_quickstart.md b/story/linux_go_blt_install_quickstart.md index 398235d..c36a453 100644 --- a/story/linux_go_blt_install_quickstart.md +++ b/story/linux_go_blt_install_quickstart.md @@ -9,7 +9,11 @@ // #cgo LDFLAGS: -lBearLibTerminal ``` Что подразумевает глобальную вивдимость библиотеки. Увы, пока пакета с BLT для распространенных дистрибутивов Linux нет. -Поэтому беде нужно помочь руками. Сначала вручную показать линтеру, что такая библиотека есть, и потом перезагрузить +Поэтому беде нужно помочь руками. + +#####Первый метод + +Сначала вручную показать линтеру, что такая библиотека есть, и потом перезагрузить кеш путей к библиотекам:: ```bash $ sudo echo "/path/to/libbearterminal.so" > /etc/ld.so.conf.d/libbearterminal.conf && sudo ldconfig @@ -19,18 +23,20 @@ $ sudo echo "/path/to/libbearterminal.so" > /etc/ld.so.conf.d/libbearterminal.co распространенному стереотипу - доля красноглазых пользователей Linux с каждым годом падает, и эта консольная магия для большинства уже некомильфо. -Способ второй, которым воспользовался я, намного проще для пользователя. -Редактируем файл с биндингами примерно следующим образом: +#####Второй метод + +Способ второй, которым воспользовался я, с которым намного проще жить. +Редактируем файл с биндингами (BearLibTerminal.go) примерно следующим образом: ```go // #cgo LDFLAGS: -L. -Wl,-rpath -Wl,./ -lBearLibTerminal // #include // #include import "C" ``` -(знатоки С, простите, я этими флагами вообще +(знатоки С, простите если что не так, я этими флагами вообще пользоваться не умею) -Далее - собираем приложение с libtcod ```go build -o test```. +Далее - собираем минимальное приложение с blt ```go build -o test```. Проверяем, что относительные пути записались в бинарник: ```bash @@ -41,14 +47,20 @@ objdump -p test | grep RPATH RPATH ./ ``` -Ура! Теперь кладем libBearLibTerminal.so прямо в папку с main.go и запускам go run (или скомпилированный бинарник) прям -оттуда. Собранные таким образом бинарники будут искать библиотеку в той же папке, где находятся они сами. +Ура! Теперь кладем libBearLibTerminal.so прямо в папку с main.go и запускам go run +(или скомпилированный бинарник) прям оттуда. Собранные таким образом бинарники будут +искать библиотеку в той же папке, где находятся они сами. -Теперь при дистрибуции приложения можно просто положить .so файл библиотеки рядом, и все будет работать! +Теперь при дистрибуции приложения можно просто положить .so файл библиотеки рядом, +и все будет работать! -Вторая кочка, на которой мне пришлось столкнуться - -то то, что вызов любой своей функции не из main thread BLT воспринимает крайне нервно, -и сыпет фатальными ошибками. Справедливости ради точно так же ведет себя и большинство +Горутины и многопоточность +--- + +Вторая кочка, на которой мне пришлось столкнуться - то то, что вызов любой своей +функции не из main thread BLT воспринимает крайне нервно, +и сыпет фатальными ошибками. Это неприятно, тк часто Го выбирают именно за +многопоточность из коробки. Но справедливости ради точно так же ведет себя и большинство других библиотек связанных с рендером и вводом-выводом, тот же SDL например. Так что воспринимайте это как милую особенность использования CGO. @@ -99,7 +111,7 @@ func MainLoop(state GameState) { State - это обычный Value Object, экземпляр типа GameState. Я его использую как контейнер для важных для игры данных - уровня, состояния рендера, разных тикеров, -каналов для рендера и ввода-вывода итп. Так как он глобальный (или просто передается +каналов для рендера и ввода-вывода итп[^1]. Так как он глобальный (или просто передается по аргументам), то именно в него встроен метод Do. Если нам скажем в пакете где описывается некий предмет надо нарисовать при его поднятии какой-то супер-эффект на экране - мы поступаем вот так: @@ -139,3 +151,7 @@ func renderSuperEffect() { запихивает в очередь на выполнения в main thread эту самую реализацию. Которая с успехом выполняется в main loop. В целом картина именно такая, но больше подробностей можно найти по ссылкам в комментариях. + +[^1]: Если такой контейнер сериализовать (рекурсивно вместе со всем содержимым) и +записать на диск, то потом можно его прочитать и десереализовать. Получив тем самым почти +бесплатно Save / Load. \ No newline at end of file