使用For循环从内存中释放纹理

Using For-loop to Free Textures from Memory

本文关键字:释放 纹理 内存 For 循环 使用      更新时间:2023-10-16

我加载了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]);
        } 
    }
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);
}

存储在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 30myvector包含:10 20 30