iOS OpenGL ES 求助

layject 2016-12-03 10:26:17
做iOS平台的OpenGL程序
基本框架按照《iPhone 3D Programming》书中介绍的来
其GLView封装在一个类里,相关代码如下

- (id) initWithFrame: (CGRect) frame
{
NSLog(@"fram e %f",frame.origin.x);
if (self = [super initWithFrame:frame])
{
CAEAGLLayer* eaglLayer = (CAEAGLLayer*) self.layer;
eaglLayer.opaque = YES;

EAGLRenderingAPI api = kEAGLRenderingAPIOpenGLES2;
m_context = [[EAGLContext alloc] initWithAPI:api];

if (!m_context) {
api = kEAGLRenderingAPIOpenGLES1;
m_context = [[EAGLContext alloc] initWithAPI:api];
}

if (!m_context || ![EAGLContext setCurrentContext:m_context]) {
[self release];
return nil;
}
m_resourceManager = Darwin::CreateResourceManager();
m_applicationEngine = ParametricViewer::CreateApplicationEngine(m_renderingEngine);
[m_context
renderbufferStorage:GL_RENDERBUFFER
fromDrawable: eaglLayer];

int width = CGRectGetWidth(frame);
int height = CGRectGetHeight(frame);

NSLog(@"gl w - h %d\t%d", width , height );
m_applicationEngine->Initialize(width-50, height-50);
[self drawView: nil];
CADisplayLink* displayLink;
displayLink = [CADisplayLink displayLinkWithTarget:self
selector:@selector(drawView:)];

[displayLink addToRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
}
return self;
}

- (void) drawView: (CADisplayLink*) displayLink
{
if (displayLink != nil) {
float elapsedSeconds = displayLink.timestamp - m_timestamp;
m_timestamp = displayLink.timestamp;
m_applicationEngine->UpdateAnimation(elapsedSeconds);
}

m_applicationEngine->Render();

[m_context presentRenderbuffer:GL_RENDERBUFFER];
}


目前遇到的问题是
在两个ViewController中各有一个该GLView实例,在两个界面切换时必须重新初始化
否则无法正常显示,导致在切换界面时内存不停泄漏,直至程序崩溃

初始化相关代码如下
http://
-(void) viewWillAppear:(BOOL)animated
{
if(new_display)
{
// [m_view release];
CGRect screenBounds = [[UIScreen mainScreen] bounds];
screenBounds.origin.y = 100 ;
screenBounds.size.height -= 200 ;
m_view = [[GLView alloc] initWithFrame: screenBounds];
[self.view addSubview:m_view];
new_display = false ;
}
}

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.

CGRect screenBounds = [[UIScreen mainScreen] bounds];
screenBounds.origin.y = 100 ;
screenBounds.size.height -= 200 ;
if(g_crc)
t_crc = *g_crc;

viewport_h =320 ,viewport_w =368;
m_view = [[GLView alloc] initWithFrame: screenBounds];
[self.view addSubview:m_view];



}


感觉问题有以下两个关键点
一是从根本上在OpengGL ES处解决,即如何保证GLView两个实例不冲突,可以同时正常显示
二是在初始化GLView实例时彻底释放内存
目前尝试将GL_RENDERBUFFER设为变量, 在重新初始化m_view前加 [m_view release]释放内存;
都没有解决问题。
之前用c,c++,第一次开发iOS程序
求助高手,谢谢。
...全文
497 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zej1994830 2016-12-19
  • 打赏
  • 举报
回复
A页面到B页面,再回A页面,那个view创建了共三次,另外默认ARC,不需要你release,并且你的对象还在使用你给提前释放了必然崩溃啊,
layject 2016-12-16
  • 打赏
  • 举报
回复
请哪位大神帮帮忙啊

29,028

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧