次の例では openFrameworks ツールキットを使用していますが、私のエラーは openFrameworks 固有のものではないと思うので、誰かが助けてくれることを願っています。
私は ofxThreadedImageLoader を使って画像を動的に読み込みます。そして、別のスレッドを使用してアンロード/削除します。私の問題を小さなコードに凝縮しました。この例では削除スレッドは必要ありませんが、実際のプログラムでは必要なので、ここに記載しています。(また、スレッドではなくメインループで削除しても問題は発生しません。スレッドでは、画像がどこかにコピーされ、1つのコピーだけが削除されるようです。)
void testApp::setup(){
alreadyLoaded = false;
tmpImage = new ofImage();
loader.loadFromDisk(tmpImage, "images/test.png");
loader.startThread(true, false);
imageDeleter.start();
}
void testApp::update(){
bool alreadyLoaded = tmpImage->isUsingTexture();
if(alreadyLoaded) {
ofTexture& tex = tmpImage->getTextureReference();
alreadyLoaded = tex.bAllocated();
}
if(alreadyLoaded) {
imageDeleter.addImageToDelete(tmpImage);
tmpImage = new ofImage();
int nImages = DIR.listDir("images/");
loader.loadFromDisk(tmpImage, DIR.getPath((int) ofRandom(nImages)));
}
}
更新プログラムのメイン ループです。スレッド化された削除は次のとおりです。
class threadedDelete : public ofxThread{
public:
deque<ofImage *> images_to_delete;
//--------------------------
threadedDelete() {
}
threadedDelete(ofImage* _imageToDelete){
lock();
images_to_delete.push_back(_imageToDelete);
unlock();
}
void addImageToDelete(ofImage* _imageToDelete) {
lock();
images_to_delete.push_back(_imageToDelete);
unlock();
}
void start(){
startThread(true, false); // blocking, verbose
}
void stop(){
stopThread();
}
//--------------------------
void threadedFunction(){
while(isThreadRunning()){
if (images_to_delete.size() > 0) {
lock();
ofImage * imageToDelete(images_to_delete.front());
ofLog(OF_LOG_NOTICE, "deleting " + ofToString(imageToDelete));
images_to_delete.pop_front();
delete imageToDelete;
unlock();
}
else {
ofSleepMillis(50);
}
}
}
};
つまり、基本的にランダムな画像をロードしているだけで、ロードされたら削除して別の画像をロードします。新しい ofImage はすべて削除されますが、メモリの使用量が増加し、メモリの警告 (iOS) が表示されてアプリがクラッシュします。何が恋しいですか?私が言ったように、コードがopenFrameworksクラスを使用していることは知っていますが、私のエラーはかなり基本的なものだと思うので、誰かがこのスニペットに基づいてそれを見ることができるかもしれません.