Какао - OpenGL ES - Оборачиваясь вокруг C-Arrays - PullRequest
1 голос
/ 19 августа 2011

Это скорее вопрос общей теории, который я просто не могу охватить, поэтому я объясню, что я пытаюсь сделать.

Я пишу движок 3D-игр с Cocoa и OpenGL ES.Я пытаюсь определить наилучший способ хранения данных о моих вершинах для своих 3d-моделей (каждая вершина имеет положение x, y и z).

Ранее я хранил каждую вершину как отдельный пользовательский объект (AEVertex), этот объект имел переменные экземпляра x, y и z.Проблема в том, что я использую команду glDrawArrays(), которая принимает адрес C-массива в качестве первого параметра.Предполагается, что этот C-массив является одномерным массивом, в котором хранятся все позиции вертикалей подряд (позиция x вертикали 1, позиция y вертикали 1, позиция z вертикали 1, позиция x вертикали 2, позиция y верта 2, позиция верта 2положение и т. д.).

Проблема, с которой я столкнулся, заключалась в том, что мне нужно было собрать все вершинные данные для данной модели из каждого отдельного объекта вершины и создать C-массив, достаточно большой для хранения всех этих вершин./ заполните C-Array данными vert, а затем передайте этот массив.Очевидно, что это сильно замедлит работу, поскольку я по сути выделяю память для каждой модели дважды.

Так что мне хотелось бы просто иметь класс AEMesh, который имеет переменную экземпляра C-Arrayкоторый хранит все вершинные данные для данного объекта AEMesh.Моя проблема с этим заключается в том, что, насколько я знаю, возможно только объявить переменные экземпляра C-Array фиксированного размера, однако а) все мои модели будут иметь разное количество вершин и б) я не буду знать, сколько вершин в каждой моделидо чтения данных модели во время выполнения.

Итак, мои вопросы:

  1. Есть ли способ создать изменяемый динамический C-массив в качестве переменной экземплярадля объекта?Таким образом, позволяя мне добавлять новые индексы массива для каждой вершины, считываемой из файла модели данного AEMesh?

  2. Если нет, то мне интересно, могу ли я создать C-массив вершинных данных вне AEMeshинициализации, и просто иметь переменную экземпляра указателя, указывающую на nil, когда создается экземпляр AEMesh, и назначается созданному C-массиву после объявления C-массива.

Ответы [ 2 ]

0 голосов
/ 19 августа 2011

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

0 голосов
/ 19 августа 2011

Да, это возможно, вы можете иметь переменную экземпляра, которая является указателем, и использовать такие функции, как malloc, чтобы выделить для нее память во время выполнения. См. эту страницу для учебника по динамическим массивам. И не забудьте free свою память позже!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...