gpt4 book ai didi

c++ - 在 C++ 中创建自定义类的 native 数组

转载 作者:行者123 更新时间:2023-11-28 06:52:56 25 4
gpt4 key购买 nike

我正在尝试创建一个 native 对象数组,我必须为 OpenGL 一遍又一遍地重申它。

所以性能是关键。

问题是,我的对象数组似乎最终成为指向任何地方的指针,或者从未创建数组。

无论如何,这是有问题的相关类:

    class ItemToDraw {
public:

ItemToDraw();
~ItemToDraw();

GLuint Vertex_VBO;
GLuint Normal_VBO;
GLuint UV_VBO;
GLuint Index_VBO;
GLuint Material_VBO;
GLuint Pointer_VAO;

GLuint ElementCount;
GLuint Offset;

GLfloat ObjectColor[4];
GLfloat AmbientColor[4];
GLfloat EmissiveColor[4];
GLfloat DiffuseColor[4];
GLfloat SpecularColor[4];
GLfloat Shininess;

glm::mat4 ModelMatrix;

void DrawMe(GlManagerClass* CurrentOpenGLController);
};

我的构造函数/解构函数:

    ItemToDraw::ItemToDraw(){
Vertex_VBO = 0;
Normal_VBO = 0;
UV_VBO = 0;
Index_VBO = 0;
Material_VBO = 0;
Pointer_VAO = 0;

ElementCount = 0;
Offset = 0;

for (int i = 0; i < 4; i++) {
ObjectColor[i] = 0.0f;
AmbientColor[i] = 0.0f;
EmissiveColor[i] = 0.0f;
DiffuseColor[i] = 0.0f;
SpecularColor[i] = 0.0f;
}

Shininess = 0.0f;
float initializer[16];

for (int i = 0; i < 16; i++) {
initializer[i] = 0.0f;
}

ModelMatrix = glm::make_mat4x4(initializer);
}

ItemToDraw::~ItemToDraw() {

}

void ItemToDraw::DrawMe(GlManagerClass* CurrentOpenGLController) {
glm::mat4 ModelViewMatrix = CurrentOpenGLController->GetViewMatrix() * ModelMatrix;
glm::mat3 NormalMatrix = glm::transpose(glm::inverse(glm::mat3(ModelViewMatrix)));
glm::mat4 ModelViewProjectionMatrix = CurrentOpenGLController->GetProjectionViewMatrix() * ModelMatrix;
glBindVertexArray(Pointer_VAO);
glUniformMatrix3fv(CurrentOpenGLController->GetObjectOffsetPositionID(), 1, GL_FALSE,
glm::value_ptr(NormalMatrix));
glUniformMatrix4fv(CurrentOpenGLController->GetUniformGlobalPositionID(), 1, GL_FALSE, glm::value_ptr(ModelViewProjectionMatrix));
glUniform4fv(CurrentOpenGLController->GetEmmissiveMeshColorID(), 1, EmissiveColor);
glUniform4fv(CurrentOpenGLController->GetAmbientMeshColorID(), 1, AmbientColor);
glUniform4fv(CurrentOpenGLController->GetDiffuseMeshColorID(), 1, DiffuseColor);
glUniform4fv(CurrentOpenGLController->GetSpecularMeshColorID(), 1, SpecularColor);
glUniform4fv(CurrentOpenGLController->GetMaterialColorID(), 1, ObjectColor);
glUniform1f(CurrentOpenGLController->GetMeshShininessID(), Shininess);
glDrawElements(GL_TRIANGLES, ElementCount, GL_UNSIGNED_INT, reinterpret_cast<const GLvoid *>(Offset));
}

在“manager”类中,这里是我如何实例化数组以及定义用于控制集合的函数:

    /*

Variables

*/

ItemToDraw* CollectionOfItemsToDraw;
GLuint NumberOfItemsToDraw;
GLuint CurrentIndexOfItemToDraw;
bool IsNumberOfItemsToDrawAmountComplete;

/*

EDIT: My constructor for the GlManagerClass have these lines:

*/

NumberOfItemsToDraw = 0;
CurrentIndexOfItemToDraw = 0;
IsNumberOfItemsToDrawAmountComplete = false;


/*

Function Prototypes

*/

void IterateItemToDraw();
bool CreateItemToDraw();
ItemToDraw* GetItemToDraw(GLuint IndexOfItemToRetrieve);
GLuint GetCurrentItemNumber();
void MoveToNextItem();

/*

Functions

*/

void GlManagerClass::IterateItemToDraw() {
CurrentIndexOfItemToDraw += 1;
}

bool GlManagerClass::CreateCollectionOfItemsToDraw() {
if (IsCollectionOfItemToDrawComplete == true) {
CollectionOfItemsToDraw = new ItemToDraw[NumberOfItemsToDraw];
for (int i = 0; i < NumberOfItemsToDraw; i++) {
ItemToDraw NewItem;
CollectionOfItemsToDraw[i] = NewItem;
}
return true;
}
else {
return false;
}
}

ItemToDraw* GlManagerClass::GetItemToDraw(GLuint IndexOfElementToRetrieve) {
if (IndexOfElementToRetrieve> (NumberOfItemsToDraw - 1) || IndexOfElementToRetrieve < 0) {
return NULL;
}
else {
return &CollectionOfItemsToDraw[IndexOfElementToRetrieve];
}
}

bool GlManagerClass::SaveItemToDraw(ItemToDraw* ItemToSave, GLuint IndexOfElementToSave) {
if (IndexOfElementToSave > (NumberOfItemsToDraw - 1) || IndexOfElementToSave < 0) {
return false;
}
else {
CollectionOfItemsToDraw[IndexOfElementToSave] = (*ItemToSave);
return true;
}
}

void GlManagerClass::MoveToNextItem() {
CurrentIndexOfItemToDraw += 1;
if (CurrentIndexOfItemToDraw == NumberOfItemsToDraw) {
CurrentIndexOfItemToDraw = 0;
}
}

GLuint GlManagerClass::GetCurrentItemNumber() {
return CurrentIndexOfItemToDraw;
}

当我尝试使用数组时出现问题。

    /*

Inside a draw call function in the GlManagerClass.

*/

for (GLuint i = 0; i < NumberOfItemsToDraw; i++) {
CollectionOfItemsToDraw[i].DrawMe(this);
}

我从列表中取出一个元素,剩下的就是垃圾数据。

是否缺少我没有做的事情?

感谢您的宝贵时间。

编辑

也许我应该解释一下这是如何工作的。

我的 OpenGL 程序有一个标准的工作流程和您在上面看到的工作流程。

标准工作流程运行良好;我想要创建的是一个极快的高速“缓存”,用于 OpenGL 的绘制调用(索引顶点属性 ID 和 Material ID)的重要元素,以便我可以创建一个极快的“OnDisplay”或 OnDraw 循环。

特别是对于变化不大的事情。

因此,该程序在一个工作流中第一次运行,然后填充我在上面尝试构建的数组。

在第二次和后续运行中,我希望我的程序换档并使用您在上面看到的高速循环,这样我就可以循环遍历您在上面看到的数组并根据 ID 进行绘制。

理论上应该更快。

这就是为什么我希望使用 native 数组,所有“vector ”和库中的其他数组都会增加额外的开销,尤其是在迭代循环中,这样额外的毫秒数就会增加。

希望这是有道理的。

最佳答案

我找不到任何会导致您提到的问题的错误。但是您的代码中有一些愚蠢的错误。 @Mat 指出其中两个。这是另一个

bool GlManagerClass::CreateCollectionOfItemsToDraw() {
if (IsCollectionOfItemToDrawComplete == true) {
CollectionOfItemsToDraw = new ItemToDraw[NumberOfItemsToDraw]; // The objects are already created
for (int i = 0; i < NumberOfItemsToDraw; i++) {
ItemToDraw NewItem; // Here you are creating one object
CollectionOfItemsToDraw[i] = NewItem; // and here assigning again
}
return true;
}
else {
return false;
}
}

正如评论所指出的,对象数组是在您分配内存时填充的。因此在循环中再次创建和分配是多余的。

所以我怀疑您的完整代码中可能还有其他类似的错误,这些错误会导致您收到错误。我觉得 GlManagerClass::SaveItemToDraw 很可疑,你真的传递了有效的对象指针还是破坏了它?

关于c++ - 在 C++ 中创建自定义类的 native 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23576916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com