Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于游戏的iOS上的多线程OpenGL ES_Ios_Multithreading_Loops_Opengl Es - Fatal编程技术网

用于游戏的iOS上的多线程OpenGL ES

用于游戏的iOS上的多线程OpenGL ES,ios,multithreading,loops,opengl-es,Ios,Multithreading,Loops,Opengl Es,目前,我在游戏的第二个线程上运行一个固定的timestep游戏循环。OpenGL上下文位于同一线程上,在任何更新后,渲染每帧执行一次。因此,主“循环”必须等待绘制每个帧,然后才能继续。在我写我的粒子系统之前,这不是一个真正的问题。超过1500个粒子,物理步长为16ms,会导致帧速率下降到30以下,甚至更糟。粒子渲染无法在不丢失功能的情况下再进行优化,因此我决定尝试将OpenGL移动到第三个线程。我知道这有点极端,但我觉得它应该能够处理 我曾考虑过同时运行两个循环,一个用于主步进(固定时间步),另

目前,我在游戏的第二个线程上运行一个固定的timestep游戏循环。OpenGL上下文位于同一线程上,在任何更新后,渲染每帧执行一次。因此,主“循环”必须等待绘制每个帧,然后才能继续。在我写我的粒子系统之前,这不是一个真正的问题。超过1500个粒子,物理步长为16ms,会导致帧速率下降到30以下,甚至更糟。粒子渲染无法在不丢失功能的情况下再进行优化,因此我决定尝试将OpenGL移动到第三个线程。我知道这有点极端,但我觉得它应该能够处理

我曾考虑过同时运行两个循环,一个用于主步进(固定时间步),另一个用于绘图(无论速度有多快)。然而,呈现调用传递的数据可能会在每次更新时更改,所以我担心锁定会降低它的速度并抵消它的好处。然而,在实现了一个测试来实现这一点之后,我在不到一秒钟的运行时间之后就获得了EXC_BAD_访问权。我想是因为他们试图在同一时间访问相同的数据?我以为系统会自动处理这个

当我第一次在iPhone上学习OpenGL时,我在主线程上设置了OpenGL,并使用渲染选择器调用performSelectorOnMainThread:withObject:waitUntilDone:,这些错误会在waitUntilDone为false时随时发生。如果这是真的,它有时会随机发生,但有时我可以让它运行30分钟,就可以了。我想这和现在发生的事情是一样的。我在屏幕崩溃之前将第一帧绘制到屏幕上,所以我知道有些东西正在工作


这将如何正确处理,如果是这样,它甚至会提供我所期待的速度?还是多重访问会让它慢下来呢?

1.5k粒子对于iPhone应用来说似乎有点过分了。你有没有考虑过缩小绘制的粒子数?我知道很多,我只是在测试中使用了这么高的数值,但我仍然觉得它应该能够处理。我知道有一些Flash应用程序/游戏可以处理数千个粒子,包括游戏其他部分(包括我写的一些)上的碰撞检测。就算它在电脑上,但它仍然是闪光灯。我更担心的是,我可能会有几个发射器,每次运行100个左右的粒子,并且有了所有我现在没有的额外精灵和几何图形,效果会差不多。phsyics更新(没有碰撞)是没有问题的,即使有5000个粒子和10毫秒的时间步长,只要我不渲染它哈哈。只有撕裂才是一个问题。请参见以下内容: