Пришло время менять смартфон. Моему iPhone XR уже аж 7 лет, а он по прежнему получает свежие обновления системы. И даже новая iOS 19 будет доступна. В целом он меня абсолютно устраивает. Но тем не менее это довольно большой срок, и решил я присмотреть себе новый с современными технологиями. Я давно в эко системе Apple и практически наизусть знаю вcю их линейку девайсов и какие где есть технологии. К сожалению Apple выпускает однообразные смартфоны каждый год. К тому же в работе мы используем активно Android как одну из целевых платформ. Поэтому решил я присмотреть себе Android с максимальной производительностью и хорошим экраном. Раскладушки меня пока что не интересуют, но я активно слежу за их развитием - думаю за ними будущее. Как вы поняли использовать я его планирую не менее 5 лет. С радостью открыл я интернет и начал искать подходящую модель.
Дизайн современных смартфонов просто отвратителен!
Просто неимоверно бесит этот выпирающий блок камер! Причем этим грешат как apple так и все остальные. Как вы видите на картинке выше камера выпирает почти на саму толщину смартфона. И это флагман за кучу денег! Еще сильно бесит, что этот блок не симметричен, из-за этого телефон нормально не лежит на ровной поверхности. Из-за этого надо в обязательном порядке покупать уродские чехлы, что бы спасти собственно этот блок камер от повреждений. Все это выглядит как костыль какой то и попытка его обыграть. Причем на всех фото производители стараются скрыть этот косяк. Снимая смартфон прямо или под углом. Такое ощущение, что в какой то момент всем сорвало крышу и смартфон начал превращаться в камерафон.
В общем после долгих мучений и отвращений выбрал я себе эстетический вариант с минимально выпирающими камерами, хорошей производительностью и отличным экраном с тонкой одинаковой рамкой. Теперь будем с интересом наблюдать во что превратятся камерафоны.
Дизайн современных смартфонов просто отвратителен!
Просто неимоверно бесит этот выпирающий блок камер! Причем этим грешат как apple так и все остальные. Как вы видите на картинке выше камера выпирает почти на саму толщину смартфона. И это флагман за кучу денег! Еще сильно бесит, что этот блок не симметричен, из-за этого телефон нормально не лежит на ровной поверхности. Из-за этого надо в обязательном порядке покупать уродские чехлы, что бы спасти собственно этот блок камер от повреждений. Все это выглядит как костыль какой то и попытка его обыграть. Причем на всех фото производители стараются скрыть этот косяк. Снимая смартфон прямо или под углом. Такое ощущение, что в какой то момент всем сорвало крышу и смартфон начал превращаться в камерафон.
В общем после долгих мучений и отвращений выбрал я себе эстетический вариант с минимально выпирающими камерами, хорошей производительностью и отличным экраном с тонкой одинаковой рамкой. Теперь будем с интересом наблюдать во что превратятся камерафоны.
Media is too big
VIEW IN TELEGRAM
Фигачу синхронизацию данных через детерминизм. По итогу сделал синхронизацию позиций двух кружков через сервер между двумя программами. Казалось бы, что там делать? А не тут то было. Во первых надо сделать сами программы, что бы они рисовали кружки. Потом надо сделать сервер и сетевой обмен сообщениями с программами. И ко всему этому грамотно применить алгоритм синхронизации данных.
Синхронизация данных не простая задача сама по себе. А если добавить сюда несколько участников которые изменяют эти данные в реальном времени по сети - задача становится нетривиальной. В мультиплеер играх этот процесс является ключевым моментом определяющем качество и играбельность. Я пробовал множество алгоритмов синхронизации данных и есть огромный опыт в этом деле. Планирую поделиться с вами этими ценными знаниями в следующих постах.
ВК
Синхронизация данных не простая задача сама по себе. А если добавить сюда несколько участников которые изменяют эти данные в реальном времени по сети - задача становится нетривиальной. В мультиплеер играх этот процесс является ключевым моментом определяющем качество и играбельность. Я пробовал множество алгоритмов синхронизации данных и есть огромный опыт в этом деле. Планирую поделиться с вами этими ценными знаниями в следующих постах.
ВК
Media is too big
VIEW IN TELEGRAM
Рассказываю про синхронизацию данных в играх простым языком. Здесь я затрагиваю метод детерминизма.
Детерминизм в играх это когда одно игровое состояние происходит из предыдущего вследствие конкретных изменений (действий/событий) игрока или сервера. Здесь нет места случайности во время применения изменений к состоянию. Применяя одни и те же изменения к одному и тому же состоянию мы получим точное новое состояние.
На практике все усложняется тем, что есть задержка сети. Согласно методу применять изменения игрока к состоянию надо в строгой последовательности. Если есть задержка сети, то изменение одного игрока не может примениться у другого моментально. Эта информация должна передаться по сети - а это время. Поэтому в алгоритме я буду применять свои изменения моментально, а когда придут изменения других игроков - я сделаю несколько шагов назад и пересчитаю заново состояние игры.
В видео я так же подробно рассматриваю простой пример.
ВК
Детерминизм в играх это когда одно игровое состояние происходит из предыдущего вследствие конкретных изменений (действий/событий) игрока или сервера. Здесь нет места случайности во время применения изменений к состоянию. Применяя одни и те же изменения к одному и тому же состоянию мы получим точное новое состояние.
На практике все усложняется тем, что есть задержка сети. Согласно методу применять изменения игрока к состоянию надо в строгой последовательности. Если есть задержка сети, то изменение одного игрока не может примениться у другого моментально. Эта информация должна передаться по сети - а это время. Поэтому в алгоритме я буду применять свои изменения моментально, а когда придут изменения других игроков - я сделаю несколько шагов назад и пересчитаю заново состояние игры.
В видео я так же подробно рассматриваю простой пример.
ВК
Media is too big
VIEW IN TELEGRAM
Сделал прототип синхронизации методом детерминизма. В текущем виде создается сервер и несколько клиентов. Далее каждый клиент шлет только свои изменения серверу. Сервер кладет изменения себе в тайм-лайн. Затем пересылает изменения клиентов друг другу.
Очевидно, что пересылать надо только минимальную информацию. Это достигается подходом "пинг-понг". Отправитель (источник) шлет данные получателю пока не получит подтверждение. Как только получил - останавливается. Причем повторно отсылать можно через таймер. Если нужна быстрая синхронизация (как в мультиплеер играх) то тут таймеры не нужны - нужно максимально быстро доставить информацию. Но если у нас синхронизация файлов в фоновом режиме - то можно добавить таймеры.
Таким образом мы синхронизиурем все тайм-лайны изменений. Каждый клиент применяет эти изменения на опорное (начальное) состояние и получает последнее. Но поток изменений может быть большим и пересчитывать каждый кадр одно и тоже просто не целесообразно. Поэтому есть вопрос - как определить новый опорный кадр? Очевидно, что это можно сделать на сервере, так как у него есть вся информация. Либо сервер будет пересылать эту информацию клиентам.
Подробнее рассказываю в видео.
ВК
Очевидно, что пересылать надо только минимальную информацию. Это достигается подходом "пинг-понг". Отправитель (источник) шлет данные получателю пока не получит подтверждение. Как только получил - останавливается. Причем повторно отсылать можно через таймер. Если нужна быстрая синхронизация (как в мультиплеер играх) то тут таймеры не нужны - нужно максимально быстро доставить информацию. Но если у нас синхронизация файлов в фоновом режиме - то можно добавить таймеры.
Таким образом мы синхронизиурем все тайм-лайны изменений. Каждый клиент применяет эти изменения на опорное (начальное) состояние и получает последнее. Но поток изменений может быть большим и пересчитывать каждый кадр одно и тоже просто не целесообразно. Поэтому есть вопрос - как определить новый опорный кадр? Очевидно, что это можно сделать на сервере, так как у него есть вся информация. Либо сервер будет пересылать эту информацию клиентам.
Подробнее рассказываю в видео.
ВК
Когда много работаешь очень важно регулярно и качественно отдыхать. Еще хорошо когда отдых полностью противоположен основному виду деятельности. Умение расслабляться - очень важно. Я говорю именно про здоровый отдых, а не попить пивка с друзьями на выходных.
Если ты много сидишь на работе? Значит активно отдыхай в движении. Если проводишь много времени за компом и гаджетами? Ограничь или убери все технологии во время отдыха. Если много думаешь? Думай меньше. Собственно это все про меня 😀 и всех программистов.
Сейчас у меня отпуск, и обычно мне требуется пару дней на то, что бы выйти из рабочего потока. Запланировал несколько поездок и других активных мероприятий с семьей.
Важно соблюдать баланс отдыха и работы. Только так можно достичь своей максимальной производительности. Есть еще один плюс хорошего отдыха - когда возвращаешься к работе, можно по новой взглянуть с другой точки зрения на рабочую задачу и решить её более эффективно.
Всем отличных выходных и качественного отдыха!
Если ты много сидишь на работе? Значит активно отдыхай в движении. Если проводишь много времени за компом и гаджетами? Ограничь или убери все технологии во время отдыха. Если много думаешь? Думай меньше. Собственно это все про меня 😀 и всех программистов.
Сейчас у меня отпуск, и обычно мне требуется пару дней на то, что бы выйти из рабочего потока. Запланировал несколько поездок и других активных мероприятий с семьей.
Важно соблюдать баланс отдыха и работы. Только так можно достичь своей максимальной производительности. Есть еще один плюс хорошего отдыха - когда возвращаешься к работе, можно по новой взглянуть с другой точки зрения на рабочую задачу и решить её более эффективно.
Всем отличных выходных и качественного отдыха!
Для большинства людей удалёнка казалась чем то не обычным до пандемии. Сейчас это вроде как обычное дело. Работодатели в IT и не только часто предлагают либо офис либо удалёнку или даже смешанный тип.
Я свою карьеру начал как flash разработчик с местного офиса. Работали тогда на израиль, но фирма распалась и я перешёл на удаленку. И тут все начало смешиваться - практически стёрлась грань работа-отдых. Я стал работать очень много, прерываясь только на поесть и поспать. Вёл сразу параллельно 4 несвязанных проекта на разных технологиях. Мне было в кайф, но тело такой режим не одобрило. Лет через 5 пришло понимание, что так продолжать нельзя. И однажды утром я просто вышел из дома и пошёл. И ходил каждый день по 1-2 часа. Через месяц я уже немного бегал. Через год я достиг своей самой лучшей формы в жизни - бегая каждый день. Так же наладил баланс работа-отдых, снизив количество, но повысив качество и стоимость моего труда. В общем ввел дисциплину. Или как коллега называет - ДНИ - Долго Непрерывно Интенсивно.
Сейчас имея 20 летний стаж работы, из которых 15 лет на удалёнке, дисциплина все еще со мной. Бег сменился на другие активности, но баланс работа-отдых это прямо база.
Я свою карьеру начал как flash разработчик с местного офиса. Работали тогда на израиль, но фирма распалась и я перешёл на удаленку. И тут все начало смешиваться - практически стёрлась грань работа-отдых. Я стал работать очень много, прерываясь только на поесть и поспать. Вёл сразу параллельно 4 несвязанных проекта на разных технологиях. Мне было в кайф, но тело такой режим не одобрило. Лет через 5 пришло понимание, что так продолжать нельзя. И однажды утром я просто вышел из дома и пошёл. И ходил каждый день по 1-2 часа. Через месяц я уже немного бегал. Через год я достиг своей самой лучшей формы в жизни - бегая каждый день. Так же наладил баланс работа-отдых, снизив количество, но повысив качество и стоимость моего труда. В общем ввел дисциплину. Или как коллега называет - ДНИ - Долго Непрерывно Интенсивно.
Сейчас имея 20 летний стаж работы, из которых 15 лет на удалёнке, дисциплина все еще со мной. Бег сменился на другие активности, но баланс работа-отдых это прямо база.
👍2
Время жизни дороже всего. Его невозможно дополнительно купить или забрать. Его невозможно остановить или повернуть вспять. Оно просто непрерывно течёт вперёд. Но что еще более важно - оно ограничено.
Можно впустую потратить свое время на нелюбимую работу, глупых бессовестных людей и прочую всякую ерунду. Прожить бессмысленную жизнь...
А можно бережно провести это время, занимаясь любимым и полезным делом. Стать уважаемым мастером своего дела. Общаться только с другими такими же людьми с совестью. Постоянно изучать что то новое. Наполнить свою жизнь смыслом. Создавать, а не потреблять.
Есть те кто нагло пытается забрать наше время и внимание. Это и богатые IT корпорации агрессивно впаривая свои интернет продукты. Это и банки подсаживают на долговую иглу. Это и всякая разная реклама лезущая отовсюду предлагающая всякую ненужную чепуху. Все хотят нашего внимания. Нашего времени. Нашей жизни.
Я не идеален. Каюсь, я сам иногда отлыниваю и поддаюсь. Это вечная борьба внутри меня. Но каждый день я встаю с мыслью сделать что то полезное и начинаю делать это.
А ты хозяин своего времени?
Можно впустую потратить свое время на нелюбимую работу, глупых бессовестных людей и прочую всякую ерунду. Прожить бессмысленную жизнь...
А можно бережно провести это время, занимаясь любимым и полезным делом. Стать уважаемым мастером своего дела. Общаться только с другими такими же людьми с совестью. Постоянно изучать что то новое. Наполнить свою жизнь смыслом. Создавать, а не потреблять.
Есть те кто нагло пытается забрать наше время и внимание. Это и богатые IT корпорации агрессивно впаривая свои интернет продукты. Это и банки подсаживают на долговую иглу. Это и всякая разная реклама лезущая отовсюду предлагающая всякую ненужную чепуху. Все хотят нашего внимания. Нашего времени. Нашей жизни.
Я не идеален. Каюсь, я сам иногда отлыниваю и поддаюсь. Это вечная борьба внутри меня. Но каждый день я встаю с мыслью сделать что то полезное и начинаю делать это.
А ты хозяин своего времени?
💯2
Media is too big
VIEW IN TELEGRAM
Если кому то показалось, что я пропал 😜 это не так. Я вошел в поток и всю неделю переделывал несколько раз алгоритм синхронизации. Сделал наверно десяток итераций. Пришло осознание как решать проблемы о которых я говорил в предыдущем видео.
В данном видео я показываю синхронизацию одной позиции через ретрансляцию изменений с разных девайсов. Эта позиция - голова червячка 😂 а тело всегда рассчитывается по алгоритму. Так же я показываю как разрешается конфликт - если слать изменения с разных девайсов. В этом случае изменения смешиваются и мы получаем ожидаемый результат.
ВК
В данном видео я показываю синхронизацию одной позиции через ретрансляцию изменений с разных девайсов. Эта позиция - голова червячка 😂 а тело всегда рассчитывается по алгоритму. Так же я показываю как разрешается конфликт - если слать изменения с разных девайсов. В этом случае изменения смешиваются и мы получаем ожидаемый результат.
ВК
С Днем Космонавтики!
Коллеги внезапно сделали сюрприз, в виде новой локации! На видео весело играем вместе 😀😂🤣. Ощущения необычные, так как гравитация на этой локации меньше.
https://t.me/lab_sborki/503
Коллеги внезапно сделали сюрприз, в виде новой локации! На видео весело играем вместе 😀😂🤣. Ощущения необычные, так как гравитация на этой локации меньше.
https://t.me/lab_sborki/503
Telegram
Лаборатория сборки
Терра. 12 апреля 4025 года.
Неожиданно на одной из локаций открылся Варп-разлом.
Мы быстро собрали штурмовой исследовательский отряд.
В него вошли лучшие умы и самые отважные воители.
По ту сторону нас встретил жестокий глюковый шторм.
Часть десантников…
Неожиданно на одной из локаций открылся Варп-разлом.
Мы быстро собрали штурмовой исследовательский отряд.
В него вошли лучшие умы и самые отважные воители.
По ту сторону нас встретил жестокий глюковый шторм.
Часть десантников…
Media is too big
VIEW IN TELEGRAM
Мы с вами так устроены, что погружаясь в любой практический процесс, будь то работа или какой то личный проект, мы начинаем осознавать и понимать более точно и явно теоретические основы этого процесса. Можно прочитать много книг о том как водить автомобиль, но так и не научиться этому. Поэтому практика обычно идет вместе с теорией. Я считаю, что практика первична и имеет более важное значение чем теория, потому что теория рождается из практики. На практике мы можем реально почувствовать на уровне ощущений какие либо закономерности или попробовать несколько вариантов. По другому мы загружаем контекст в голову. Много контекста. И спустя какое то время приходит полное понимание теории. Мозг как будто упорядочивает эту информацию. И тут нужно сделать шаг назад и переосмыслить то, что ты делаешь. Всегда есть места где можно что то поменять и рабочий процесс или ваше дело улучшится.
Собственно со мной это происходит регулярно и произошло и в этот раз. Попробовав много подходов в синхронизации данных мне пришло понимание теории. И в этом видео я рассказываю подробно про виды синхронизации и как они переплетаются между собой.
В предыдущем видео я показывал демо синхронизации
ВК
Собственно со мной это происходит регулярно и произошло и в этот раз. Попробовав много подходов в синхронизации данных мне пришло понимание теории. И в этом видео я рассказываю подробно про виды синхронизации и как они переплетаются между собой.
В предыдущем видео я показывал демо синхронизации
ВК
Довольно часто требуется, что бы какой то процесс шел с фиксированной частотой кадров. Например это почти всегда просчет физики, мультиплеер игры и другие процессы критичные к времени кадра. Так же получилось и в синхронизации которую я сейчас делаю. Мне необходимо просчитывать фиксированные кадры во времени на разных машинах с разной частотой кадров.
Но как известно все девайсы работают на разных частотах (60, 120, 144 и тд). Так же сейчас модно делать плавающую частоту кадров(1-120). Еще довольно часто возможна ситуация когда у нас слабый девайс и он просто не справляется с заданной частотой.
На первой картинке выше можно увидеть наглядно проблему. Есть клиенты с разной частотой кадров (60, 120, плавающей). А фиксированная заданная частота у нас 60. Как же все таки нам синхронизировать частоту обрабатываемых кадров, что бы у всех было все одинаково?
Я сформировал такое решение:
- Заводим числовой таймер в микросекундах
- Каждый реальный кадр прибавляем к нему время прошедшее с предыдущего кадра
- Если это время превышает время фиксированного кадра - увеличиваем фиксированный кадр (или делаем расчеты)
- Повторяем до тех пор пока таймер больше времени фиксированного кадра
- Все расчеты времени ведем в микросекундах (или более точно если есть возможность)
Код с комментариями на второй картинке, а так же продублирую сюда.
Но как известно все девайсы работают на разных частотах (60, 120, 144 и тд). Так же сейчас модно делать плавающую частоту кадров(1-120). Еще довольно часто возможна ситуация когда у нас слабый девайс и он просто не справляется с заданной частотой.
На первой картинке выше можно увидеть наглядно проблему. Есть клиенты с разной частотой кадров (60, 120, плавающей). А фиксированная заданная частота у нас 60. Как же все таки нам синхронизировать частоту обрабатываемых кадров, что бы у всех было все одинаково?
Я сформировал такое решение:
- Заводим числовой таймер в микросекундах
- Каждый реальный кадр прибавляем к нему время прошедшее с предыдущего кадра
- Если это время превышает время фиксированного кадра - увеличиваем фиксированный кадр (или делаем расчеты)
- Повторяем до тех пор пока таймер больше времени фиксированного кадра
- Все расчеты времени ведем в микросекундах (или более точно если есть возможность)
Код с комментариями на второй картинке, а так же продублирую сюда.
/**
* frame - текущий кадр
* timer - таймер (в микросекундах)
* frame_time - фиксированное время кадра (в микросекундах)
* delta - дельта - сколько времени прошло между реальными кадрами (в микросекундах)
*/
pub fn next_frame(frame: &mut u32, timer: &mut u32, frame_time: u32, delta: u32) {
// увеличиваем таймер на прошедшее время
*timer += delta;
// далее в цикле проверяем не превысил ли наш таймер фиксированный кадр
// так как ситуация непредсказуема и дельта может быть большой
// за один реальный кадр может пройти несколько фиксированных кадров
while *timer > frame_time {
// если превысили то вычитаем его однократно
*timer -= frame_time;
// увеличиваем текущий кадр
*frame += 1;
// здесь можно вести расчет логики
// но можно делать это в любом другом месте
// учитывая сколько кадров прошло (frame)
}
}
Немного про софтскилы.
Если вам кто то говорит:
- Не хочу тебя обидеть
Значит он будет вас прямо сейчас обижать.
Аналогично с фразами:
- Никого не обвиняю, но
- Дело не в тебе
- Ничего личного
- Никто не виноват, вы не подумайте
- Вот тут написано плохо, давайте так не делать
- Вот это плохой ненадежный код
И тд.
Говорить кому то, что он сделал ошибку, пропустил что то, всегда тяжело для обоих сторон. Можно либо сильно обидеть человека, либо даже получить серьезный отпор, или начать спорить до потери пульса. А ошибки то мы все совершаем, всегда. Это неизбежно.
Я прошел довольно большой путь и всякое было. Признаюсь, по молодости, во многих случаях я был не прав. Потом у меня появился наставник Владимир. И мы с ним проработали много лет. Он меня научил, что если работаешь вместе над чем то, и есть какая то цель. То цель превыше всего. Главное достичь этой цели в вашем деле. Все остальное вторично. И когда вы держите цель в голове, все работают на одной волне. Все гребут в одной лодке и в одну сторону.
Вместо фраз в начале этого поста можно же сказать так:
- Слушай я изучил вот это и увидел проблему, давай вместе посмотрим?
- Смотри я вот тут вижу место где можно улучшить, ты пробовал так?
- Смотри я нашел баг, давай вместе чинить!
Собственно тут мы говорим о предмете работы. Всегда держа в голове общую цель.
Всем благ!
Если вам кто то говорит:
- Не хочу тебя обидеть
Значит он будет вас прямо сейчас обижать.
Аналогично с фразами:
- Никого не обвиняю, но
- Дело не в тебе
- Ничего личного
- Никто не виноват, вы не подумайте
- Вот тут написано плохо, давайте так не делать
- Вот это плохой ненадежный код
И тд.
Говорить кому то, что он сделал ошибку, пропустил что то, всегда тяжело для обоих сторон. Можно либо сильно обидеть человека, либо даже получить серьезный отпор, или начать спорить до потери пульса. А ошибки то мы все совершаем, всегда. Это неизбежно.
Я прошел довольно большой путь и всякое было. Признаюсь, по молодости, во многих случаях я был не прав. Потом у меня появился наставник Владимир. И мы с ним проработали много лет. Он меня научил, что если работаешь вместе над чем то, и есть какая то цель. То цель превыше всего. Главное достичь этой цели в вашем деле. Все остальное вторично. И когда вы держите цель в голове, все работают на одной волне. Все гребут в одной лодке и в одну сторону.
Вместо фраз в начале этого поста можно же сказать так:
- Слушай я изучил вот это и увидел проблему, давай вместе посмотрим?
- Смотри я вот тут вижу место где можно улучшить, ты пробовал так?
- Смотри я нашел баг, давай вместе чинить!
Собственно тут мы говорим о предмете работы. Всегда держа в голове общую цель.
Всем благ!
Forwarded from Лаборатория сборки (Сергей Антонов)
Media is too big
VIEW IN TELEGRAM
Всем привет! Продолжаю делать синхронизацию на базе детерминизма. Про это я подробно рассказывал здесь. В данном видео я показываю синхронизацию более сложной стркутуры данных. Она описывает два экрана, между которыми можно переключаться. На первом экране у нас небольшая физическая симуляция и обработка столкновений. На втором экране можно редактировать текст одновременно. Данный подход синхронизации организует строго последовательный поток событий или как я называю изменений от пользователей. Этот поток синхронизируется между всеми узлами, тем самым позволяя нам расчитать точную сцену в любой момент. Кроме того в данном подходе свои изменения применяются сразу, тем самым пользователь никогда не увидит лага от своих действий. Синхронизацию текста я сделал на базе строки и позиций курсоров, которые взял из уже готового нашего контрола. Я вычисляю дифф текста и преобразую его в одну из операций - удаление или вставка. Так же есть операция перемещения курсора. Эти операции применяются последовательно на каждом клиенте. И дают идентичный результат. Более подробно в видео.
🔥2