做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程序
求助高手,谢谢。
基本框架按照《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程序
求助高手,谢谢。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货