Media is too big
VIEW IN TELEGRAM
Почему метро в первом акте The Last of Us — один из самых напряжённых уровней?
Ты уже освоился. Был экшен, стрельба, бег. А потом — тишина. Вы спускаетесь в метро, и напряжение становится почти физическим.
Но почему оно так работает?
🎧 Звук — главный инструмент страха.
Щелкуны ориентируются по слуху, и именно звук становится игровой механикой. Треск в темноте — не просто атмосферная штука и способ ориентации щелкунов, а сигнал: ты на чужой территории.
Ты сам должен стать тише. Ты замолкаешь вместе с игрой.
🌑 Теснота как ограничение информации.
Ты почти ничего не видишь. Уровень не даёт тебе чёткого дальнего визуального контроля, только куски — комната, тоннель, лестница.
Это заставляет полагаться на слух и интуицию, а не на зрение — и делает ситуацию куда менее предсказуемой.
🎮 Игровой риск — оружие есть, но использовать его страшно.
У тебя есть патроны. Теоретически, ты можешь отбиться. Но выстрел привлечёт других.
Так игра вводит социальную цену за силу: применить силу — значит, навлечь ещё большую опасность, с которой ты наверняка уже не сможешь справиться.
В этот раз прикрепил вам не кинематографическую пробежку игры, а свой же геймплей с этого уровня, дорожку с микрофоном пришлось отключить, слишком уж меня напугал этот уровень :D
Ты уже освоился. Был экшен, стрельба, бег. А потом — тишина. Вы спускаетесь в метро, и напряжение становится почти физическим.
Но почему оно так работает?
🎧 Звук — главный инструмент страха.
Щелкуны ориентируются по слуху, и именно звук становится игровой механикой. Треск в темноте — не просто атмосферная штука и способ ориентации щелкунов, а сигнал: ты на чужой территории.
Ты сам должен стать тише. Ты замолкаешь вместе с игрой.
🌑 Теснота как ограничение информации.
Ты почти ничего не видишь. Уровень не даёт тебе чёткого дальнего визуального контроля, только куски — комната, тоннель, лестница.
Это заставляет полагаться на слух и интуицию, а не на зрение — и делает ситуацию куда менее предсказуемой.
🎮 Игровой риск — оружие есть, но использовать его страшно.
У тебя есть патроны. Теоретически, ты можешь отбиться. Но выстрел привлечёт других.
Так игра вводит социальную цену за силу: применить силу — значит, навлечь ещё большую опасность, с которой ты наверняка уже не сможешь справиться.
В этот раз прикрепил вам не кинематографическую пробежку игры, а свой же геймплей с этого уровня, дорожку с микрофоном пришлось отключить, слишком уж меня напугал этот уровень :D
Это не совсем рубрика "что посмотреть во время миграции", скорее моя рекомендация :D
Gakuen Babysitters начинается с трагедии — герой теряет родителей и оказывается не просто старшим братом, а фактически опекуном. Вместе с этим на него ложится забота о других детях в детском саду. Но это не драма, а тёплая история о том, как ребёнок заботится о ребёнке. О том, как любовь, даже неуверенная и уставшая, может держать мир.
Если вы были старшим братом или сестрой с большой разницей в возрасте — вы узнаете себя почти в каждом эпизоде. И это узнавание не всегда лёгкое. Это не аниме про сложности взросления — это про тихие радости и выматывающие мелочи, которые почему-то никто не объяснил тебе заранее.
Какое-то лето брат боится моря, в другое — его не вытащить из воды (и никогда не понятно откуда эта зависимость). Один год ты с ним, пока его рвёт, а через два — он уже бежит к тебе в слезах, потому что упал. И каждый раз ты держишься, потому что ты старший. Потому что для него ты — точка устойчивости.
Я сам - старший брат с разницей в 11 лет, пока смотрел это аниме, постоянно ловил себя на чувстве - а ведь реально так было... В целом, если вам предстоит стать старшим, то очень советую посмотреть, это аниме не даст вам полного представления, каково быть старшим. Но оно передаёт главное — ритм любви, усталости, заботы и бессловесной привязанности. Той, от которой иногда хочется выть, но которую не променяешь ни на что.
Gakuen Babysitters начинается с трагедии — герой теряет родителей и оказывается не просто старшим братом, а фактически опекуном. Вместе с этим на него ложится забота о других детях в детском саду. Но это не драма, а тёплая история о том, как ребёнок заботится о ребёнке. О том, как любовь, даже неуверенная и уставшая, может держать мир.
Если вы были старшим братом или сестрой с большой разницей в возрасте — вы узнаете себя почти в каждом эпизоде. И это узнавание не всегда лёгкое. Это не аниме про сложности взросления — это про тихие радости и выматывающие мелочи, которые почему-то никто не объяснил тебе заранее.
Какое-то лето брат боится моря, в другое — его не вытащить из воды (и никогда не понятно откуда эта зависимость). Один год ты с ним, пока его рвёт, а через два — он уже бежит к тебе в слезах, потому что упал. И каждый раз ты держишься, потому что ты старший. Потому что для него ты — точка устойчивости.
Я сам - старший брат с разницей в 11 лет, пока смотрел это аниме, постоянно ловил себя на чувстве - а ведь реально так было... В целом, если вам предстоит стать старшим, то очень советую посмотреть, это аниме не даст вам полного представления, каково быть старшим. Но оно передаёт главное — ритм любви, усталости, заботы и бессловесной привязанности. Той, от которой иногда хочется выть, но которую не променяешь ни на что.
Как многие замечают, я делаю много разных вещей почти одновременно. Работаю в ST, поддерживаю и развиваю Имперского стражника, делаю для вас и не только контент, поддерживаю других ботов... Но как я умудряюсь всё это делать?
В целом — это развившийся у меня навык, который можно сравнить с тем, что умеют тимлиды (меня, кстати, даже недавно приглашали на роль тимлида в одну компанию, но я отказался) D:
А чтобы вы могли взрастить в себе такие навыки, нашёл для вас интересный канал, автор которого пишет реально дельные вещи. К примеру: способы успевать больше — у меня, кстати, если обобщать, те же самые.
Или, к примеру, польза медитации — знаете, как приятно запустить в приложении шум леса со спокойной музыкой, закрыть глаза и немного подышать.
А если вы не такой трудоголик, как я, то и для вас есть очень важные слова — к примеру, о важности финансовой подушки.
В целом, ребят, мне очень самому понравился автор и контент канала, так что рекомендую и вам подписаться на Тимлида на удалёнке :3
Реклама. Нечаев А.А. ИНН 343605128044.
В целом — это развившийся у меня навык, который можно сравнить с тем, что умеют тимлиды (меня, кстати, даже недавно приглашали на роль тимлида в одну компанию, но я отказался) D:
А чтобы вы могли взрастить в себе такие навыки, нашёл для вас интересный канал, автор которого пишет реально дельные вещи. К примеру: способы успевать больше — у меня, кстати, если обобщать, те же самые.
Или, к примеру, польза медитации — знаете, как приятно запустить в приложении шум леса со спокойной музыкой, закрыть глаза и немного подышать.
А если вы не такой трудоголик, как я, то и для вас есть очень важные слова — к примеру, о важности финансовой подушки.
В целом, ребят, мне очень самому понравился автор и контент канала, так что рекомендую и вам подписаться на Тимлида на удалёнке :3
Реклама. Нечаев А.А. ИНН 343605128044.
Media is too big
VIEW IN TELEGRAM
Когда мы встречаем Билла, мы видим не просто одиночку. Мы видим человека, который довёл до предела философию: "никому не доверяй, ни к кому не привязывайся".
Психологическая изоляция — это не просто отсутствие общения.
Это разрыв с возможностью получать поддержку и социализацию от другого человека.
Билл окружён стенами и ловушками. Но настоящая его тюрьма — внутри.
Он живёт в замкнутом цикле страха и недоверия. Он разговаривает сам с собой, не потому что один — а потому что давно разучился быть с кем-то.
Когда мы находим тело его единственного близкого человека, становится ясно:
Изоляция не спасает. Она медленно убивает.
Билл — это не просто персонаж. Это образ того, кем стал бы Джоэл без Элли.
И важный ответ игры:
В мире, где всё рухнуло, тебя спасут не стены и оружие. Тебя спасёт только связь с другим.
Психологическая изоляция — это не просто отсутствие общения.
Это разрыв с возможностью получать поддержку и социализацию от другого человека.
Билл окружён стенами и ловушками. Но настоящая его тюрьма — внутри.
Он живёт в замкнутом цикле страха и недоверия. Он разговаривает сам с собой, не потому что один — а потому что давно разучился быть с кем-то.
Когда мы находим тело его единственного близкого человека, становится ясно:
Изоляция не спасает. Она медленно убивает.
Билл — это не просто персонаж. Это образ того, кем стал бы Джоэл без Элли.
И важный ответ игры:
В мире, где всё рухнуло, тебя спасут не стены и оружие. Тебя спасёт только связь с другим.
The Last of Us отказывается от мистики: никакой радиации, проклятий или зомби-вирусов.
В центре — реальный паразит, известный науке: Ophiocordyceps unilateralis, гриб, способный управлять муравьями.
Игра делает всего один допуск: этот гриб мутировал и стал поражать людей.
Но всё остальное — построено с пугающей правдоподобностью.
🍞 Вспышка по всей стране из-за заражения пищи.
🔬 Заражение через споры и укусы.
🧠 Поражение мозга — как у бешенства.
🦠 Рост мицелия внутри тканей — как при грибковых инфекциях.
👣 Поведение заражённых — меняется по стадиям, как при заражения паразитами.
Каждая стадия — логична:
Бегуны: паразит контролирует двигательную систему, ещё сохранились рефлексы, паника.
Сталкеры: паразит начинает работать с нервной системой, агрессия и скрытность.
Щелкуны: паразит почти полностью овладевает телом, слепота, с ориентацией по эхолокации.
Топляки: тело больше не функционирует — но гриб жив.
Кордицепс не пугает потому, что он фантастичен.
Он пугает, потому что слишком возможен.
Ты смотришь на заражённого — и понимаешь: это не чудовище. Это просто тело, которым уже управляет не твой мозг.
В центре — реальный паразит, известный науке: Ophiocordyceps unilateralis, гриб, способный управлять муравьями.
Игра делает всего один допуск: этот гриб мутировал и стал поражать людей.
Но всё остальное — построено с пугающей правдоподобностью.
🍞 Вспышка по всей стране из-за заражения пищи.
🔬 Заражение через споры и укусы.
🧠 Поражение мозга — как у бешенства.
🦠 Рост мицелия внутри тканей — как при грибковых инфекциях.
👣 Поведение заражённых — меняется по стадиям, как при заражения паразитами.
Каждая стадия — логична:
Бегуны: паразит контролирует двигательную систему, ещё сохранились рефлексы, паника.
Сталкеры: паразит начинает работать с нервной системой, агрессия и скрытность.
Щелкуны: паразит почти полностью овладевает телом, слепота, с ориентацией по эхолокации.
Топляки: тело больше не функционирует — но гриб жив.
Кордицепс не пугает потому, что он фантастичен.
Он пугает, потому что слишком возможен.
Ты смотришь на заражённого — и понимаешь: это не чудовище. Это просто тело, которым уже управляет не твой мозг.
Сегодня с утра в Москве наблюдались масштабные перебои мобильной связи.
Сначала — сообщения от доверенного источника о DDoS-атаке на одного из крупных операторов, с происхождением вне РФ. А затем — почти полное исчезновение мобильного интернета с 11:00 до 12:00.
Я оказался в эпицентре. Что происходило технически:
- Пинг до dns.google — был, но с задержками до 2000 мс и потерей 30% пакетов.
- Traceroute обрывался на уровне базовой станции оператора.
- HTTPS/HTTP-соединения «умирали» на стадии TLS handshake.
- Кабельный интернет оставался рабочим.
- MTR фиксировал полный обрыв после внутренних маршрутов оператора.
- ping ya.ru — 100% потерь.
В 12:00 связь внезапно вернулась.
Что это было?
Скорее всего, из-за мероприятий ко Дню Победы и массовых скоплений людей (особенно у площадок проведения репетиций и парадов), операторам дали команду ограничить исходящий трафик. DDoS-атака могла стать катализатором или просто совпала по времени.
DNS-запросы к 8.8.8.8 были исключением — возможно, по технической необходимости или косяку.
И судя по сообщениям, ограничения могут продлиться до 9–10 мая.
Что делать если вы оказались в зоне отключений? Несколько советов:
0️⃣ Не паникуйте. Это временно, паника ещё никому не помогала, а вот навредить успела.
1️⃣ Осторожнее с арендой транспорта: электросамокаты, велосипеды и каршеринг могут зависнуть — вы можете подключиться к WiFi, а транспорт — нет.
2️⃣ Оффлайн-карты: если планируете поездки — скачайте GuruMaps или аналог, загрузите карту Москвы и нужных районов.
3️⃣ Наличные: часть терминалов оплаты работает по мобильной сети. При отключении связи оплата не пройдёт, так что лучше иметь запас наличных на экстренные расходы.
К сожалению, длительности сбоя не хватило чтобы я протестировал все гипотезы и методы которые могли бы помочь выйти на связь в таких условиях, но если шатдаун повторится, я обязательно протестирую и напишу тут что и как. И главное, будьте в безопасности и не теряйтесь.🦊
Сначала — сообщения от доверенного источника о DDoS-атаке на одного из крупных операторов, с происхождением вне РФ. А затем — почти полное исчезновение мобильного интернета с 11:00 до 12:00.
Я оказался в эпицентре. Что происходило технически:
- Пинг до dns.google — был, но с задержками до 2000 мс и потерей 30% пакетов.
- Traceroute обрывался на уровне базовой станции оператора.
- HTTPS/HTTP-соединения «умирали» на стадии TLS handshake.
- Кабельный интернет оставался рабочим.
- MTR фиксировал полный обрыв после внутренних маршрутов оператора.
- ping ya.ru — 100% потерь.
В 12:00 связь внезапно вернулась.
Что это было?
Скорее всего, из-за мероприятий ко Дню Победы и массовых скоплений людей (особенно у площадок проведения репетиций и парадов), операторам дали команду ограничить исходящий трафик. DDoS-атака могла стать катализатором или просто совпала по времени.
DNS-запросы к 8.8.8.8 были исключением — возможно, по технической необходимости или косяку.
И судя по сообщениям, ограничения могут продлиться до 9–10 мая.
Что делать если вы оказались в зоне отключений? Несколько советов:
0️⃣ Не паникуйте. Это временно, паника ещё никому не помогала, а вот навредить успела.
1️⃣ Осторожнее с арендой транспорта: электросамокаты, велосипеды и каршеринг могут зависнуть — вы можете подключиться к WiFi, а транспорт — нет.
2️⃣ Оффлайн-карты: если планируете поездки — скачайте GuruMaps или аналог, загрузите карту Москвы и нужных районов.
3️⃣ Наличные: часть терминалов оплаты работает по мобильной сети. При отключении связи оплата не пройдёт, так что лучше иметь запас наличных на экстренные расходы.
К сожалению, длительности сбоя не хватило чтобы я протестировал все гипотезы и методы которые могли бы помочь выйти на связь в таких условиях, но если шатдаун повторится, я обязательно протестирую и напишу тут что и как. И главное, будьте в безопасности и не теряйтесь.
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Подвал отеля — один из пугающих эпизодов в игре. Но по-настоящему важный момент происходит уже после, в вестибюле.
Джоэла внезапно атакует мародёр. Он тонет. Безоружный.
И его спасает Элли. Девочка стреляет в голову нападавшему.
Она не просто выживает — убивает, чтобы спасти.
Это не просто красивая экшен катсцена. Это психологический рубеж:
🎯 Для Элли — первое убийство человека, первый акт насилия, приведший к смерти ради другого.
🧱 Для Джоэла — первый пробой его эмоциональной стены.
До этого Элли была "девочкой, которую нужно тащить".
После — она становится партнёром.
Игра меняется:
Джоэл отдаёт ей винтовку — не просто оружие, а доверие.
Позже — пистолет: "на крайний случай".
В геймплее Элли чаще не стоит в стороне: а помогает в бою, отвлекает, спасает.
Это сцена, где встречаются взросление и принятие, нарратив и механика.
Naughty Dog показывает: настоящее сближение не в словах, а в действиях.
Джоэла внезапно атакует мародёр. Он тонет. Безоружный.
И его спасает Элли. Девочка стреляет в голову нападавшему.
Она не просто выживает — убивает, чтобы спасти.
Это не просто красивая экшен катсцена. Это психологический рубеж:
🎯 Для Элли — первое убийство человека, первый акт насилия, приведший к смерти ради другого.
🧱 Для Джоэла — первый пробой его эмоциональной стены.
До этого Элли была "девочкой, которую нужно тащить".
После — она становится партнёром.
Игра меняется:
Джоэл отдаёт ей винтовку — не просто оружие, а доверие.
Позже — пистолет: "на крайний случай".
В геймплее Элли чаще не стоит в стороне: а помогает в бою, отвлекает, спасает.
Это сцена, где встречаются взросление и принятие, нарратив и механика.
Naughty Dog показывает: настоящее сближение не в словах, а в действиях.
А вы знали, что долгое время во время разработки Элли вообще не должна была участвовать в боях?
Она оставалась в тени как неигровой персонаж, даже Эшли (актриса, сыгравшая Элли) была разочарованна этому. И с процессом разработки это стало расхождением геймплея и историю, которую хотели рассказать.
Тогда Нил Дакман решил что Элли должна быть таким же соучастником как Джоэл.
Когда Naughty Dog впервые ввели Элли в геймплей, всё выглядело логично.
Она была ребёнком рядом с Джоэлом, значит, должна была:
повторять действия игрока
получать ранения
просить лечиться
мешать в перестрелке — иначе не реалистично
Но на практике это стало кошмаром: Элли раздражала. Мешала. Была грузом.
Игрок ненавидел её, несмотря на то что сюжет говорил обратное.
Разработчики стояли перед дилеммой:
реализм — или привязанность?
И приняли нестандартное решение:
Элли стала «призраком».
Она незаметна для врагов. Не мешает. Почти бессмертна.
С точки зрения геймдизайна это — компромисс.
С точки зрения психологии — гениальный ход:
Игрок перестаёт злиться, а значит может эмоционально привязаться.
И тогда, в нужный момент, доверит ей жизнь — и винтовку.
Так была создана легендарная снайперская сцена, где Элли становится настоящим напарником.
Никто не раздражён. Все — вовлечены.
Идеальный союз механики и драмы.
Она оставалась в тени как неигровой персонаж, даже Эшли (актриса, сыгравшая Элли) была разочарованна этому. И с процессом разработки это стало расхождением геймплея и историю, которую хотели рассказать.
Тогда Нил Дакман решил что Элли должна быть таким же соучастником как Джоэл.
Когда Naughty Dog впервые ввели Элли в геймплей, всё выглядело логично.
Она была ребёнком рядом с Джоэлом, значит, должна была:
повторять действия игрока
получать ранения
просить лечиться
мешать в перестрелке — иначе не реалистично
Но на практике это стало кошмаром: Элли раздражала. Мешала. Была грузом.
Игрок ненавидел её, несмотря на то что сюжет говорил обратное.
Разработчики стояли перед дилеммой:
реализм — или привязанность?
И приняли нестандартное решение:
Элли стала «призраком».
Она незаметна для врагов. Не мешает. Почти бессмертна.
С точки зрения геймдизайна это — компромисс.
С точки зрения психологии — гениальный ход:
Игрок перестаёт злиться, а значит может эмоционально привязаться.
И тогда, в нужный момент, доверит ей жизнь — и винтовку.
Так была создана легендарная снайперская сцена, где Элли становится настоящим напарником.
Никто не раздражён. Все — вовлечены.
Идеальный союз механики и драмы.
Порой меня спрашивают, какие баги в разработке максимально бывают мемные и глупые. Именно с таким багом я столкнулся и решил вам рассказать.
Для того чтобы отвечать вам за 30 миллисекунд, Имперский стражник кеширует некоторые данные в своей памяти, среди таких: базовые данные о пользователях и настройки чатов. И вот именно с кешированием чатов началась проблема. В последние пару дней вы могли заметить что после того как поменяли настройку чата, она применялась далеко не сразу.
Я начал искать почему это происходит. Для этого надо окунуться в логику настроек:
Вроде всё верно... А что в базе?
И тут всё верно, в базе обновляется значение, после чего удаляется из кеша.
Я провёл эксперимент, обновил параметр и посмотрел в базу, значение новое и верное.
Убедившись в том что эта часть кода верна, я решил проверить генерацию сообщений настроек, вдруг там была ошибка, но нет, и там всё было верно, на этот момент баг был в процессе поиска уже второй день.
Я решил изучить кэши, обновил параметр, запросил чат из кэша и... А чат не обновился в кэше других инстансов.
Тут надо пояснить что за инстансы такие. Пока вы видите одного цельного Стражника, на самом деле он состоит из различных сервисов которые занимаются разными задачами, некоторые обрабатывают входящие события, некоторые отвечают для вас в вебаппах, некоторые проверяют стикеры. Так вот, тот сервис который обработал изменение настроек обновил чат у себя в кэше, но другие сервисы этого оркестра обновление не получили...
А кто в Стражнике отвечает за кэш? Правильно, я, вернее мой модуль rgcache. Давайте изучать проблему...
В библиотеке на текущий момент есть 3 вида кэша.
И их комбинация
Для хранения чатов как раз использовался
Давайте посмотрим как он удаляет значения (для вас расписал построчно комментарии):
Хорошо, а как идёт инвалидация?
Вроде всё правильно, ошибок нет... А ПОТОМ СПУСТЯ 5 МИНУТ ПОДУМАТЬ Я ОСОЗНАЛ.
В качестве ключа чата я использую id чата, это отрицательное 64-битное число, число, ЧИСЛО. Так что происходило? Число становилось строкой! Ведь Redis при передаче данных через себя всё кастит в строку. И получалось что другие инстансы получали запрос на удаление строки... храня только числа. Вот так один тайпкаст в библиотеке заставил меня 2 дня перекапывать исходники стражника.
А увидеть код библиотеки и фикс вы можете даже сами, вот так, раз ошибся и ты ошибся.
https://github.com/RedGuys/rgcache/commit/ef610d4e6436a6b492e49b2c61a2cd8222ab2885
Для того чтобы отвечать вам за 30 миллисекунд, Имперский стражник кеширует некоторые данные в своей памяти, среди таких: базовые данные о пользователях и настройки чатов. И вот именно с кешированием чатов началась проблема. В последние пару дней вы могли заметить что после того как поменяли настройку чата, она применялась далеко не сразу.
Я начал искать почему это происходит. Для этого надо окунуться в логику настроек:
/**
* Обновляет значение параметра
*/
async updateSetting(ctx, param, value) {
const chat = await Database.instance.getChat(ctx.scene.state.chat);
const transformedValue = param.transform(value);
await Database.instance.updateChat(ctx.scene.state.chat, {
[param.id]: transformedValue
});
await this.saveAudit(ctx, param.id, transformedValue);
}
Вроде всё верно... А что в базе?
async updateChat(chat, data) {
const client = await this._pool.connect();
/** логика SQL запроса */
client.release();
await this._chatsCache.delete(chat);
}
И тут всё верно, в базе обновляется значение, после чего удаляется из кеша.
Я провёл эксперимент, обновил параметр и посмотрел в базу, значение новое и верное.
Убедившись в том что эта часть кода верна, я решил проверить генерацию сообщений настроек, вдруг там была ошибка, но нет, и там всё было верно, на этот момент баг был в процессе поиска уже второй день.
Я решил изучить кэши, обновил параметр, запросил чат из кэша и... А чат не обновился в кэше других инстансов.
Тут надо пояснить что за инстансы такие. Пока вы видите одного цельного Стражника, на самом деле он состоит из различных сервисов которые занимаются разными задачами, некоторые обрабатывают входящие события, некоторые отвечают для вас в вебаппах, некоторые проверяют стикеры. Так вот, тот сервис который обработал изменение настроек обновил чат у себя в кэше, но другие сервисы этого оркестра обновление не получили...
А кто в Стражнике отвечает за кэш? Правильно, я, вернее мой модуль rgcache. Давайте изучать проблему...
В библиотеке на текущий момент есть 3 вида кэша.
MemoryCache
- хранит данные в оперативной памяти, работает полностью локально.RedisCache
- хранит данные в Redis, локально ничего не хранит и при каждом запросе делает запрос в Redis.И их комбинация
RedisSyncedMemoryCache
- хранит данные в оперативной памяти, но если идёт инвалидация значения (оно обновилось), то через Redis посылает всем другим рабочим кешам задачу удалить у себя это значение.Для хранения чатов как раз использовался
RedisSyncedMemoryCache
Давайте посмотрим как он удаляет значения (для вас расписал построчно комментарии):
async delete(key) {
let entry = this._data.get(key); // Ищем значение локально
if (entry) { // Если значение найдено, то...
await this._options.preDestroy(key, entry.value); // Вызываем хук на удаление значения
this._data.delete(key); // Удаляем его
}
await this._pub.publish(this._name + ":invalidate", key); // Отправляет через Redis команду для всех остальных кешей инвалидировать это значение.
}
Хорошо, а как идёт инвалидация?
async _handleInvalidation(key) {
let entry = this._data.get(key); // Ищем значение локально
if (entry) { // Если значение найдено, то...
await this._options.preDestroy(key, entry.value); // Вызываем хук на удаление значения
this._data.delete(key); // Удаляем его
}
}
Вроде всё правильно, ошибок нет... А ПОТОМ СПУСТЯ 5 МИНУТ ПОДУМАТЬ Я ОСОЗНАЛ.
В качестве ключа чата я использую id чата, это отрицательное 64-битное число, число, ЧИСЛО. Так что происходило? Число становилось строкой! Ведь Redis при передаче данных через себя всё кастит в строку. И получалось что другие инстансы получали запрос на удаление строки... храня только числа. Вот так один тайпкаст в библиотеке заставил меня 2 дня перекапывать исходники стражника.
А увидеть код библиотеки и фикс вы можете даже сами, вот так, раз ошибся и ты ошибся.
https://github.com/RedGuys/rgcache/commit/ef610d4e6436a6b492e49b2c61a2cd8222ab2885
Визуальный стиль тлоу не просто красивый, но и инженерно продуманный, с кучей решений, которые незаметно управляют вашим вниманием и эмоциями.
☀️ Освещение: свет, который ведёт
Игровые сцены кажутся живыми благодаря технологии глобального освещения (Global Illumination). Это когда свет не просто падает с лампочки или солнца, а отражается от всех поверхностей — стен, пола, мебели — и мягко подсвечивает всё вокруг.
Чтобы сделать это реалистично и при этом не перегрузить консоль, разработчики применили:
Запечённый свет (Baked GI) — заранее рассчитанный и "записанный" свет в статичных частях уровня (например, в стенах). Работает как фоновое освещение.
Light Probes — специальные «точки в воздухе», которые хранят информацию о том, как свет должен выглядеть в этом месте. Персонажи как бы «ощущают» освещение, находясь рядом с этими точками.
Динамическое освещение — например, от фонарика. Этот свет рассчитывается прямо во время игры, он может двигаться, давать тени и взаимодействовать с окружением.
📷 Эффекты камеры, которые мы обычно не замечаем, тоже работают на эмоциональное восприятие:
Размытие движения (Motion Blur): сглаживает рывки, делает движение более плавным.
Глубина резкости (Depth of Field): фокус на главном, фон — в мягком размытии, как в кино. Помогает выделить важное.
Небольшие искажения цвета в катсценах добавляют ощущение реалистичности, будто это снято на старую камеру.
🧱 Материалы в игре ведут себя как настоящие:
Металл блестит по-разному под углами.
Кирпич выглядит шершавым, даже если это просто плоская стена — за счёт специальных «карт» текстуры, которые симулируют объём.
Сейчас многое из этого встроено в движки по типу Unreal Engine, наши 4070 могут легко обработать это всё, но в то время, с теми мощностями это была большая работа, которая выполнялась с совестью
☀️ Освещение: свет, который ведёт
Игровые сцены кажутся живыми благодаря технологии глобального освещения (Global Illumination). Это когда свет не просто падает с лампочки или солнца, а отражается от всех поверхностей — стен, пола, мебели — и мягко подсвечивает всё вокруг.
Чтобы сделать это реалистично и при этом не перегрузить консоль, разработчики применили:
Запечённый свет (Baked GI) — заранее рассчитанный и "записанный" свет в статичных частях уровня (например, в стенах). Работает как фоновое освещение.
Light Probes — специальные «точки в воздухе», которые хранят информацию о том, как свет должен выглядеть в этом месте. Персонажи как бы «ощущают» освещение, находясь рядом с этими точками.
Динамическое освещение — например, от фонарика. Этот свет рассчитывается прямо во время игры, он может двигаться, давать тени и взаимодействовать с окружением.
📷 Эффекты камеры, которые мы обычно не замечаем, тоже работают на эмоциональное восприятие:
Размытие движения (Motion Blur): сглаживает рывки, делает движение более плавным.
Глубина резкости (Depth of Field): фокус на главном, фон — в мягком размытии, как в кино. Помогает выделить важное.
Небольшие искажения цвета в катсценах добавляют ощущение реалистичности, будто это снято на старую камеру.
🧱 Материалы в игре ведут себя как настоящие:
Металл блестит по-разному под углами.
Кирпич выглядит шершавым, даже если это просто плоская стена — за счёт специальных «карт» текстуры, которые симулируют объём.
Сейчас многое из этого встроено в движки по типу Unreal Engine, наши 4070 могут легко обработать это всё, но в то время, с теми мощностями это была большая работа, которая выполнялась с совестью
Если бы The Last of Us была не игрой, а выставкой, я бы ходил по ней зал за залом, как по музею дизайна.
В каждом доме — свой характер. В каждой комнате — детали, которые хочется рассматривать.
Не просто «постапокалипсис», а мир, в котором раньше кто-то жил — и жил интересно.
Детские с обоями, книгами, коллекциями игрушек.
Гостинные с фотографиями, каминами, плакатами рок-групп.
Кухни с разбросанными рецептами, банками, неразобранной посудой.
И все они не повторяются. Каждая квартира, каждый дом — уникальны.
Один — богемный и тёплый, другой — строго организованный, третий — старомодный, с вязаными скатертями и радиоприёмником.
Ты словно гуляешь по реальному городу, заглядывая в чужие жизни.
Интерьеры здесь — не фон, а законченное высказывание. Их можно исследовать часами — и каждый раз находить новое.
Вот к примеру квартира многодетной семьи из Питсбурга, у них 3-е детей. Двое детсадовского возраста и один младенец.
В каждом доме — свой характер. В каждой комнате — детали, которые хочется рассматривать.
Не просто «постапокалипсис», а мир, в котором раньше кто-то жил — и жил интересно.
Детские с обоями, книгами, коллекциями игрушек.
Гостинные с фотографиями, каминами, плакатами рок-групп.
Кухни с разбросанными рецептами, банками, неразобранной посудой.
И все они не повторяются. Каждая квартира, каждый дом — уникальны.
Один — богемный и тёплый, другой — строго организованный, третий — старомодный, с вязаными скатертями и радиоприёмником.
Ты словно гуляешь по реальному городу, заглядывая в чужие жизни.
Интерьеры здесь — не фон, а законченное высказывание. Их можно исследовать часами — и каждый раз находить новое.
Вот к примеру квартира многодетной семьи из Питсбурга, у них 3-е детей. Двое детсадовского возраста и один младенец.