У меня есть небольшой проект на гите с коллекцией шейдров, которые добавляю по мере личной необходимости. В целом все базовые, применимые и простые. В какой-то момент обнаружил, что не только мне они пригождаются. Так вот — недавно добавил стекло.
https://github.com/KotikovD/ShadersCollection
https://github.com/KotikovD/ShadersCollection
🔥11🐳3😍1
😁15
Выше был пост про то, “Что такое .Net”? И в комментариях прозвучало замечание, что может быть и не важно, если программист этого не знает, что это не мешает ему выдавать результат. Мне захотелось раскрыть свой ответ в отдельном посте. Может быть кто-то из коллег приведёт аргументы и переубедит меня.
Если бы я задал этот вопрос на собеседовании и не получил бы ответа, то крест на кандидате бы не ставил, конечно если он в целом в курсе основных составляющих платформы. Через этот вопрос как раз можно перейти к другим темам, например, про сборщик мусора.
Но почему я не согласен с позицией:- «не знает, ну и зачем оно в реальной жизни». Сначала несколько, на мой взгляд, аналогичных утверждений: зачем использовать IDisposable, без этого можно выдавать результат. Можно использовать только коллекции List и Dictionary и тоже выдавать результат. Можно не знать как устроен словарь и выдавать результат. Можно использовать для чисел только int и float и тоже выдавать результат. В общем такой список каждый может дополнить в комментариях или представить сам себе.
А теперь пример из другой сферы, допустим вы ищите водителя-механика в логистический парк, приглашаете соискателя и спрашивайте “Какие основные технические узлы есть у грузовика?”, а он вам отвечает “Я за рулём езжу, педали нажимаю, какая разница как он устроен? Груз довести смогу”. Вывод: кандидат неопытный водитель, жизнь его ещё не мотала поломками, на любой потенциальной заморочке с машиной ему нужна будет помощь + оправдывает своё незнание отрицая важность технической части. В целом задача любого работодателя выбрать сотрудника, чтобы он усиливал компанию, а не тянул назад. Да, в программировании не все так прямолинейно, но как правило если ты не интересуешься техническими вопросами, то не одним каким-то, а в целом не интересуешься.
И так, смотря какие задачи нужно делать, какого уровня эти задачи. Если окна собирать и в целом на «общую» игровую логику не сложного проекта под опекой старшего, то можно и без много каких знаний. Например, это джун и то при условии, что человек не отрицает важность технических дебрей, а стремится все это постичь, просто ещё не успел в силу каких-то причин.А иначе зачем такой джун вообще, который не стремится развиваться и отстаивает эту позицию?
Если стоят более серьёзные технические задачи + нормальная доля свободы на проекте, не могу себе представить специалиста, который отрицает какие-то прямые или косвенные технические знания. Выбирать более важное для изучения и что-то отсеивать - придётся, конечно, но это не отрицание. В любом случае человек любознательный и привыкший копать в глубь.
Поэтому и бывают такие вопросы на собесах, чтобы за ограниченное время успеть понять на сколько глубокий специалист и сопоставить его уровень с задачами проекта.
Согласны с такой позицией? Может быть вы сами применяете или сталкивались с другими подобными вопросами, поделитесь.
Если бы я задал этот вопрос на собеседовании и не получил бы ответа, то крест на кандидате бы не ставил, конечно если он в целом в курсе основных составляющих платформы. Через этот вопрос как раз можно перейти к другим темам, например, про сборщик мусора.
Но почему я не согласен с позицией:- «не знает, ну и зачем оно в реальной жизни». Сначала несколько, на мой взгляд, аналогичных утверждений: зачем использовать IDisposable, без этого можно выдавать результат. Можно использовать только коллекции List и Dictionary и тоже выдавать результат. Можно не знать как устроен словарь и выдавать результат. Можно использовать для чисел только int и float и тоже выдавать результат. В общем такой список каждый может дополнить в комментариях или представить сам себе.
А теперь пример из другой сферы, допустим вы ищите водителя-механика в логистический парк, приглашаете соискателя и спрашивайте “Какие основные технические узлы есть у грузовика?”, а он вам отвечает “Я за рулём езжу, педали нажимаю, какая разница как он устроен? Груз довести смогу”. Вывод: кандидат неопытный водитель, жизнь его ещё не мотала поломками, на любой потенциальной заморочке с машиной ему нужна будет помощь + оправдывает своё незнание отрицая важность технической части. В целом задача любого работодателя выбрать сотрудника, чтобы он усиливал компанию, а не тянул назад. Да, в программировании не все так прямолинейно, но как правило если ты не интересуешься техническими вопросами, то не одним каким-то, а в целом не интересуешься.
И так, смотря какие задачи нужно делать, какого уровня эти задачи. Если окна собирать и в целом на «общую» игровую логику не сложного проекта под опекой старшего, то можно и без много каких знаний. Например, это джун и то при условии, что человек не отрицает важность технических дебрей, а стремится все это постичь, просто ещё не успел в силу каких-то причин.
Если стоят более серьёзные технические задачи + нормальная доля свободы на проекте, не могу себе представить специалиста, который отрицает какие-то прямые или косвенные технические знания. Выбирать более важное для изучения и что-то отсеивать - придётся, конечно, но это не отрицание. В любом случае человек любознательный и привыкший копать в глубь.
Поэтому и бывают такие вопросы на собесах, чтобы за ограниченное время успеть понять на сколько глубокий специалист и сопоставить его уровень с задачами проекта.
Согласны с такой позицией? Может быть вы сами применяете или сталкивались с другими подобными вопросами, поделитесь.
👍4🔥3🤔3💊2🐳1
Простая, но полезная штука, замечаю, что не все пользуются. Блок try-catch умеет перехватывать разные ошибки, может быть много блоков catch. Идет сверху вниз, поэтому выше должны быть типизированные ошибки, а Exception последним.
Удобно для более подробного логирования или обработки штатных ситуаций, как в примере ниже. Пример, кстати, не идеальный, как можно улучшить?
#техничка
Удобно для более подробного логирования или обработки штатных ситуаций, как в примере ниже. Пример, кстати, не идеальный, как можно улучшить?
#техничка
try
{
// какой-то код с логикой
Profiler.BeginSample($"[AllocAnalyzer] Config: {configName}");
// еще код с логикой
await handler.ReadObjectsListFromConfigAsync(cancellationToken);
Profiler.EndSample();
}
// Обработка штатной отмены по cancellationToken
catch (OperationCanceledException)
{
Profiler.EndSample();
return;
}
catch (Exception e)
{
ConfigsDataLoader.HandleConfigException(e, configName);
return;
}
👍2🔥1👀1
Многие наверное в курсе, что Telegram вообще не даёт никакой новой аудитории через внутренний поиск, рекомендации или еще что-то. Поэтому единственное, что тут есть — это упоминания канала по ссылке, которую админы других каналов делают вручную.
Привет, всем новым подписчикам, рад что вы присоединились, может быть вам будет интересно 😄
На данный момент нас тут около 200 человек и вот примерно 40 новых подписчиков пришли благодаря следующему приему: ребята из Cookies Games сделали подборку каналов в виде папки и договорились о взаимном постинге этой самой папки во всех каналах. Получается достаточно рабочая реклама. Могу выделить несколько критериев:
- Продвигая небольшие каналы, подбираем такие же. Все примерно, 150-450 участников. Теоретический, далее можно повторять историю, меняя каналы и постепенно увеличивая их «размер»
- В выборке каналы живые, профильные, ведут их ради идеи. Это вообще главный критерий.Интересно как ребята вообще всех нас нашли и собрали?
- Такая реклама не раздражает, потому как подписчики тоже зачастую рады найти еще профильных каналов, но не понятно как.
Посмотрите, что есть в папке GameDev. Мне было приятно обнаружить как старых знакомых, так и найти новых. Можете кликнуть и посмотреть всех, ниже пара личных рекомендаций:
NuclearBand — взаимно следим друг за другом почти с момента когда я начал вести свой канал. Вайб примерно как у нас тут: мысли программиста, код, истории с работы.
[Не Кеша] — сейчас пытался понять, почему я сам читаю этот канал. но кажется, потому, что мне нравится сочетание крипоты и девлогов. Авторский стиль в общем)
Есть среди подписчиков админы каналов? Как вам такой прием? Поделитесь своими каналами в комментах.
Привет, всем новым подписчикам, рад что вы присоединились, может быть вам будет интересно 😄
На данный момент нас тут около 200 человек и вот примерно 40 новых подписчиков пришли благодаря следующему приему: ребята из Cookies Games сделали подборку каналов в виде папки и договорились о взаимном постинге этой самой папки во всех каналах. Получается достаточно рабочая реклама. Могу выделить несколько критериев:
- Продвигая небольшие каналы, подбираем такие же. Все примерно, 150-450 участников. Теоретический, далее можно повторять историю, меняя каналы и постепенно увеличивая их «размер»
- В выборке каналы живые, профильные, ведут их ради идеи. Это вообще главный критерий.
- Такая реклама не раздражает, потому как подписчики тоже зачастую рады найти еще профильных каналов, но не понятно как.
Посмотрите, что есть в папке GameDev. Мне было приятно обнаружить как старых знакомых, так и найти новых. Можете кликнуть и посмотреть всех, ниже пара личных рекомендаций:
NuclearBand — взаимно следим друг за другом почти с момента когда я начал вести свой канал. Вайб примерно как у нас тут: мысли программиста, код, истории с работы.
[Не Кеша] — сейчас пытался понять, почему я сам читаю этот канал. но кажется, потому, что мне нравится сочетание крипоты и девлогов. Авторский стиль в общем)
Есть среди подписчиков админы каналов? Как вам такой прием? Поделитесь своими каналами в комментах.
🔥2🥰1🤝1
Я предпочитаю инди игры и иногда пишу о них тут. Обычно в них можно найти нестандартные механики или сюжеты, не подходящие для больших продуктов. Пощупал игру Санёк. Мне кажется это идеальный пример, масса эмоций и нестандартного опыта всего за 2 игровых часа, но целых $ 8.5.
Добавил в желаемое давно, когда попробовал демку, купил только сейчас. Игра ставит себя как приключение в детство. Рекомендую посмотреть трейлер по ссылке выше перед чтением текста, чтобы уловить посыл игры. Я хочу перечислить личные неравнодушные моменты:
- Трейлер и демо настроили меня на крайнюю ностальгию и сведение олд скулл самым сильным образом. Почему-то сюжет после демо (то есть основная игра) много слабее, не знаю чего не хватило, возможно, я заскучал в длинных диалогах и долгих утомительных хождениях в поисках точек интерактива. По впечатлениям игра не ностальгическая, а детская. Можно провести время с ребенком лет 5-7: включаете игру, даете ему мышку и клаву, себе наливаете чай, далее он играет, а вы ему за жизнь рассказываете, как папа-мама жили, а не то что он теперь.
- Игра не поддерживает джойстик. Для меня это жирный минус. Но было бы можно это простить, если игра игралась бы только мышкой. Но нет, клава + мышь. Поддержать геймпад можно было на изи.
- Экстра неожиданная находка. Я нашел блокнотик с спискомнаших секретиков упражений, которые мы используем для разминки на работе. Привожу скрин из рабочего спец-чата, где бот напоминает что делать, а все кто сделал — ставят реакции.
-Игру пройти не смог. У меня поучилась уникальная концовка. Здесь спойлер: ближе к концу игры главного героя байтят пойти в страшный лес ночью на 100 шагов в глубину. По доброй логике игры ясно, что надо сгонять в лес, затем вернуться и получить звиздюлей от матери. Так вот я пошел, шагал минут 10, честно плутал во обе стороны и далее… ничего не произошло! Представьте как это долго (10 минут) с точки зрения геймплея, просто смотреть на идущего перса по лесу. Успел заучить визуальные паттерны этого леса. Думаю глюк, какой-то триггер не отработал. Получается, моя концовка: ослушался мать, повелся на байт других детей во дворе и напрочь заблудился в лесу с потерей перспектив, конец. Потрясное и неожиданное завершение, за 10 минут я как раз пережил все стадии выгорания надежд выбраться и принял неизбежное.
- Есть и киллер-фича игры — это внутриигровая консоль UnityIngameDebugConsole, которая открывается клавишей тильды. У меня даже форк на нее есть, как-то очень надо было чтобы она еще FPS выводила. Так я узнал, что я прошел 3238 шагов, что есть нул рефы в диалогах, дофига ворнингов на аудио и дотвин.
- Может быть жестко сужу, но игра не стоит 8.5 баксов, ни по каким критериям.
#игры
Добавил в желаемое давно, когда попробовал демку, купил только сейчас. Игра ставит себя как приключение в детство. Рекомендую посмотреть трейлер по ссылке выше перед чтением текста, чтобы уловить посыл игры. Я хочу перечислить личные неравнодушные моменты:
- Трейлер и демо настроили меня на крайнюю ностальгию и сведение олд скулл самым сильным образом. Почему-то сюжет после демо (то есть основная игра) много слабее, не знаю чего не хватило, возможно, я заскучал в длинных диалогах и долгих утомительных хождениях в поисках точек интерактива. По впечатлениям игра не ностальгическая, а детская. Можно провести время с ребенком лет 5-7: включаете игру, даете ему мышку и клаву, себе наливаете чай, далее он играет, а вы ему за жизнь рассказываете, как папа-мама жили, а не то что он теперь.
- Игра не поддерживает джойстик. Для меня это жирный минус. Но было бы можно это простить, если игра игралась бы только мышкой. Но нет, клава + мышь. Поддержать геймпад можно было на изи.
- Экстра неожиданная находка. Я нашел блокнотик с списком
-
- Есть и киллер-фича игры — это внутриигровая консоль UnityIngameDebugConsole, которая открывается клавишей тильды. У меня даже форк на нее есть, как-то очень надо было чтобы она еще FPS выводила. Так я узнал, что я прошел 3238 шагов, что есть нул рефы в диалогах, дофига ворнингов на аудио и дотвин.
- Может быть жестко сужу, но игра не стоит 8.5 баксов, ни по каким критериям.
#игры
😁4🔥2👀2
Ubisoft анонсировали первый шутер в игровой серии Assassin’s Creed.
Игра получит название «Assassin’s Creed: DON».
Простите, не удержался 😅
Игра получит название «Assassin’s Creed: DON».
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9😱2❤1
Случай на работе. Пример из очень старой системы, далеко неидеального подхода, но тем интереснее. Кусок кода для загрузки данных пользователя.
Есть промежуточный класс-родитель, который сетапит загруженные сохранения у своих наследников.
Пример класса-наследника:
В LoadBit приходит obj — это уже загруженные данные или null если их не было, далее мы их либо сетапим в SetLoaded, либо ставим дефолтные значения через метод Reset. Что пошло не так написано ниже, но кому интересно, можете сначала подумать, как сломать метод LoadBit.
Изначально, было запланировано, что в метод может приходить object ожидаемого типа или null. И все было хорошо, пока не пришла пустая string (с таким успехом метод можно ломать любым другим типом, главное чтобы он был не такой как у Т). Возникает исключение и уход в catch на строке с жестким приведением типа var elem = (T) obj; без выполнения одного из методов — Reset или SetLoaded.
Кто пофиксит?)
#техничка
Есть промежуточный класс-родитель, который сетапит загруженные сохранения у своих наследников.
public abstract class Bit<T> : UserBit
{
protected sealed override void LoadBit(object obj)
{
try
{
var elem = (T)obj;
if (elem == null)
{
Reset();
return;
}
SetLoaded(elem);
}
catch (Exception e)
{
throw new Exception($"F");
}
}
protected abstract void SetLoaded(T elem);
protected abstract void Reset();
}
Пример класса-наследника:
public class ProfileBit : Bit<ProfileBit>
{
// поля дата-калсса
protected override void SetLoaded(ProfileBit elem)
{
// сетап загруженными значениями
}
protected override void Reset()
{
// сетап дефолтными значениями
}
}
В LoadBit приходит obj — это уже загруженные данные или null если их не было, далее мы их либо сетапим в SetLoaded, либо ставим дефолтные значения через метод Reset. Что пошло не так написано ниже, но кому интересно, можете сначала подумать, как сломать метод LoadBit.
Кто пофиксит?)
#техничка
👍1🤯1🐳1
Пример кода, который стреляет в ногу. Такая подстава называется “Null trap”. В данном случае есть класс, который хранит данные и имеет серию методов Get…что-то. Все написаны в стиле, попробуй найти данные, иначе верни null.
Вызывающий код не ждет, что метод может иметь наглость вернуть null. Отсюда и неочевидные ошибки. Конкретно эту мы поймали уже на релизе, когда игроки с определенным набором данных об нее дедлочились.
Как не делать таких подстав своим коллегам? Вариант для ленивых жопошников — атрибут CanBeNull. Так хотя бы IDE подсветит такой метод ворнингом и напишет “Possible 'System.NullReferenceException”. Его тоже можно не заметить, так как все не “красное” — часто пропускается взглядом.
Нормальный вариант, сделать метод явно указывающий, что данных может не быть, например так:
#техничка
public IEnumerable<int> GetFamily(string familyId)
{
return _monsterFamilies.Contains(familyId) ? _monsterFamilies[familyId] : null;
}
Вызывающий код не ждет, что метод может иметь наглость вернуть null. Отсюда и неочевидные ошибки. Конкретно эту мы поймали уже на релизе, когда игроки с определенным набором данных об нее дедлочились.
Как не делать таких подстав своим коллегам? Вариант для ленивых жопошников — атрибут CanBeNull. Так хотя бы IDE подсветит такой метод ворнингом и напишет “Possible 'System.NullReferenceException”. Его тоже можно не заметить, так как все не “красное” — часто пропускается взглядом.
[CanBeNull]
public IEnumerable<int> GetFamily(string familyId)
{…}
Нормальный вариант, сделать метод явно указывающий, что данных может не быть, например так:
public bool TryGetFamily(string familyId, out IEnumerable<int> result)
{
result = null;
if (_monsterFamilies.Contains(familyId))
result = _monsterFamilies[familyId];
return result != null;
}
#техничка
101🔥5❤🔥2
В прошлом посте я получил первую платную звезду и получается — первый доход с блога. И даже не смотря на то, что у меня нет конкретной цели с которой я его веду, теперь я не могу сказать, что делаю это бесплатно 😎
А поэтому как на счёт небольшого расширения тем на канале? Говорить про код это хорошо, но периодами скучно-душно. Иногда меня посещают вроде как хорошие мысли, но не очень вписываются в тематику канала. Давайте сделаем такой вот необычный опрос... У меня есть несколько интересных мне информационных полей и еще мне с большим усилием дается написание постов нейтральных по эмоциональному окрасу. В опросе можно выбрать НЕСКОЛЬКО вариантов, тыкните все самые неприемлемые.
А поэтому как на счёт небольшого расширения тем на канале? Говорить про код это хорошо, но периодами скучно-душно. Иногда меня посещают вроде как хорошие мысли, но не очень вписываются в тематику канала. Давайте сделаем такой вот необычный опрос... У меня есть несколько интересных мне информационных полей и еще мне с большим усилием дается написание постов нейтральных по эмоциональному окрасу. В опросе можно выбрать НЕСКОЛЬКО вариантов, тыкните все самые неприемлемые.
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳2🤔1
Я ОТПИШУСЬ, если автор начнет писать:
Anonymous Poll
10%
Про свои технические хобби и эстетику быта технаря (выходим за рамки программирования)
45%
Добавит легкий флёр политики и намеков, что во всем плохом виноват Темнейший
62%
Добавит легкий флер политики и намеков, что во всем плохом виноваты англосаксы и иже с ними
21%
Про жизненные штуки, как не выгореть программисту, жить нормальной жизнью и не стать алкоголиком
20%
Если будет сарказм и тупые шутки
62%
Если будут шит-посты (как в инсту выкладывают все подряд)
👍1
У меня есть классная штука из разряда «сделай сам» - домашнее NAS-хранилище. По сути это небольшой слабый комп с кучей HDD и дистрибутивом линукса на борту. Называется XigmaNAS (на базе FreeBSD). Устройство умеет:
- Качать торренты. Кушает торрент-файл, сам скачивает и кладёт в нужную папку.
- Файловое хранилище с поддержкой всех видов рейдов. Самое то хранить фотки, проекты и всякие бекапы. Безопаснее чем на HDD в шкафу и дешевле и подконтрольное чем в облаках.
- Обмен медиаконтентом (DLNA) в локальной сети. То есть все скаченное через торренты доступно, например, на телевизоре.
- Virtual box
- FTP-сервер
- Web-server
И много чего еще. Если вы когда-либо интересовались темой таких устройств, то можете представить сколько может стоить девайс в готовом виде с таким функционалом и 12 TB на борту. А в данном случае собранный из того, что было.
Я сделал его примерно 7 лет назад, а сейчас решил провести апгрейд - расширить объём дисков, новая мать, проц, память и плата интеграции с Алисой Яндекса. Отдельное счастье, что Линуксы спокойно переезжают с старого железа на новое без переустановки. Это не виндувс.
В общем огонь-коробка, всем рекомендую сделать себе такую из старых компьютерных запчастей, которых в избытке на антресолях. Если интерес есть - могу пошарить инструкцию.
- Качать торренты. Кушает торрент-файл, сам скачивает и кладёт в нужную папку.
- Файловое хранилище с поддержкой всех видов рейдов. Самое то хранить фотки, проекты и всякие бекапы. Безопаснее чем на HDD в шкафу и дешевле и подконтрольное чем в облаках.
- Обмен медиаконтентом (DLNA) в локальной сети. То есть все скаченное через торренты доступно, например, на телевизоре.
- Virtual box
- FTP-сервер
- Web-server
И много чего еще. Если вы когда-либо интересовались темой таких устройств, то можете представить сколько может стоить девайс в готовом виде с таким функционалом и 12 TB на борту. А в данном случае собранный из того, что было.
Я сделал его примерно 7 лет назад, а сейчас решил провести апгрейд - расширить объём дисков, новая мать, проц, память и плата интеграции с Алисой Яндекса. Отдельное счастье, что Линуксы спокойно переезжают с старого железа на новое без переустановки. Это не виндувс.
В общем огонь-коробка, всем рекомендую сделать себе такую из старых компьютерных запчастей, которых в избытке на антресолях. Если интерес есть - могу пошарить инструкцию.
2🔥16👍3
Попался вот этот мемасик, а на нем код . Может кому-то будет интересно в чем суть этого кода куска?
Это пример оптимизации из Quake III Arena, служит для быстрого извлечения обратного квадратного корня, который можно использовать для нормализации вектора. Таким образом предполагается, что код будет вызваться крайне часто.
На несколько строчек тут есть пара крутых трюков. Вот можно посмотреть на него поближе:
1. Во-первых тут есть магическое число 0x5f3759df, которое подобрали эмпирическим путем, записано в представлении IEEE 754 (статья о том что это). Так что магические числа — это нормально, особенно если получится такой же эффективный результат.
2. Вот как работает первая часть. Аргумент number после приведения к long сдвигается на 1 бит, что эквивалентно делению числа на 2 с отбрасыванием остатка. После происходит вычитание из магического числа. Уже на данном этапе получается значение приближенное к обратному корню.
Почему использовали побитовую операцию, а не простую запись деления? На процах того времени не было инструкций для быстрого деления дробных чисел, поэтому было бы медленно. Побитовый сдвиг же выполняется за 1 такт. Используя спец запись в формате IEEE 754 операция работает не как простое деление. Сдвиг вправо на 1 бит по сути делит экспоненту на 2, что эффективно приближает к нужному значению, а не просто разделяет число по полам.
3. Далее, чтобы сделать результат более точным используется метод Ньютона, это численный способ итеративного поиска более точных решений. В предыдущем пункте мы уже нашли приближенное значение, теперь делаем его еще точнее.
Повторяя этот процесс, можно было бы получить всё более точные значения, но в данном коде он применяется 1 раз. После этого шага получается значение обратного корня с точностью до третьего знака после запятой.
Вот так вкратце, оптимизируются частые вычисления. Крутое тонкое понимание работы с числами.
#техничка
Это пример оптимизации из Quake III Arena, служит для быстрого извлечения обратного квадратного корня, который можно использовать для нормализации вектора. Таким образом предполагается, что код будет вызваться крайне часто.
На несколько строчек тут есть пара крутых трюков. Вот можно посмотреть на него поближе:
float Q_rsqrt(float number)
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = *(long *)&y;
i = 0x5f3759df - (i >> 1);
y = *(float *)&i;
y = y * (threehalfs - (x2 * y * y));
return y;
}
1. Во-первых тут есть магическое число 0x5f3759df, которое подобрали эмпирическим путем, записано в представлении IEEE 754 (статья о том что это). Так что магические числа — это нормально, особенно если получится такой же эффективный результат.
2. Вот как работает первая часть. Аргумент number после приведения к long сдвигается на 1 бит, что эквивалентно делению числа на 2 с отбрасыванием остатка. После происходит вычитание из магического числа. Уже на данном этапе получается значение приближенное к обратному корню.
i = *(long *)&y;
i = 0x5f3759df - (i >> 1);
y = *(float *)&i;
Почему использовали побитовую операцию, а не простую запись деления? На процах того времени не было инструкций для быстрого деления дробных чисел, поэтому было бы медленно. Побитовый сдвиг же выполняется за 1 такт. Используя спец запись в формате IEEE 754 операция работает не как простое деление. Сдвиг вправо на 1 бит по сути делит экспоненту на 2, что эффективно приближает к нужному значению, а не просто разделяет число по полам.
3. Далее, чтобы сделать результат более точным используется метод Ньютона, это численный способ итеративного поиска более точных решений. В предыдущем пункте мы уже нашли приближенное значение, теперь делаем его еще точнее.
y = y * (threehalfs - (x2 * y * y));
Повторяя этот процесс, можно было бы получить всё более точные значения, но в данном коде он применяется 1 раз. После этого шага получается значение обратного корня с точностью до третьего знака после запятой.
Вот так вкратце, оптимизируются частые вычисления. Крутое тонкое понимание работы с числами.
#техничка
103🤓13🔥7🤯3👌1🤨1
Как вы относитесь к порно играм? А с профессиональной точки зрения, есть разница над каким проектом работать?
Anonymous Quiz
39%
Не играю в такое и не делаю
9%
Не играю, но делаю на работе порно игры
8%
Иногда только играю
17%
Иногда играю и хотел бы делать (уже делаю) порно игры
19%
Смерился бы если пришлось бы работать над такими проектами
9%
Уволился или отказался бы делать такие игры
😁6😱2
Про checked и unchecked думаю многие слышали? Недавно у unsafecsharp вышел пост про то что это. Я перечитал этот пост, пожал плечами, с ностальгией вспомнил, что на собесах это бывает звучит как дополнительный вопрос и все на этом. Отложил как очень интересное знание, которое еще ни разу не пригождалось.
И о чудо! Не далее как вчера попался в проекте баг с ошибкой на переполнение типа. Я видимо подсознательно ждал этого момента. Так что вот реальный пример. В данном проекте никто особо не запаривается на счет подбора типов значений, в основном все в int и float. Если у вас проект, где этому уделяется больше внимания, все типы ужимаются до минимально подходящего, то вероятность встретить ошибку OverflowException возрастает.
Вот так выглядит метод с ошибкой:
#техничка
И о чудо! Не далее как вчера попался в проекте баг с ошибкой на переполнение типа. Я видимо подсознательно ждал этого момента. Так что вот реальный пример. В данном проекте никто особо не запаривается на счет подбора типов значений, в основном все в int и float. Если у вас проект, где этому уделяется больше внимания, все типы ужимаются до минимально подходящего, то вероятность встретить ошибку OverflowException возрастает.
Вот так выглядит метод с ошибкой:
public int GetBundlesSize(List<BundleInfo> bundles)
{
if (bundles.Count == 0)
return 0;
return bundles.Sum(a => a.Size);
}
#техничка
3🔥3👍2🤔1