• Рендеринг в 3D-играх: введение
    0

    Можно как-то детальнее пояснить про форвард? В моем понимании преобразование координат и растеризация никак по-другому и не работает, как можно без него заполнять буфера?

  • Как я отказался от вычисления квадратного корня
    0

    Он гарантирует точность при фиксированном числе операций без использования LUT, и 12 бит точности не такие уж и накладные для 32х битного процессора на мой взгляд.

  • Как я отказался от вычисления квадратного корня
    0

    А вы пробовали вычислять квадратный корень через разложение в ряд Тейлора ?

  • Вы правда знаете о том, что такое массивы?
    +1

    Можно подробнее про массивы переменной длины в С, VLA что ли?
    В C++ есть std::vector, да.

  • Сортировка n-нарной пирамидой
    +2

    Число потомков хорошо подобрать по размеру кеш линии, которая для x86 64 байта. Соответственно если сравнивать просто 32битные ключи, то n=16. Для 64х битных уже 8. Простые сравнения чисел намного быстрее промахов кэша.

  • Выпуск#33: ITренировка — актуальные вопросы и задачи от ведущих компаний
    0

    Там иллюстрация содержит подсказку к теоретическому решению. Не все таблетки однородны с равномерным распределением активных веществ. На таблетке может не быть засечек.

  • Выпуск#33: ITренировка — актуальные вопросы и задачи от ведущих компаний
    0

    Правильный ответ на второй вопрос сильно зависит от типа таблеток. В общем случае так делать нельзя.

  • Как менеджеру проектов выбирать себе работу
    +2

    Проблема статьи в том, что в ней можно заменить менеджера проекта на любую другую профессию и никто не заметит разницы :). Очень мало специфики.
    "пусть и на менеджерскую позицию" — это такой троллинг? Для многих переход на менеджерскую позицию является единственным способом зарплатного и карьерного роста и когда приз уходит новому человеку извне — это чертовски неприятно. Есть конечно и менеджерские позиции, которые никто не хотел, но там все относятся с пониманием.

  • Зло на службе добра: Суперзлодейская 3D-печатная маска защищает детей от загрязненного воздуха
    0
    Я полагаю что проблема будет в стоимости такой маски.
    Маски — одноразовое медицинское изделие — дешевле и проще в эксплуатации.
    Просто как декоративный аксессуар — настоящий респиратор неудобен.

    Как прикольный респиратор — возможно подойдёт тем, кто часто работает со вредными веществами (например с красками/пульверизатором), но дети обычно не относятся к этой категории.
  • Ускорение поиска в Have I Been Pwned до 49 микросекунд (С++)
    0
    В git используется похожий механизм по работе с хешами, первый 00-FF уходит в имя папки, а внутри уже файл называется хешом без первой части.
    По сути это на один шаг больше, чем 256 файлов описанный в статье.
    Это было бы 256 папок и 256*256 файлов.
    Если grep занимал две минуты, то после такой реструктуризации по логике он будет занимать какие-то доли секунды. Содержимое файлов при этом сортировать не обязательно, они такие-же текстовые и грепаются.
  • Prerender on canvas 2D
    +3

    Если анимация одна и та же, то можно использовать видео.

  • Как проверить навыки программирования на Python? Задачи от Яндекса
    0
    Ну это скорее всего плохие тесты от организаторов, раз приведённый пример кода решает задачу. Можно привести пример с n=1, после чего дать на вход три числа [1, 2, 2] — правильный ответ будет 1, так как дальше первого элемента работать не должно согласно условиям задачи
  • Как проверить навыки программирования на Python? Задачи от Яндекса
    0
    Всё верно, после добавления ip в список плохих счётчик удаляется и далее пропускается, счётчик ip не увеличивается.
    Однако ip попадает в очередь и позже удаляется из очереди, при этом счётчик ip всегда уменьшается (при уменьшении счётчик для ip тоже создаётся), дополнительной проверки oldest_ip in bad_ips там нету.
  • Как проверить навыки программирования на Python? Задачи от Яндекса
    +1
    Режим зануды:
    В последнем примере кода если адрес уже есть в списке плохих, то от него остаётся счётчик, который уйдёт в отрицательные числа, и тогда при некоторых условиях число счётчиков превысит 1000.
    print('\n'.join(current_ip for current_ip in sorted(bad_ips)))

    Зачем так, можно же
    print('\n'.join(sorted(bad_ips)))
  • Как сократить накладные расходы при обработке исключений в С++
    +4
    Если заменить настоящие исключения на возврат объекта ошибки, то это будет быстрее работать — да. Только это уже не будет исключениями :)
    Они на то и исключения, чтобы не возникать часто — насколько оправдано вообще с этим заморачиваться в плане штатной работы приложения?
  • Самый простой алгоритм для создания Филворда (Часть 1)
    0
    По логике там хеш-таблица или какое-нибудь префиксное дерево. Обычный бинарный поиск тоже довольно быстр — ведь там не больше нескольких сотен тысяч слов, а это около 18ти сравнений.
  • Самый простой алгоритм для создания Филворда (Часть 1)
    +1
    3й способ
    Генерируем разбиения числа, например для 25 их всего 1958.
    Для 25ти слов: 1, 24х: 1,…
    {25: 1, 24: 1, 23: 2, 22: 3, 21: 5, 20: 7,
    19: 11, 18: 15, 17: 22, 16: 30, 15: 42, 14: 56, 13: 77, 12: 100, 11: 131, 10: 164,
    9: 201, 8: 230, 7: 248, 6: 235, 5: 192, 4: 120, 3: 52, 2: 12, 1: 1}
    На 5 слов 192 разбиения. Нас не интересуют разбиения, содержащие единицу, больше одной двойки или больше одной тройки (как пример, это эвристика для «интересного» разбиения, можно отфильтровать и все 1958 разбиений, тут фильтр что ровно 5 слов)
    После фильтрации остаётся 37 вариантов:
    [6, 6, 6, 4, 3], [6, 6, 5, 5, 3], [6, 6, 5, 4, 4], [6, 5, 5, 5, 4], [5, 5, 5, 5, 5],
    [7, 6, 5, 4, 3], [7, 6, 4, 4, 4], [7, 5, 5, 5, 3], [7, 5, 5, 4, 4], [6, 6, 6, 5, 2],
    [7, 7, 6, 3, 2], [7, 7, 5, 4, 2], [7, 7, 4, 4, 3], [7, 6, 6, 4, 2], [7, 6, 5, 5, 2],
    [8, 6, 5, 4, 2], [8, 6, 4, 4, 3], [8, 5, 5, 5, 2], [8, 5, 5, 4, 3], [8, 5, 4, 4, 4],
    [9, 4, 4, 4, 4], [8, 8, 4, 3, 2], [8, 7, 5, 3, 2], [8, 7, 4, 4, 2], [8, 6, 6, 3, 2],
    [9, 7, 4, 3, 2], [9, 6, 5, 3, 2], [9, 6, 4, 4, 2], [9, 5, 5, 4, 2], [9, 5, 4, 4, 3],
    [11, 4, 4, 4, 2], [10, 6, 4, 3, 2], [10, 5, 5, 3, 2], [10, 5, 4, 4, 2], [10, 4, 4, 4, 3],
    [12, 4, 4, 3, 2], [11, 5, 4, 3, 2], выбираем любой, перемешиваем :)
  • 3D картинка на питоне с (почти) нормальной производительностью
    +1
    Решение можно упростить с O(w*m*n) всегда до O(w*(m+n)) в худшем случае, заменив итерационное решение из оригинала на аналитическое (проходя только клетки, в которые попадает луч, но не с фиксированным шагом t, а с аналитически посчитанным до пересечения с сеткой).
    Это позволит избавиться от формирования списка пересечений (он и сейчас по сути не нужен, можно же сразу искать минимум) и даст хороший выигрыш в скорости, если стена близко.
    В моём понимании делать ставку на малые размеры поля нельзя, даже в Wolfenstein 3D образца 1992 года карта была 64*64 = 4096 — это в разы больше высоты экрана в пикселях (1080).
  • 3D картинка на питоне с (почти) нормальной производительностью
    0
    Я не совсем понял логику работы, похоже что вы считаете пересечения каждого луча с каждым блоком уровня.
    # for each cell in map get collision wiht it, if exists
    В оригинальной статье луч шёл до первого пересечения (https://github.com/ssloy/tinyraycaster/blob/master/tinyraycaster.cpp), читая только те пустые блоки, через которые луч проходит, никаких других collisions не нужно.
    Оригинальный цикл был прост:
    for (float t=0; t<20; t+=.01) { // ray marching loop

    Если подумать, то 50 раз проверять что луч в одной и той же пустой клетке необязательно, после вычисления первых пересечений с горизонтальными и вертикальными линиями дальше можно шагать сразу по пересечениям сетки от ближнего к дальнему пока не попадём в стенку.
  • Как же, черт возьми, отсортировать этот список?
    0
    Они не привязаны к параметрам сортировки, поскольку она сама не параметризована, а жёстко задана в коде, нету «конфигурирования приоритетов извне» — приоритеты должны задаваться в рантайме, а не на этапе компиляции.
    4й вариант где на 3 типа написано 9 функций сравнения плохо масштабируется при увеличении числа типов.
    5й в принципе можно легко переделать и параметризовать, если очень надо без RTTI, то выбрал бы его.
  • Как же, черт возьми, отсортировать этот список?
    0
    Я поясню свой выбор 8 (как наиболее близкий), хотя на мой взгляд там нужен dynamic_cast, a не typeid, и можно ограничиться параметризованным функтором / компаратором
    Приоритет при сортировке на мой взгляд привязан к параметрам сортировки, и элементы об этом ничего знать не должны.
    Это исключает варианты 1 — 6 (6 вообще костыльный с побочными эффектами)
    Вариант 7 и 8 похожи, но смысла возиться со строками нет, тем более писать для этого методы элемента, по сути дублирование встроенного RTTI.
    Вариант 9 на мой взгляд плохо расширяем из-за строгой типизации
  • Питонистический подход к циклам for: range() и enumerate()
    0
    Кажутся ли вам циклы, построенные с использованием enumerate(), более читабельными, чем циклы, созданные с использованием range(len())?

    Они не эквивалентны в случае, если итерируемый список изменяет длину в процессе итерации поскольку диапазон range фиксируется по длине в начале цикла и потом не меняется.
  • Как мы взвешивали товары или маленькая ода автоматизации
    0

    Я имел ввиду что вес одного самореза можно посчитать и вынести в отдельный артикул. Допустим их 500 штук на килограмм при цене 200 рублей за кило. Это 40 копеек штука. Ну сделайте навар и округлите до 1 рубля. Если мне нужно 3 штуки это выгоднее покупки 40 грамм. Лишние саморезы все равно станут мусором в кладовке, который будет храниться годами.

  • Как мы взвешивали товары или маленькая ода автоматизации
    +1
    После такой рекламы мемом Леруа планирует пойти покупателям на встречу и продавать саморезы поштучно?
    Или исправить весы, чтобы не изводить бумагу на нулевые чеки.
  • Оптимизация 3D-моделей для игровой сцены
    +1
    И какой прирост производительности получили по сравнению с решением от февраля 2018го?
  • Новый PS1 графический рендерер для эмулятора Omega Red
    0
    Исходя из специфики примеров:
    — текстурам остро не хватает продвинутой фильтрации, билинейная выглядит плохо, нужна хотя-бы бикубическая или какой-нибудь фильтр Ланцоша в линейном цветовом пространстве. Задники в Resident Evil 1-2 очень низкого разрешения и занимают большую часть экрана игры, нужно что-то более качественное.
    — трассировка лучей на мой взгляд как раз — модели низкополигональные, какой-нибудь Ambient Occlusion заметно бы улучшил вид, но при условии что его не запекли в текстуру (не для всех игр подойдёт)
    — камере не хватает эффекта глубины и фокуса, а местами и светокоррекции, поскольку 3Д модели очень сильно выделяются от статического фона, можно добавить джиттеринг камеры
  • В «Калькуляторе» для Windows 10 Insider Preview Build 19546 появился графический режим
    +2

    Вообще уже давно же есть бесплатный Microsoft Math.

  • Выбор архиватора для бэкапа логов
    0

    Если там NTFS, можно поставить папке с логами атрибут сжатия. Бекапу это не поможет, но логов влезет больше и делается просто.

  • Как противостояние в Холодной войне помогло китайцам начать производство компьютеров
    +6

    "Как противостояние в Холодной войне помогло китайцам начать производство компьютеров" — как-то очень мало про начало производства китайцами компьютеров, скорее помогло поддержке китайской письменности в компьютерах США.

  • Поразрядная сортировка LSD (Radix Sort)
    +2
    Я предполагаю что падение связано с уменьшением доступного для сортируемых массивов кэша. Ваш оригинальный алгоритм в цикле работал с 1КБ массивом счётчиков, а новый работает с двумя массивами, т.е. 2КБ.
    P.S. Прикольно, что 4*256 = 1024, а 4*16 = 64 (т.е. массив целиком вмещается в кеш-линию если счётчики на пол-байта). В плане кэша MSD был бы лучше, так как уже после одного прохода элементы не будут перемещаться по всему массиву, а только внутри группы.
  • Поразрядная сортировка LSD (Radix Sort)
    +2

    В sort step и так происходит обход каждого элемента основного массива, я предлагаю в том же цикле и делать подсчет для следующей перестановки, меняя массивы счётчиков. Да, эти 256 значений нужно будет занулять и потом пересчитать смещения, но это же и так делается.

  • Поразрядная сортировка LSD (Radix Sort)
    +3

    А если комбинировать sort step c подсчетом? По логике это будет только 2КБ сверху даже для 64х битных чисел, ведь после sort step старый подсчет больше не нужен.

  • Усложняем Sci-fi-модели процедурно: что такое Greeble и как его использовать
    0
    Если брать от центра лицевого треугольника перпендикулярно ребру, то ребра боковых с лицевой гранью будут хорошими (это хороший вариант, так как эти рёбра по логике ближе к наблюдателю), но все остальные рёбра не будут совпадать.
    Аналогично можно взять перпендикулярно ребру на оригинальной поверхности к центру, тогда рёбра у основания будут хорошими…
    Думаю что 3D текстура в идеале решила бы эту проблему, но это сильно жирно :)
  • За кулисами жизни модератора Stack Overflow
    +4
    Что за игра на фото

    Похоже на Crusader: No Regret
    Я точно помню что с нормальной работой этой игры в своё время у меня были проблемы (лет 15 назад, когда им уже/ещё не торговали и он был abandonware, если я правильно помню).
  • Усложняем Sci-fi-модели процедурно: что такое Greeble и как его использовать
    0
    Отличная статья, но непонятно что делать с привязкой текстуры для полученных после выдавливания боковых граней.
  • Нет, искусственному интеллекту нас не победить
    0

    Это как-то сложно, у многих людей из очереди скорее всего есть мобильные телефоны и их можно использовать для определения местоположения и оценки очереди в пределах действия wifi роутеров например. О существовании очереди можно будет догадаться по характеру движения телефона, даже если он один в очереди. Я конечно так себе как искусственный интеллект, но думаю что есть масса других косвенных показателей наличия очереди и любая аномалия может быть проверена "контрольным посетителем", а лучше несколькими независимыми :)

  • Действительно ли использование BSP в Doom стало гениальным ходом?
    +5
    Увы, сейчас конкретная реализация BSP в Doom и Doom2 не выглядит особо логичной для графики, поскольку развитие видеокарт ушло в сторону прорисовки треугольников.
    Из-за этого современные порты добавляют к картам дополнительные предварительно рассчитанные блоки GL_VERT, GL_SEGS, GL_SSECT, GL_NODES и GL_PVS, делая алгоритм прорисовки более похожим на Quake, нежели на оригинальный Doom.
    Так произошло из-за специфики прорисовки пола / потолка и VSD — оригинальный Doom не задумывался какой они формы, поскольку для него это всего-лишь область экрана, которую нужно «залить» текстурой пола или потолка, проецированной на нужном уровне. Однако для того, чтобы нарисовать пол или потолок в том же OpenGL, его надо сначала разбить на треугольники, это уже не «заливка» плоской фигуры на экране, а реальная поверхность в 3Д.
    Проблема с VSD заключается в том, что видимые поверхности определялись для каждого столбца, гуляя по BSP дереву (правда далеко зайти не разрешали) пока столбец не заполнится. Однако для полного 3Д, где можно крутить камерой — это не годилось. Нормального оcclusion query ещё не было, поэтому утащили PVS из Quake.
    Учитывая эти доработки напильником в современных портах Doom, решение было классным для рендерера тех времён, но сейчас бы так скорее всего не делали.
  • [Туториал] Как создать вашу первую инкрементальную IDLE игру на JavaScript
    0
    Если вкладка закрыта

    Наверное хотели сказать не активна, однако в моём представлении Idle игра должна «продолжаться» даже когда компьютер вообще выключен.
    В самом простом случае это просто сохранённое время, например в localStorage. При загрузке игры она мгновенно «проматывается» исходя из разницы во времени, а для этого endOfTurnCalc нужно переписать с учётом что пройдёт намного больше одного «хода».
    Сохранение игры тоже можно сделать автоматическое, на каком-нибудь window.onbeforeunload

    P.S. Я не против авторского подхода, тем более что ни одной Idle игры я не выпустил, просто принцип работы представлял несколько иначе.
  • [Туториал] Как создать вашу первую инкрементальную IDLE игру на JavaScript
    0
    Почему-то считал что Idle игры обязательно должны быть завязаны на реальном времени. Что игру можно забросить на день, потом вечерком выбрать апгрейдов и опять оставить на сутки. А setInterval это как-то слишком жёстко для жанра на мой взгляд — держать вкладку активной!?
  • 5 возможностей Python, о которых я не знал — а зря
    0
    Это перевод статьи аспиранта (это не совсем точно, т.к. там другая система) Эдинбургского университета.