- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试在 cocos2d 的后台线程中渲染纹理并且它运行良好,除了出于某种原因我无法在不再使用时释放纹理。
首先异步加载两个图像,然后我运行一个后台任务来渲染一个新图像。正如我所说,一切正常,问题是我的应用程序在调用这些函数几次后崩溃了。我不知道如何做更多的清理工作。注销我的可用内存告诉我每次丢失 10-15 MB(gfx1 和 gfx2 是视网膜全屏背景)。
问题一定出在这些代码行中,因为当我删除它们时,我不再有内存问题,并且分析我的应用程序表明没有泄漏!
Textures 是一个 NSMutableArray
。我在索引 0 处有一个纹理,渲染一个新纹理并将其添加到位置 1。替换 Sprite 后,我尝试在索引 0 处杀死我的(现在旧的)纹理,并且我的新纹理变为索引 0,所以我可以运行再次执行此功能。
代码如下
- (void) startBuildingTextureInBackground {
[[CCTextureCache sharedTextureCache] addImageAsync:@"gfx1.png"
target:self
selector:@selector(imageLoaded:)];
}
- (void) imageLoaded: (id) obj {
rtxTexture1 = [[CCTextureCache sharedTextureCache] textureForKey:@"gfx1.png"];
[[CCTextureCache sharedTextureCache] addImageAsync:@"gfx2.png"
target:self
selector:@selector(imageLoaded2:)];
}
- (void) imageLoaded2: (id) obj {
rtxTexture2 = [[CCTextureCache sharedTextureCache] textureForKey:@"gfx2.png"];
[self performSelectorInBackground:@selector(buildRtxTexture) withObject:nil];
}
- (void) buildRtxTexture {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
EAGLSharegroup *sharegroup = [[[[CCDirector sharedDirector] openGLView] context] sharegroup];
EAGLContext *k_context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1 sharegroup:sharegroup] autorelease];
[EAGLContext setCurrentContext:k_context];
[[CCDirector sharedDirector] setGLDefaultValues];
CCSprite* gfx1 = [CCSprite spriteWithTexture:rtxTexture1];
[rendernode addChild:gfx1];
CCSprite* gfx2 = [CCSprite spriteWithTexture:rtxTexture2];
[rendernode addChild:gfx2];
CCRenderTexture* rtx = [CCRenderTexture renderTextureWithWidth:512
height:320
pixelFormat:kTexture2DPixelFormat_RGBA4444];
[rtx beginWithClear:0 g:0 b:0 a:0];
[rendernode visit];
[rtx end];
[rendernode removeChild:gfx1 cleanup:YES];
[rendernode removeChild:gfx2 cleanup:YES];
[[CCTextureCache sharedTextureCache] removeTexture:rtxTexture1];
[[CCTextureCache sharedTextureCache] removeTexture:rtxTexture2];
[EAGLContext setCurrentContext:nil];
[self performSelectorOnMainThread:@selector(textureLoaded:) withObject:rtx.sprite.texture waitUntilDone:YES];
[pool release];
}
- (void) textureLoaded:(CCTexture2D*) newTexture {
[textures addObject:newTexture];
}
- (void) replaceTexture {
if (rtxSprite != nil) {
[spriteDisplay removeChild:rtxSprite cleanup:YES];
[[CCTextureCache sharedTextureCache] removeTexture:[textures objectAtIndex:0]];
[textures removeObjectAtIndex:0];
}
rtxSprite = [CCSprite spriteWithTexture:[textures objectAtIndex:0]];
rtxSprite.scaleY = -1;
[spriteDisplay addChild: rtxSprite];
}
最佳答案
尝试调试您的代码:添加断点或 NSLog/CCLOG 以跟踪 CCTexture2D/CCRenderTexture init/dealloc 方法的调用。
后台线程中的 CCRenderTexture 可能存在问题。当我尝试使用 CCRenderTexture 来操纵纹理时,结果出乎意料(黑色纹理或崩溃)。这是因为在主循环中也调用 OpenGL 函数,而 OpenGL 是状态机。解决方法是在主线程 (performSelectorOnMainThread) 中使用 CCRenderTexture 调用方法。
关于ios - CCRenderTexture 吃掉了我的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10472834/
长期以来,我一直在寻找解决我的问题的方法,这就是我求助于您的原因: 考虑这段代码: static char done = 0; static void sigHandler(void) { d
我现在的职业是信息架构师和 JavaScript 开发人员,但最近我又回到了后端编码领域。而且,在尝试集成 HTML 原型(prototype)并与我们基于 C# 的 CMS 一起工作时,我与我们的程
我为 Jersey 创建了一个 LoggingFilter,并在 web.xml 中正确配置了它。一切正常。当我执行“GET”时,我得到 userPrincipal (request.getUserP
我没问题 Xcode 8.3.2 和 SourceKitService 正在使用我所有的 CPU。我在stackoverflow上阅读了很多问题,但找不到真正的解决方案。 我试过的: 清理项目数据:c
我是一名优秀的程序员,十分优秀!