Это скорее вопрос общей теории, который я просто не могу охватить, поэтому я объясню, что я пытаюсь сделать.
Я пишу движок 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 фиксированного размера, однако а) все мои модели будут иметь разное количество вершин и б) я не буду знать, сколько вершин в каждой моделидо чтения данных модели во время выполнения.
Итак, мои вопросы:
Есть ли способ создать изменяемый динамический C-массив в качестве переменной экземплярадля объекта?Таким образом, позволяя мне добавлять новые индексы массива для каждой вершины, считываемой из файла модели данного AEMesh?
Если нет, то мне интересно, могу ли я создать C-массив вершинных данных вне AEMeshинициализации, и просто иметь переменную экземпляра указателя, указывающую на nil, когда создается экземпляр AEMesh, и назначается созданному C-массиву после объявления C-массива.