• Как игровые движки компилируют код?

    Nipheris
    @Nipheris Куратор тега C++
    Вы явно путаете жужжащих мух с теплыми котлетами. Игровые движки создаются разработчиками, также же как и любые другие приложения. Если это игровой движок в классическом понимании (нативный, на D3D или OpenGL) - то это нативное приложение, для создания которого применяются в общем-то обычные хорошо известные инструменты: язык программирования и его тулчейн (компилятор+линковщик) - это минимум, а там уже у кого как - IDE (одну из которых вы упомянули в тегах), просто редактор типа sublime и т.д.
    exe-файл, как и любой другой модуль на любой платформе (PE(exe, dll) на винде, ELF (бинарник/so) на линухе и т.д.) - это результат работы линковщика. Линковщик собирает сгенеренные компилятором объектные файлы и другие библиотеки в такой модуль, объектные файлы генерятся компилятором из исходного кода, исходный код пишут разработчики.
    Для Microsoft Word, Half-Life и KDE в общем и целом этот процесс - одинаковый. Разница только в инструментах, платформах и мелочах.
    Смысл вопроса из заголовка - "как ДВИЖКИ компилируют код?" я так и не понял, если вы имеете в виду скрипты, которые можно выполнять средствами движка - это другая история, многие серьезные двиги используют интепретаторы существующих скриптовых языков (Lua например весьма популярен) или пишут свой для реализации на этом скриптовом языке игровой логики, интерфейсных плагинов (в WoW так делают), ну и так далее.
    P.S. Если уж упомянули в тегах студию, поставьте её, создайте простейший консольный проект (Win32 Console Application), скомпильте и запустите - и вы выполните всю ту цепочку, которую выполняют разработчики нативных приложений (только она у них может быть сложнее, кастомизирована под их нужды, и в их проектах не 2 cpp-файла, а 10 тысяч).
    Ответ написан
    Комментировать
  • C++ загрузка библиотек и dll из определенного файла?

    Nipheris
    @Nipheris Куратор тега C++
    Армянское Радио указал вам правильное направление (т.е. если вы не хотите СРАЗУ грузить dll при запуске exe-шника, а хотите сделать это позже), но вам следует учесть, что:
    1) загружать все равно придется вручную, механизма в C++ для автоматической подгрузки dll именно в момент обращения к функции из нее не существует
    2) загрузка вручную приводит вас к тому, что линковщик не будет связывать ваш exe и dll. Это значит, что вы не сможете пользоваться предварительными объявлениями функций в хедере - вам пригодятся только типы, а указатели на код функций нужно будет получать динамически, как сказал Армянское Радио - по GetProcAddress(). Собственно, это за вас делает ОС при обычной линковке exe и dll.
    3) пункты 1 и 2 разумеется актуальны только для DLL, для тех "DLL", которые на самом деле не DLL, а дотнетовские сборки, свои правила, не имеющие ничего общего с этими (там сборки и так по-дефолту грузятся в момент первого использования типа из этой сборки);

    С учетом всего сказанного, неясно, зачем это вам: в 99% случаев динамическая загрузка нужна для реализации "плагинов" - когда заранее неизвестно, какая DLL будет загружена, чтобы потом можно было без перекомпиляции подсунуть любую DLL, если она экспортирует требуемые функции (для примера - плагины в foobar 2000).
    У вас же нужно вполне конкретно загрузить SFML, так что непонятно зачем вам такие заморочки.
    Ответ написан
    Комментировать
  • Как произвести выборку на сервере географических объектов для заданной области карты?

    https://www.percona.com/blog/2013/10/21/using-the-...
    select zip from postalcodes where st_contains(geom, point(-122.409153, 37.77765));

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

    Nipheris
    @Nipheris Куратор тега C#
    OAuth?

    OAuth provides client applications a 'secure delegated access' to server resources on behalf of a resource owner.
    Ответ написан
    Комментировать
  • Как подключить класс к форме - C++/CLI?

    Nipheris
    @Nipheris Куратор тега C++
    1) в первом блоке кода у вас, возможно, пропущена закрывающая фигурная скобка, проверьте;
    2) если вы создаете окно, то скорее всего оно у вас будет жить относительно долго, и его временем жизни нужно будет управлять вручную. Это значит, вам пора разобраться, что такое указатели и ручное управление памятью/временем жизни объекта (т.е. WindowOpen w(640, 480) скорее всего не годится)
    3) сразу учитесь давать адекватные имена сущностям в программе. WindowOpen это имя для функции, но не для класса, возможно вы имели в виду просто Window.
    4) по возможности не используйте C++/CLI как учебный язык. Это стыковочный диалект C++ для реализации взаимодействия систем поверх .net и нативных - в нем может запутаться даже бывалый C++ разработчик, новичкам даже смотреть на него нельзя - убивает душу. То, что MS по дефолту предлагает проект в студии - это так исторически сложилось. MS сейчас вообще ничего не предлагает адекватного для десктопа под C++, так что мой вам совет: либо C# + WPF/WinForms, либо Qt + C++. SFML вроде бы нормально работает в паре с Qt.
    Ответ написан
    Комментировать
  • Замена shell для Windows и автоматическое подключение флешек?

    Подключите его сами. Если влом копать winapi - mountvol в помощь, можно написать скрипт. В Powershell наверняка что-то более удобное есть.
    Ответ написан
    Комментировать
  • Какой лучший способ сделать key-value для одного поля в бд?

    Есть вариант использовать key-value хранилище для key-value данных, раз у вас именно такие. Зачем вам пытаться искать схему данных, если этой схемы не предвидится? Возьмите Монгу, раз поля о разных клиентах разные.
    Ответ написан
    Комментировать
  • Как построить полную сетку из не полной?

    Nipheris
    @Nipheris Куратор тега C#
    Тоже не совсем поменял что такое неравномерная сетка, может вам просто брать среднее из ближайших значений в той точке, где значения нет? Ну или как-то иначе интерполировать..
    Ответ написан
    Комментировать
  • Как отменить дублирование функциональных клавиш?

    Может надо софт фирменный поставить или обновить? Ноуты любят работать с софтом от производителя - без него всякие клавиши могут вообще не работать..
    Ответ написан
    1 комментарий
  • Изучение разработки приложений WPF C#?

    Nipheris
    @Nipheris Куратор тега C#
    Добавлю к Aлександр, что очень важно разобраться в MVVM подходе сразу, т.к. button_Click это в общем случае не Right Way в WPF). Фишка в том, что сама подсистема, без фреймворка, не предоставляет толковых средств для поддержания этого паттерна (есть лишь интерфейсы взаимодействия, по которым сложно сразу понять, как их правильно использовать) - нет никаких ViewModelBase и прочего, что есть во фреймворках или появляется велосипедом в каждом проекте. Когда найдете книгу с хорошим описанием этого паттерна - тогда можно и все остальное читать.
    Ответ написан
    Комментировать
  • Что использовать в С++(Qt,Boost) для простого серверного приложения-хранилища данных?

    Nipheris
    @Nipheris Куратор тега C++
    cpp-netlib.org или doc.qt.io/qt-5/qnetworkrequest.html если нужен HTTP
    Boost::Asio, если не нужно HTTP
    Berkeley Sockets все еще в моде, если не боитесь C-style
    На последние два можно накрутить Protocol Buffers через stream-ы, если протокол достаточно сложный или предполагает расширение.
    Ответ написан
    Комментировать
  • Как получить координаты объекта по фоторгафии?

    Итак, прежде всего мы можем говорить о наличии двух систем координат - мировой и наблюдателя (view, если в терминах графики). Любое преобразование из трехмерной мировой в трехмерную СК наблюдателя можно осуществить с помощью некоторой матрицы V размера 4x4. Т.е.:
    (xv, yv, zv, 1) = V * (xw, yw, zw, 1)
    где (xv, yv, zv) - координаты наличника на фото, а xw, yw, zw - реальные, которые нам надо получить для расчета размеров.
    Есть две задачи:
    1) вычислить V
    2) т.к. zv у нас нет (в фотоаппарате нет дальномера), то нужно будет его определять по смещению на двух фотографиях. Тогда можно говорить о ДВУХ матрицах V1 и V2, и решить систему уравнений:
    (xv1, yv1, zv1, 1) = V1 * (xw1, yw1, zw1, 1)
    (xv2, yv2, zv2, 1) = V2 * (xw2, yw2, zw2, 1)
    Неизвестные у нас: zv1, zv2; xw1, yw1, zw1; xw2, yw2, zw2. По идее, уравнений тоже будет 8 после раскрытия операции умножения матрицы, так что система должна решаться (конечно если V1 и V2 уже найдены)
    Искать V1 и V2 надо, очевидно, по коробке. Для этой коробки известны мировые координаты, и координаты на фотографии. Т.е. в выражении:
    (xv, yv, zv, 1) = V * (xw, yw, zw)
    Неизвестных у вас: zv и все элементы матрицы, которых 16 штук (возможно меньше, надо подумать что точно из себя представляет эта матрица, включающая перпспективную проекцию). По идее можно набрать нужное количество эталонных точек на коробке, чтобы найти все элементы матрицы.
    Ответ написан
    5 комментариев
  • Entity Framework и ООП. Как правильно реализовать принцип согласованности?

    > Как правильно реализовать связь между Business и Database уровнями? Маппинг?
    А для чего вам EF тогда?
    > В случае использования маппинга как решить проблему сохранения, добавления позиций, если используется Entity Framework?
    Любая нормальная ORM имеет возможность мапать коллекции элементов в том или ином виде. Добавление позиции в коллекцию при правильном маппинге должно приводить к добавлению строк в соответствующую таблицу с нужными значениями внешних ключей.
    > при чем чтобы таблица была одна?
    насчет одной таблицы вообще не понял. Какая одна таблица?
    Ответ написан
  • Как правильно составить функцию qHash для объекта содержащего два QString? Или просто какой алгоритм для хеширования двух строк?

    Nipheris
    @Nipheris Куратор тега C++
    А почему такая странная потребность в УНИКАЛЬНОМ хэше (который вы кстати в принципе не получите для двух строк по 20 символов, т.к. хэш-значение - типа uint)?
    > это РАЗНЫЕ объекты, несмотря на то что конкатенация firstName + lastName равна.
    ну и пусть, совпадет один раз, не такой уж частый кейс для имени и фамилии. У вас таких Каримов с одинаковым конкатенированным именем тысяча штук будет?
    Ответ написан
    4 комментария
  • Как лучше реализовать API для модулей?

    Nipheris
    @Nipheris Куратор тега C++
    > Конечно, C++ может вызвать виртуальные методы у указателей
    именно, поэтому вам нужно, как вариант:
    1) сделать абстрактные интерфейсы вроде IFooService, библиотека будет отдавать указатели на объекты, их реализующие
    2) сделать функции-фабрики и функции-уничтожители:
    IFooService* CreateFooService(...);
    void DestroyFooService(IFooService* service);

    Это все нужно в частности для того, чтобы управление памятью не выходило за пределы DLL - иными словами, где порождается, там и убивается. Для большинства библиотек это приемлемое ограничение, которое позволяет сохранять ABI и даже использовать разные рантаймы для DLL и для EXE, его использующего.
    Если вы будете передавать какие-то параметры по указателю, также следуйте этому правилу - не делайте так, что код в EXE выделяет память, а код в DLL - освобождает, и наоборот.
    Ну и вообще, это хорошая абстракция интерфейса (ваш IFooService) от реализации (ваш конкретный класс FooService с конкретным конструктором и деструктором. К-р и д-р сложного класса должны оставаться частью _реализации_).
    Если в качестве параметров, передающихся по значению вы используете struct-ы, это вполне допустимо, но тогда уже надо компилировать DLL и EXE одним компилятором, как этого требует, например, Qt (игнорирование этого правила рано или поздно приведет к странным и трудноуловим ошибкам, связанным с тем, что разные версии компилятора генерируют разный код конструкторов и деструкторов, и вообще могут по разному разложить struct в памяти).
    Ответ написан
    3 комментария
  • Что за ошибка Метрики при сборке пакета?

    Nipheris
    @Nipheris Куратор тега C#
    Спасибо за суммон.
    В этой сборке действительно есть тип со странным именем, которое даже толком не парсится (возможно, содержит символы юникода):
    87d35e4abf0a4629b83d87a242fc21de.png
    Вероятно это имя дал типу обфускатор, который использовали в Яндексе для этой сборки (а его использовали, судя по именам методов и полей вида A, b, C и т.д.)
    Думаю, об этой проблеме нужно отписать Яндексу (если конечно для этого пакета не существует опенсорсных исходников, что сомнительно).
    Ответ написан
    1 комментарий
  • При помощи чего разрабатываются интерфейсы для Desktop-приложений?

    Nipheris
    @Nipheris Куратор тега C++
    > Battle.net
    вот очень кстати сказали. Открываем <путь установки>\Battle.net.XXX\, видим:
    2406a0538fd449489e2ffaf0a7f2f05e.png
    Ну вы поняли :)
    А красиво и стильно, это потому что у компании есть деньги на:
    1) специалистов, которые знают и С++, и Qt достаточно хорошо, чтобы придавать приложениям желаемый вид
    2) дизайнеров, которые дадут несколько идей, из которых потом можно выбрать ту, которую реально реализовать, чтобы выглядело на "ура".
    На данный момент Qt это лучшее что я могу посоветовать для плюсов, т.к. с ним реально можно добиться результатов, bnet клиент вам в пример. Приемлемо это для вас или нет - решать вам, меня разработка UI на плюсах нисколько не отталкивает, но это уже личный опыт.
    Ответ написан
    8 комментариев
  • Подходит ли JavaScript для Game Development?

    Nipheris
    @Nipheris Куратор тега C++
    Выбор почти полностью зависит от алгоритмической и графической сложности ваших игр. Логично, что если у вас есть желание выжать максимум, то вам нужно как можно меньше накладных расходов и минимум абстракций, поэтому в этом случае - плюсы.
    Если важнее скорость разработки и простота доставки пользователю - то JS
    Ответ написан
    3 комментария
  • Как передать по TCP несколько переменных?

    Nipheris
    @Nipheris Куратор тега C++
    Вам нужно делать write для каждой переменной или буфера, который вы хотите передать. Например, что мешает сделать так:
    int len = strlen(str);
    double val = 6.0;
    write(sockfd, &len, sizeof(len)); // длина
    write(sockfd, str, len); // строка
    write(sockfd, &val, sizeof(val)); // еще какой-то там дабл

    Также нужно прочитать на другом конце. Что из этого не получается?
    Ответ написан