当我启动游戏时,我希望屏幕在后台加载资源时显示加载图像。我这样做是通过加载一个简单的UIImageView组件并向其添加“微调器”,以向用户提供反馈,即设备在后台加载某些内容。
在显示此图像时,我加载了所有图像和纹理,并设置了我的OpenGL视图并让它渲染。 当第二帧被渲染时,我想隐藏ImageView并仅显示OpenGL视图。我不希望OpenGL视图显示在第一帧上,因为渲染时间非常长。
但是,我在加载所有资源和设置OpenLink视图的DisplayLink以在新线程中进入渲染循环然后在加载完成时显示OpenGL视图时遇到一些问题。渲染循环似乎没有开始。
以下是我的View Controller的loadView方法
- (void)loadView
{
CGRect mainScreenFrame = [[UIScreen mainScreen] applicationFrame];
// Set up the image view
UIImage *img = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:@"Startscreen" ofType:@"png"]];
_imageView = [[UIImageView alloc] initWithFrame:mainScreenFrame];
_imageView.image = img;
// Set up the spinner
_spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[_spinner setCenter:CGPointMake(mainScreenFrame.size.height/3.0*1.85, mainScreenFrame.size.width/10.0*7.55)];
[_imageView addSubview:_spinner];
[_spinner startAnimating];
// Show the loading image
self.view = _imageView;
/* Load resources in a new thread -- this shows the spinner during loading */
[NSThread detachNewThreadSelector:@selector(loadGLView) toTarget:self withObject:nil];
}
loadGLView仅执行以下操作并初始化OpenGL视图并开始加载过程。
_glView = [[JungleOpenGLView alloc] initWithFrame:mainScreenFrame];
这就是我在OpenGL视图中设置DisplayLink的方法。
CADisplayLink* displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(setupRender:)];
[displayLink setFrameInterval:2];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
当第二帧被渲染时,我发送一个通知,ViewController然后设置
self.view = _glView;
答案 0 :(得分:0)
我发现了自己的错误。 而不是像这样为加载方法创建一个新线程:
[NSThread detachNewThreadSelector:@selector(loadGLView) toTarget:self withObject:nil];
我用过:
[self performSelectorInBackground:@selector(loadGLView) withObject:nil];
这就是诀窍。关于这个主题的好读(创建线程)可以在这里找到:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html