Arhn - архитектура программирования

почему игровые движки предпочитают статические библиотеки библиотекам динамической компоновки

Я прочитал несколько книг по играм. И они всегда предпочитают создавать движок как статическую библиотеку, а не динамическую ссылку. Я новичок в C ++, поэтому я не очень разбираюсь в статических библиотеках и библиотеках динамической компоновки. Все, что я знаю, это то, что статические библиотеки увеличивают размер вашей программы, при этом библиотеки DLL-ссылок загружаются по мере необходимости в вашей программе.

[редактировать]

Я играл в игры, в которых почти казалось, что они использовали DLL для загрузки звука, освещения и прочего. по мере того, как уровень загружался. Потому что вам это не обязательно нужно, когда вы находитесь в игровом меню.


  • Гораздо более вероятно, что они просто загружают ресурсы art + sound, когда они им нужны, вместо того, чтобы загружать библиотеки DLL позже. Как правило, вам с самого начала нужны все ваши функции, но не все ваши данные. 28.04.2010

Ответы:


1

Библиотеки динамической компоновки должны быть независимыми от позиции; это может вызвать снижение производительности на некоторых архитектурах процессоров.

Статические библиотеки можно оптимизировать, если они включены в вашу программу, например, удалив мертвый код. Это может улучшить производительность кеша.

27.04.2010
  • Хорошо, вы сказали, что их нужно позиционировать независимо. Определите позицию независимо. Потому что как я на это смотрю. И DLL, и статические библиотеки будут считаться независимыми в том смысле, что они не принадлежат исходной игре. Когда вы используете статические библиотеки. Вы загружаете все его содержимое. Итак, как именно можно удалить из него мертвый код? 27.04.2010
  • Статическая библиотека связана с вашим исполняемым файлом во время компиляции / компоновки; компоновщик знает адрес загрузки кода статической библиотеки и может оптимизировать его. Компоновщик также знает, на какие функции в библиотеке ссылаются, и может вырезать функции, на которые нет ссылок. Динамическая библиотека связана во время выполнения и может совместно использоваться несколькими процессами, поэтому адрес априори неизвестен, и библиотеку нельзя перемещать. В динамической библиотеке есть точки входа, которые можно использовать динамически (да) ;-), поэтому никакой код нельзя исключить из объема памяти. 27.04.2010
  • Под независимой от позиции я подразумеваю, что код должен работать независимо от того, где он загружен в память. Это подразумевает использование относительных переходов и ссылок на данные на основе указателей (или относительных константных ссылок на данные ПК). Очень умные загрузчики могут выполнять некоторую работу во время загрузки, чтобы минимизировать воздействие. Однако статический код можно скомпилировать и связать, чтобы использовать известные адреса для данных и кода. 27.04.2010
  • Очень умные загрузчики @Doug могут ... На самом деле, даже умные, им будет трудно это сделать, если система позволяет видеть одну и ту же динамическую библиотеку по разным виртуальным адресам двум процессам, которые используют это одновременно. Например, это выбор в двоичном формате ELF, о других я мало что знаю. 27.04.2010
  • @Pascal: Ну, Windows работает в основном на x86, чьи инструкции переменной ширины делают буквально невозможным деассемблирование dll во время загрузки, поэтому Windows также не может / не может изменить двоичный файл. 27.04.2010
  • @BlueRaja Если бы DLL гарантированно была видна по одному и тому же адресу всеми процессами, которые ее используют, предварительная компоновка не потребовала бы разборки. Старый формат a.out позволял это делать, но это было непрактично (всемирная централизованная власть над библиотеками DLL). Думаю, что в Mac OS X тоже может быть что-то подобное (но с централизацией только в масштабе компьютера) 27.04.2010

  • 2

    Под независимой позицией он подразумевает, что, поскольку игровой движок и DLL полностью разделены, DLL является автономной и не может быть встроена в код игрового движка, тогда как статическое связывание библиотеки позволяет компилятору оптимизировать, используя как код вашего игрового движка, так и код библиотеки.

    Например, предположим, что есть небольшая функция, которая, по мнению компилятора, должна быть встроена (скопирована непосредственно вместо вызова функции). Затем со статической библиотекой компилятор сможет встроить этот код, поскольку он знает, что это за код (вы связываете во время компиляции). Однако с динамической библиотекой компилятор не сможет встроить этот код, поскольку он не знает, что это за код (поскольку он будет связываться во время выполнения).

    27.04.2010
  • Встраивание - не причина того, что динамические библиотеки работают медленнее. Большинство компиляторов и компоновщиков не встраивают функции в файлы. На самом деле, я программирую на языке, где компилятор встраивается по файлам, и, как следствие, отсутствие настоящей раздельной компиляции меня бесконечно раздражает. 27.04.2010
  • Истинный. Я просто представлял встраивание как пример того, что можно было бы сделать возможно с помощью статических библиотек, а не динамических, чтобы дать более конкретный пример. 28.04.2010
  • В Visual Studio есть оптимизация всей программы, которая с радостью будет встроена в файлы и, возможно, в библиотеки. Я был бы удивлен, если бы в gcc не было чего-то подобного (хотя большинство игр не будут компилироваться в gcc). 28.04.2010

  • 3

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

    Вы также открываете возможность глобальной оптимизации времени / времени компоновки, что намного сложнее с разделяемыми библиотеками.

    27.04.2010

    4

    Другой вопрос касается различий между статическими и динамическими библиотеками: Когда использовать динамические или статические библиотеки

    Что касается того, почему они используют статические библиотеки, дополнительная скорость может того стоить, и вы можете избежать ада DLL (в прошлом это было большой проблемой). Это также полезно, если вы хотите распространять свою программу и библиотеки вместе, гарантируя, что получатель имеет правильные зависимости, хотя ничто не мешает вам распространять библиотеки DLL вместе с исполняемым файлом.

    27.04.2010

    5

    При разработке игр для консоли часто невозможно использовать динамическое связывание. Если вы хотите использовать движок как для разработки консоли, так и для ПК, лучше избегать динамического связывания.

    27.04.2010
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..