• Как получить цепочку кластеров занимаемых файлом?

    @Mercury13
    Программист на «си с крестами» и не только
    На то она и файловая система, что скрывает от пользователя, как устроен диск и есть ли вообще диск: может быть сетевая файловая система, могут быть устройства как файлы, а может быть RAID какой-нибудь, когда одни данные на двух дисках.

    Насколько мне известно, ни один файловый API не позволяет перейти от высокоуровневого дескриптора до низкоуровневых штучек — во-первых, неуниверсально. Во-вторых, опасно для пользовательских данных, если программа уверена, что знает, а она не знает (например, на диске MyCoolFS 3.15, а программа работает с 3.14). Все программы, работающие с файловой системой как таковой, начинают с разделов диска.

    Такая конструкция хотя бы ставит надёжные стены между пользовательскими программами (которые портят данные в крайне редких случаях — скажем, когда выключили комп во время записи) и сервисными утилитами (которые по определению опасны, используйте на свой риск).
    Ответ написан
    Комментировать
  • Когда нужен MVC, а когда API?

    @Mercury13
    Программист на «си с крестами» и не только
    API нужен, когда ожидается взаимодействие с другими сайтами и программами. Да хоть с Ведроид-прогой. В нагрузку можно сделать клиентскую часть полностью на JS, чтобы меньше повторяться — тогда это и будет ваш «сайт на API».

    MVC (применительно к вебу) — это хотите сделать рендеринг всего вывода на сервере и делите вывод на слои: этот отвечает за подготовку информации, а этот — за её вывод в HTML.
    Ответ написан
    9 комментариев
  • Какой 3D движок использует ИИ Sora?

    @Mercury13
    Программист на «си с крестами» и не только
    Подозреваю, конструкция тут другая. Смысл 3D-движка — 1) показывать сложное 3D в реальном времени, и главное в этом — отсекать невидимое и посылать видимое на видяху так, чтобы она всё это быстрее обработала; 2) иметь некие утилиты для распространённых частей игр: столкновения, камеры, риги (системы ограничений, позволяющие анимировать не кучу вершин, а, например, руку).

    Сложная картинка — опыт показал, что нейросеть со сложным освещением справляется лучше, чем 3D-движок, но чертовски неуправляема.

    Утилиты — в большинстве случаев генератору видео они мало на что нужны.

    Тут же система, возможно, и придумывает какие-то трёхмерные очертания объектов, но сильно упрощённо, на уровне второй кваки (не так-то и нужно отсечение), а затем обрабатывает результат этого 3D обычной двухмерной нейродумалкой. Пример: та самая женщина, идущая по Токио — от кадра к кадру меняется покрой её куртки.

    UPD. У них действительно есть сильно упрощённая модель трёхмерного мира, именуемая «patches». Но окончательное оформление всё равно делается обычной двухмерной нейродумалкой.
    Ответ написан
    7 комментариев
  • Как создают текстуры для игр?

    @Mercury13
    Программист на «си с крестами» и не только
    Вы, конечно, говорите о 3D. Там создают текстуры для ожидаемого разрешения экрана (2к или 4к, например), а остальное — MIP-текстурирование. Уменьшенные в 2, 4, 8 и т.д. раз версии создаются автоматически.
    Отдельный вопрос — как в текстуру втиснуть псевдо-векторную вещь, для этого используется хитрый формат текстуры и хитрые шейдеры.

    Вы можете запустить и какой-нибудь Need for Speed Porsche в 4к. Скорее всего, в каком-то месте уровня зависнет, но некоторое время работать будет. Края объектов будут резкие, за это отвечает 3D-движок. Но треугольники будет видны, а текстуры мыльные по современным меркам. Вот вам огромное превышение системных требований.

    Но в текстурах есть одно важное попущение меньшим разрешениям: между островками текстур должно быть несколько пикселей, чтобы при уменьшении не захватило соседний островок, и островки должны быть зарисованы с припуском по той же причине.
    Ответ написан
  • Как узнать что за код и как его расшифровать?

    @Mercury13
    Программист на «си с крестами» и не только
    Двоичный файл собственного формата, дополнительно закодированный в Base64. Кто такой «pony(», это ты?
    Собственного формата — это значит, его придётся декодировать из Base64, а потом ломать своими силами.
    Формат целых подозреваю Intel, но нет гарантии.
    Ответ написан
    Комментировать
  • Как сделать чтоб перснаж не мог проходить через стены?

    @Mercury13
    Программист на «си с крестами» и не только
    Если отбросить в сторону общую упоротость кода (облом делать ревизию), проблема вот в чём.
    Работая с коллайдером (фигурой, которая участвует в проверке столкновений, она же хитбокс), вы выбрали диапазон клеток
    [y / 16; (y + h) / 16).

    Например, y = 1, h = 16, (y+h)/16 = 1, диапозон [0,1), и проверяется только клетка 0. А надо 0 и 1.

    Так что надо [y / 16; (y + h - 1) / 16]. ВКЛЮЧАЯ СПРАВА.
    Ответ написан
    Комментировать
  • Как сделать чтоб одна вункция роботала всегда а другая паралельно каждую секунду?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак.
    1. В играх очень хорош объектный подход — что-то вроде
    class World {
    public:
      bool wasStarPlaced = false;
      bool wasStaircasePlaced = false;
      std::vector<std::vector<char>> map;
      unsigned long long tick = 0;  // пригодится ещё
      void update();  // стандартное название для функции «исполнить игровой такт»
    };

    Тут даже не нужны все каноны ООП, достаточно что-то вроде «поле X принадлежит объекту Y».

    2. Многопоточка чревата гонками по данным, и если в многопоточку не стоит — пожалуйста, не делайте! В данном случае вы хотите что-то вроде: каждую секунду выполнять дополнительную ветку.

    Как я понял, игра динамичная, и расчёты в ней достаточно простые, чтобы вести их с постоянной частотой (например, 60 тактов/с).
    constexpr int TICKS_PER_SEC = 60;
    
    void World::update()
    {
      ++tick;
      if (tick % TICKS_PER_SEC == 0) {
         // происходит каждые 60 тактов
      }
    }
    Ответ написан
    Комментировать
  • Для кого операция добавления элемента в середину медленнее — для List или для LinkedList?

    @Mercury13
    Программист на «си с крестами» и не только
    Если нужно искать точку, куда добавить (в LinkedList переместить итератор, в List переместить итератор ИЛИ отыскать индекс) — медленнее LinkedList из-за вопросов с кэшем.
    Если точка уже имеется и она в середине — медленнее List, просто из-за асимптотической сложности.
    Ответ написан
    3 комментария
  • Возможно подключиться к домашнему роутеру через wan порт?

    @Mercury13
    Программист на «си с крестами» и не только
    Некоторые роутеры тем или иным образом позволяют — при этом указывают, через какой порт будем смотреть в сеть админкой. Не через 80 же…
    Это дыра в безопасности, по дефолту выключено, если и есть.
    Если отказал последний порт LAN, а надо настроить — зайдите по вайфаю.
    Ответ написан
    Комментировать
  • Как решить задачу "Шестерки" с меньшими затратами памяти?

    @Mercury13
    Программист на «си с крестами» и не только
    Шаг 1. Что собой представляет 66666·6?
     ₃₃₃₃
     66666
    ×    6
    ------
    399996

    Таким образом, получается N+1 цифра: 3, N−1 девятка, и 6.

    Шаг 2. Что собой представляет 66666²?
         66666
        ×66666
    ----------
        399996
       399996
      399996
     399996
    399996
    ----------
    4444355556

    (Простите уж, был обломИЩЕ, так что вычислил на калькуляторе и без цифр переноса.)

    Могут быть вопросы, если очередная сумма перескочит за 100 и перенос будет двузначным — но нет, тут всё в порядке. Посчитаем (при достаточной длине кучи шестёрок):
    Десятая с конца (!) цифра — 9·9 + 6 + 8 [перенос] = 95, перенос 9
    Одиннадцатая — 9·10 + 6 + 9 = 105, перенос 10
    Двенадцатая — 9·11 + 6 + 10 = 115, перенос 11
    Так что без вопросов, всё остаётся как было.

    Дальше как-то сможете своими силами?
    Ответ написан
    Комментировать
  • Как обеспечивается совместимость динамических библиотек при ликовке в рантайме?

    @Mercury13
    Программист на «си с крестами» и не только
    Устроено просто.
    1. Имена всё равно стараются не козявить. Те библиотеки, где объектный интерфейс выставлен наружу, менее любимы. А уж шаблонных специализаций вообще сторонятся.
    2. А если козявить — есть модель Windows (MSVC, Borland) и модель Linux (MinGW, CLang).
    3. В модели Linux подключение DLL устроено через файл *.a, смысл которого для DLL’ки — сопоставить покозявленное компилятором имя функции и таковое же, выставленное DLL’кой наружу. И для любой DLL’ки можно создать этот *.a с любыми именами. MSVC CL и MinGW LD могут подключать DLL и напрямую, CLang LLD — когда проверял, ещё нет.
    4. Да, а как заменить в скомпилированной программе. Обычно новую версию DLL’ки компилируют тем же компилятором — вот и вся совместимость. В x64 с этим делом проще, чем в x86 — меньше соглашений вызова.
    5. Часто в ABI приходится переименовывать функции из-за того, что сменилась сигнатура. То есть тащат и старую, и новую с разными именами.

    Когда программа собирается одним компилятором, а DLL’ка другим — это всегда большая сложность, и вопроса два: соглашения вызова и правило, по которым козявятся имена.
    Ответ написан
    Комментировать
  • Как найти расстояние от точки до вектора?

    @Mercury13
    Программист на «си с крестами» и не только
    Откуда начинается вектор?
    Если вектор AB и точка C, то расстояние — это ортогональная СОСТАВЛЯЮЩАЯ |AC×AB| / ||AC||·||AB||.
    a×b — это косое произведение векторов ax·by−ay·bx. В 2D это скаляр. Если убрать модуль в числителе, получится знаковое расстояние — плюс с одной стороны и минус с другой.
    ||a|| — длина вектора sqrt(ax²+ay²). Если есть функция hypot, используй её.
    Ответ написан
    Комментировать
  • Как зайти в bios роутера?

    @Mercury13
    Программист на «си с крестами» и не только
    Что такое BIOS? Это базовая система ввода-вывода.
    Какие функции выполняет BIOS на обычном ПК?
    1. Инициализация и проверка работоспособности матплаты — чтобы этим не занималась ОС с постороннего носителя.
    2. Начальная загрузка с постороннего носителя.
    3. Софт вроде Бейсика, доступный без носителя.
    4. Простейший API, позволяющий легче обращаться к консоли, дискам и прочему.
    5. Конфигурирование внешней аппаратуры.
    На встраиваемых системах нет во всём этом надобности, в отличие от расширяемого ПК.
    Разве что может быть конфигурирование аппаратуры — но для этого в некоторых микроконтроллерах (AVR) используют конфигурационные биты, они же «фьюзы». Ну а для конфигурирования внешнего по отношению к МК — только прошивка.
    А вот поковырять прошивку можно, если система позволяет. Как эту прошивку слить и залить — это отдельный вопрос.
    Ответ написан
    Комментировать
  • В какого типа переменных хранить адреса?

    @Mercury13
    Программист на «си с крестами» и не только
    Вариантов много.
    1. Непрозрачные указатели, которые нельзя разыменовывать.
    struct OpaqueAddress;
    using Address = OpaqueAddress*;

    2. void*, const void*.
    3. uintptr_t.
    4. Жёсткие int’ы, если работаем с конкретной посторонней прогой под конкретную архитектуру (например, пишем чит к игре).
    using Address = uint32_t;
    5. Enum class, основанный на соответствующем int’е.
    enum class Address : uintptr_t { NUL = 0 };
    Ответ написан
    Комментировать
  • Что стоит учить с или c++ или c#?

    @Mercury13
    Программист на «си с крестами» и не только
    Если ты умеешь программировать на чём угодно, хоть на Скрэтче — можно любой по желанию. Разберёшься.
    Если с нуля — только C#, на нём меньше шансов напортачить. Главная проблема Си, плохо решённая в Си++,— для простых вещей приходится работать со сложными концепциями вроде указателей для scanf.
    Ответ написан
    Комментировать
  • Есть ли реальная необходимость использовать Git LFS?

    @Mercury13
    Программист на «си с крестами» и не только
    У Git-LFS только два выигрыша.
    1. Перескок от ветки к ветке происходит быстрее.
    2. Многие хостинги имеют отдельную политику для крупных файлов, что позволяет как-то жить, не упираясь в пределы дискового места.
    Ответ написан
    Комментировать
  • Почему '\xDA', '\xc4', и другие управляющие последовательности не работают?

    @Mercury13
    Программист на «си с крестами» и не только
    Потому что вы перевели консоль в кодировку Win-1251 и и ждёте в ней псевдографику.
    Лучше всего работать в каком-то из вариантов Юникода.
    Ответ написан
    Комментировать
  • Как нормализовать массив значений в цветовое представление?

    @Mercury13
    Программист на «си с крестами» и не только
    Уровень 1. Чёрно-белое.
    R, G, B = round((x−min)·255 / (max − min))

    Уровень 2. Градиент между цветом X и цветом Y.
    t = (x−min) / (max − min)
    R = round(R1·t + R2·(1−t))
    G и B аналогично.

    Уровень 3. Учёт гамма-кривой монитора. Тут работаем сразу в двух цветовых пространствах: линейном от 0 до 1, и sRGB от 0 до 255.
    gamma = 2,2 — sRGB состоит из линейного и степенного участка, но неплохо приближается real_brightness = channel_%^gamma
    invGamma = 1/gamma
    функция toLinear(v) := (v/255)^gamma
    функция toSrgb(q) := (q^invGamma)·255 — в общем, обратная
    linR1 = toLinear(R1)
    linR2 = toLinear(R2)
    t = (x−min) / (max − min)
    R = round(toSrgb(linR1·t + linR2·(1−t)))

    Уровень 3.1. 16-битная аппроксимация (если важна скорость). В общем, линейное цветовое пространство — не дробные от 0 до 1, а целые от 0 до 65535.
    функция toLinear(i) := round(((i/255)^gamma)·65535)
    массив toSrgb(q) := ((q/65535)^invGamma)·255 — записывается в виде массива на 65536 величин
    linR1 = toLinear(R1)
    linR2 = toLinear(R2)
    K = (65535 / (max − min)
    t = round((x−min) * K)
    R = toSrgb(((linR1·t) + linR2·(65535−t) + 127) >> 16)

    Уровень 4. Сложный градиент из нескольких цветов.
    Для этого например, t=0 — синий, t=⅓ — зелёный, t=⅔ — жёлтый, t=1 — красный.
    Тогда прикидываем, в какой промежуток попадает t, получаем, например, t1=(t−⅓)·3, и дальше по уровню 3.
    Ответ написан
    Комментировать
  • Мне надо иметь две .lib для debug и release?

    @Mercury13
    Программист на «си с крестами» и не только
    Debug-версия библиотеки может помочь отлаживать какую-то дичь на границе вашего и библиотечного кода. Я лично не пользовался ни разу, всюду подключал release-версию.
    UPD. Я не работал с MSVC, но этот самый MSVC имеет разные runtime-библиотеки для отладки и выпуска. И они не хотят соседствовать друг с другом. Это уже внутренние разборки MSVC; две библиотеки MinGW, статическую и динамическую, но обе release, вполне себе позволяет и для некоторых целей (упрощение отладки на той самой границе) очень даже помогает. SDL2, как и большинство открытых библиотек, имеют минимальные зависимости и ему просто не нужна библиотека MSVC.
    Ответ написан
    Комментировать
  • В чем ошибка блок-схемы?

    @Mercury13
    Программист на «си с крестами» и не только
    Если считать, что прога верная, а блок-схема нет.

    1. Непонятно, почему ввода нет, вывод есть.
    2. Начальное присваивание smallest опущено.
    3. Очень креативно изображён двойной цикл. Не знаю, верно ли это — но пару вложенных циклов, если рамки внутреннего не зависят от того, что творится во внешнем и не нужно прерывать один внутренний, я бы написал оба в одном шестиугольнике.
    4. Условие внутреннего цикла я бы написал i=[0..n)
    5. В программе сначала выводим сообщение, потом матрицу. На БС наоборот.

    PS. Чёртов препод, ну не годится тут блок-схема, и точка. Может, она больше годилась, когда не было структурного программирования…
    Ответ написан
    Комментировать