使用For-loop从内存中释放纹理

时间:2014-04-10 15:37:07

标签: c++ concatenation

我加载了23个纹理,并将它们命名为t1, t2, ... , t23,

我有一个可以释放所有纹理的函数,但我希望能让它更有效(或使用更少的代码)来释放所有纹理。

目前,它是这样做的:

    FreeTexture(t1);
    FreeTexture(t2);
          .
          .
          .
    FreeTexture(t23);

所以我试着这样做:

    for (int i=1; i< 23; i++){
        //i int-to-string
        //concatenate 't' + 'i_string'
        FreeTexture(ti);
    }

但我不确定实现这类事情的最佳方法。

或者将所有纹理放在数组中并且只是迭代数组会更容易? t[i]

更新

我已将代码更改为:

    int numberOfTextures = 23;
    std::vector<GLuint> v(numberOfTextures);

    v[1] = LoadTexture("resources/RoadTex1.raw", 512, 512);
    v[2] = LoadTexture("resources/RoadTex2.raw", 512, 512);
            .
            .
            .

    void freeTiles(){
        for (int i=1; i<=numberOfTextures; i++){
            FreeTexture(v[i]);
        } 
    }

2 个答案:

答案 0 :(得分:0)

Texture *t[NUM_TEXTURES];

for(int i=0;i<NUM_TEXTURES;i++) {
    FreeTexture(t[i]);
}

创建一个纹理指针数组,遍历数组。这是直接C版。在C ++中,您可以使用向量并从头到尾使用迭代器。

道歉,我错过了C ++请求:

#include <vector>

std::vector<Texture *> t;

for(std::vector<Texture *>::iterator i = t.begin(); i!= t.end(); ++i) {
    FreeTexture(*i);
}

答案 1 :(得分:0)

存储在std :: vector中是个好主意,,,你的for循环就足够了。但更好的方式,因为@ user2278777说是使用迭代器。另一种称职的方式是使用foreach

// for_each example
#include <iostream>     // std::cout
#include <algorithm>    // std::for_each
#include <vector>       // std::vector

void myfunction (int i) {  // function:
  std::cout << ' ' << i;
}

struct myclass {           // function object type:
  void operator() (int i) {std::cout << ' ' << i;}
} myobject;

int main () {
  std::vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myfunction);
  std::cout << '\n';

  // or:
  std::cout << "myvector contains:";
  for_each (myvector.begin(), myvector.end(), myobject);
  std::cout << '\n';

  return 0;
}

输出 myvector包含:10 20 30 myvector包含:10 20 30