Компьютерная графика, как известно, является основой игровой индустрии.
В процессе создания графического контента мы неизбежно сталкиваемся с трудностями, связанными с различием его представления в среде создания и в приложении.
К этим трудностям добавляются риски простой человеческой невнимательности.
Учитывая масштабы разработки игр, такие проблемы возникают либо часто, либо в большом количестве.
Борьба с такими трудностями заставила нас задуматься об автоматизации и написании статей на эту тему.
Большая часть материала будет посвящена работе с Юнити 3D , так как это основной инструмент разработки в Plarium Krasnodar. В дальнейшем 3D-модели и текстуры будут считаться графическим контентом.
В этой статье мы поговорим об особенностях доступа к представлению данных 3D-объектов в Единство .
Материал будет полезен в первую очередь новичкам, а также тем разработчикам, которые редко взаимодействуют с внутренним представлением подобных моделей.
О 3D-моделях в Unity — для самых маленьких
При стандартном подходе Единство компоненты используются для рендеринга модели Сетчатый фильтр И Мешрендерер .
MeshFilter относится к сетка — актив, представляющий модель.
Для большинства шейдеров информация о геометрии является обязательным минимальным компонентом для рендеринга модели на экране.
Данные о наложении текстур и костях анимации могут отсутствовать, если они не используются.
Как этот класс реализован внутри и как там всё хранится — секрет за определённую сумму денег.
Внешне сетка как объект обеспечивает доступ к следующим наборам данных:
- вертикали — набор положений вершин геометрии в трехмерном пространстве со своим началом;
- нормали, касательные — наборы векторов нормалей и касательных к вершинам, которые обычно используются для расчета освещения;
- ув, ув2, ув3, ув4, ув5, ув6, ув7, ув8 — наборы координат для сканирования текстур;
- цвета, цвета32 — наборы значений цвета вершин, хрестоматийный пример использования которых — смешивание текстур с помощью маски;
- связывает — наборы матриц для расположения вершин относительно костей;
- костьГири — коэффициенты влияния костей на вершины;
- треугольники — набор индексов вершин, обрабатываемых по 3 за раз; каждая такая тройка представляет собой многоугольник (в данном случае треугольник) модели.
Человек, не читающий документацию, редко работает с сетками в Единство , может быть неочевидно, что при каждом доступе к данным вершины в памяти создается копия соответствующего набора в виде массива длиной, равной количеству вершин.
Об этом нюансе речь пойдет в небольшом блок документации .
Об этом также предупреждают комментарии к свойствам класса.
сетка , о которых говорилось выше.
Причина такого поведения — архитектурная особенность.
Единство в контексте времени выполнения Мононуклеоз .
Схематически это можно представить так:
Ядро движка (UnityEngine (native)) изолировано от скриптов разработчика, а доступ к его функционалу реализован через библиотеку UnityEngine (C#).
По сути, это адаптер, поскольку большинство методов служат прослойкой для получения данных от ядра.
При этом ядро и остальная часть, включая ваши скрипты, запускаются под разными процессами и скриптовая часть знает только список команд. Таким образом, прямого доступа к памяти, используемой ядром, из скрипта нет.
О доступе к внутренним данным, или Насколько это может быть плохо
Чтобы продемонстрировать, насколько все может быть плохо, давайте проанализируем объем памяти, очищаемый сборщиком мусора, на примере из документации.Для удобства профилирования обернем аналогичный код в метод Update.
Теги: #Разработка игр #программирование #разработка #C++ #unity #3d графика #Mesh #unity3d #начинающиеpublic class MemoryTest : MonoBehaviour { public Mesh Mesh; private void Update() { for (int i = 0; i < Mesh.vertexCount; i++) { float x = Mesh.vertices[i].
x; float y = Mesh.vertices[i].
y; float z = Mesh.vertices[i].
z; DoSomething(x, y, z); } } private void DoSomething(float x, float y, float z) {
-
Кусто, Жак-Ив
19 Oct, 24 -
Новый Ip Телефон Fanvil X6
19 Oct, 24 -
Кривая Планировка
19 Oct, 24