Vladislav
#holywar
Ioann_
гитхаб показать?
Если у них есть гитхаб с открытым кодм телеги, тогда не надо.
Stanislav
Anonymous
А пруфы то есть ?
Держи: https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/Patches/qtbase_5_6_2.diff
Этот патч просто образец говнокода.
cyberzx 🇷🇺
Глянул сорсы. С++ код хороший. Ты посмотри на какой-нибудь CRYEngine. Вот там плакать захочется
Berkus
Ioann_
я если что не в теме - никогда не следил за телегой :)
P.s - а десктопчег версия, Виталик на которую ты скинул пруф, она official ? Если нет, так и претензий к телег никаких нету, как таковых - остальное, это уже те кому нужно пилят
Vladislav
Berkus
Berkus
код хороший, много времени это не займет
cyberzx 🇷🇺
Anonymous
Berkus
У меня генту
окей, пойдешь мейнтенить ЭТО для генту, не заглядывая в патчи федоры?
cyberzx 🇷🇺
А что его мейнтейнить? УМВР
Berkus
ну ну
cyberzx 🇷🇺
Вы загляните в код openssl какого-нибудь
cyberzx 🇷🇺
И ничего, мейнтейнят
Anonymous
А что его мейнтейнить? УМВР
Используешь полу-проприетарный блоб с официального сайта, собранный с протухшими версиями в т.ч. openssl?
Ioann_
На первый взгляд в самих сорцах говнокода не вижу. Но мне с ними точно не по пути, использовать в core QString ... Но они и не математикой занимаются, тут я думаю, производительность не важна - так что норм.
cyberzx 🇷🇺
Ты так говоришь, как будто это плохо.
Мы вот выпускаем игру под линукс и тоже распространяем его блобом со статически слинкованным openssl. Это удобно и везде работает
Ioann_
У них такие же имена файлов как у меня :D
Ioann_
типа basic_types и т.д
Anonymous
Ioann_
Ioann_
Очень даже неплохо, я бы сказал
Berkus
cyberzx 🇷🇺
Nikita
Пока что
Ioann_
вот их код
Ioann_
Berkus
Berkus
в банжи мыль, а то они там страдают чот (в ноти дог и гориллу вряд ли сразу вот так возьмут)
Ioann_
вот мой :D
Ioann_
Vladislav
https://t.me/pogromisty
Ioann_
Не, не - я там потом дефайн добавил таки
Anonymous
Ioann_
Пишу, конечно может и хуйню. Но какое мне дело, главное это ... $
Berkus
Aidar
*Нужно
Berkus
впрочем, после заявления "какое мне дело какую хуйню я пишу" можно дальше не обсуждать
Aidar
да там реально хуйня же
Ioann_
На самом деле, у меня один из самых быстрых SHA_1 хешей, с интринсиками и т.п :)
Berkus
да да, конечно
Aidar
на O0?
Ioann_
не, в дебаге, ты чего :D
Aidar
это не ты код в O0 тестируешь?
cyberzx 🇷🇺
Ioann_
Ну это его заливать надо на GH - мне реально в лом, но то что работает быстро, тестировал, проверял на том что отыскал в опенсорсе, например и еще с парой коммерческих версий тех мест где работал
Ioann_
Нет ну а что ты хочешь, беркус - если нужно будет, я конечно выложу. Это не проблема - это тебе не Пуассона минимизировать на CUDA. Но все равно, я скидывал скрин не для того чтобы рассказать о скорости, а чтобы сравнить свой код с ТГ
Ioann_
Berkus
cyberzx 🇷🇺
о, нашёл консольный телеграм клиент. https://github.com/vysheng/tg
QTшный не нужен
Egor
Ioann_
Нет ну а что ты хочешь, беркус - таким образом, мне хоть весь код заливай. Конечно SHA_1 - не Пуассона минимизировать на CUDA, но все равно, я скидывал скрин не для того чтобы рассказать о скорости, а чтобы сравнить свой код с ТГ. Но вот еще один, опять же - древний. Но рабочий :) Super Fast And Robust
Danylo
Все таки продублирую и сюда:
Danylo
Добрый вечер, есть у меня вопрос архитектурный:
Предыстория: пишу небольшой игровой движок, стараюсь построить красивую и безопасную компонентную систему, компоненты хранят только данные, обобщенная логика находится в системах движка, каждая из которых отвечает за свой круг задач (рендеринг/ввод/скриптовая система и тд).
И так получается, что некотоые семейства компонентов тесно связаны с сопровождающими их системами, из которых компонентам в СТРОГО ОПРЕДЕЛЕННЫХ случаях нужно дергать часть интерфейса. Например, при создании компонента GLObject, описывающего объект, который может быть отрисован системой рендеринга, компоненту требуется "регистрация" в этой системе, при удалении компонента - наоборот.
Для того, чтобы выборочно открывать интерфейсы некоторым компонентам, использую паттерн Attorney/Client: систему сопровождают friend-классы, которые через static-функции и friend могут выборочно открывать часть интерфейса компонентам.
Вопрос: есть ли еще какие-нибудь стратегии для предоставления выборочного доступа к закрытому интерфейсу, кроме вышеописанной? Не хотелось бы плодить негибкике зависимости или открывать интерфейс полностью.
Danylo
да, поправил
спасибо
Danylo
да, видимо более легковесного компайл-тайм решения нет
Danylo
ну и ладно
cyberzx 🇷🇺
Добрый вечер, есть у меня вопрос архитектурный:
Предыстория: пишу небольшой игровой движок, стараюсь построить красивую и безопасную компонентную систему, компоненты хранят только данные, обобщенная логика находится в системах движка, каждая из которых отвечает за свой круг задач (рендеринг/ввод/скриптовая система и тд).
И так получается, что некотоые семейства компонентов тесно связаны с сопровождающими их системами, из которых компонентам в СТРОГО ОПРЕДЕЛЕННЫХ случаях нужно дергать часть интерфейса. Например, при создании компонента GLObject, описывающего объект, который может быть отрисован системой рендеринга, компоненту требуется "регистрация" в этой системе, при удалении компонента - наоборот.
Для того, чтобы выборочно открывать интерфейсы некоторым компонентам, использую паттерн Attorney/Client: систему сопровождают friend-классы, которые через static-функции и friend могут выборочно открывать часть интерфейса компонентам.
Вопрос: есть ли еще какие-нибудь стратегии для предоставления выборочного доступа к закрытому интерфейсу, кроме вышеописанной? Не хотелось бы плодить негибкике зависимости или открывать интерфейс полностью.
Мы тоже пилим свою ECS. Но у нас система получает события о создании или удалении энтити и уже может запросить у энтити компоненты, которые ей нужны. Если он есть, то они регистрируются.
cyberzx 🇷🇺
Сами компоненты почти всегда являются простыми данными и у них нет никаких интерфейсов, которые надо открывать
Ivan
У вас геймдев?
cyberzx 🇷🇺
да
Danylo
Vladislav
ведроид-разработчиком можно заработать больше чем схемотехником
Крылатый
Что востоебованней, там и больше денег.
Alexander
Все таки продублирую и сюда:
если вы пришли к тому, что у вас иногда клиентский код испытывает необходимость дернуть тольку часть публичного контракта - вы нарушили S.O.L.I.D, а именно смотрите в сторону interface segregation. Используйте фабрику (Fabric) для получения инстанса, но не порождайте объект отдельно от его эко системы. Другими словами если у вас GLObject котороый в себе несет данные для рисования и GLRenderer для отрисовки этих данных то сделайте ответственностью GLRender инстанциирование GLObject и его удаление. Так же, чтобы контракт GLRender не стал очень больший - как было скзаано выше соблюдайте solid, сделайте: GLPlayerObject и GLPlayerRender, GLItemObject и GlItemRender и так далелл, т.е четко разнестите ответственности.
Alexander
я вот нарпимер лично против анимичности объектов (когда объект - не объект вовсе а dto)
Alexander
смысл объекта: данные и логика вместе
Danylo
я с вами совершенно согласен
Сделать систему отрисовки по совместительству фабрикой - неплохая идея, но проблема в том, что GLOjbect как компонент связан не только с самой системой, но и с Entity, на котором висит компонент. В любом случае требуется регистрация с двух сторон.
Хотя, забудьте все, написанное выше. Пока печатал, придумал workaround : )
По поводу dto: предназначение компонента в контексте системы отрисовки - не передавать данные, а просто хранить их в четко определенном месте с четкой структурой. Это продиктовано устройстом графических API, обращение к данным для выставления состояния внутренней стэйт-машины должно происходить как можно меньшее количество раз. Обращения к драйверам для выставления состояния очень дорогие (в тесном цикле).
Исхожу из того, что системе всегда лучше знать, когда ей стоит обращаться к стейт машине и стоит ли вообще. Компонент этого знать не может.
Он, в общем-то, может узнать, но это снова потребует лишней переброски данных, а это недопустимо.
Danylo
Спасибо, гляну
Alexander
я с вами совершенно согласен
Сделать систему отрисовки по совместительству фабрикой - неплохая идея, но проблема в том, что GLOjbect как компонент связан не только с самой системой, но и с Entity, на котором висит компонент. В любом случае требуется регистрация с двух сторон.
Хотя, забудьте все, написанное выше. Пока печатал, придумал workaround : )
По поводу dto: предназначение компонента в контексте системы отрисовки - не передавать данные, а просто хранить их в четко определенном месте с четкой структурой. Это продиктовано устройстом графических API, обращение к данным для выставления состояния внутренней стэйт-машины должно происходить как можно меньшее количество раз. Обращения к драйверам для выставления состояния очень дорогие (в тесном цикле).
Исхожу из того, что системе всегда лучше знать, когда ей стоит обращаться к стейт машине и стоит ли вообще. Компонент этого знать не может.
Он, в общем-то, может узнать, но это снова потребует лишней переброски данных, а это недопустимо.
по поводу dto: вобщем GLObject тогда просто структура, DTO, аттрибут, whatever... но не объект, с моей точки зрения.
если у вас MVC, а похоже на то (потому что у вас model это то что вы entity называете, view это GLObject в котором аттрибуты отрисовки хранятся и controller это GLRedner в котором логика вся) то и делайте придерживаясь MVC, будет меньше проблем. Например как-нить так:
EntityService - ответсвтенность управлять жизненным циклом вашей Entity, т.е делать crud для entity
EntityRenderer - ответственность логика отрисовки / упралвение жизненным циклом EntityRenderData, например
EntityRenderData* create(Entity&) - создает и возвращает новый EntityRenderData, и хранит его внутри по Entity.id в какой-нить map
После чего вы можете инжектить EntityRender в EntityService или же при помощи композиции в нектором управляющем коде снаала создавать Entity через соотв сервис и затем создать EntityRenderData
Alexander
"Мы решили отказаться от возможности изменения компонентов в энтити после создания" << вот тут истина, immutability наше все
Anonymous
Е.А. Зуев А.А. Чупринов Стандарт C++: перевод, комментарии, примеры. — Москва: ООО «ВАШ ФОРМАТ». — 2016 г. — 888 с