gpt4 book ai didi

ios - 游戏中的渲染循环

转载 作者:行者123 更新时间:2023-11-28 20:25:31 25 4
gpt4 key购买 nike

我需要通过特定方式在我的应用程序中组织渲染循环(这是有原因的)。

假设我有

Sprite *sprite = [[Sprite alloc] initWithContentsOfFile:@"sprite.png"]; // some sprite

while (true) {
[Graphics update];
sprite.x = (sprite.x + 1) % 1024 // moving sprite by one pixel each frame
[Input update];
[self update];
}

Graphics.update 应该渲染一帧并将执行(不渲染)延迟到下一帧

@interface Graphics () {
static BOOL _frozen;
static int _count;
static int _frameCount;
static float _frameRate;
static double _lastFrameTimestamp;
}

@end

@implementation Graphics

+ (void)initialize {
_frozen = NO
_count = 0
_frameCount = 0
_frameRate = 30.0
_lastFrameTimestamp = CACurrentMediaTime()
}

+ (void)freeze {
_frozen = YES;
}

+ (void)update {
if _frozen
return
end

Video.nextFrame // some OpenGL ES magic to render next frame

_count++

now = CACurrentMediaTime()
waitTill = _lastFrameTimestamp + _count * (1.0 / _frameRate)

if now <= waitTill
sleep(waitTill - now)
else
_count = 0
_lastFrameTimestamp = CACurrentMediaTime()
end

_frameCount++
}

@end

它以某种方式工作并且 Sprite 正在移动。但是当我回到家时 applicationWillResignActive 没有被调用,当我回到应用程序时出现黑屏,一段时间后应用程序崩溃。

这是我尝试移植的东西:https://bitbucket.org/lukas/openrgss/src/7d9228cc281207fe00a99f63b507198ea2596ead/src/graphics.c (Graphics_update 函数)

最佳答案

您可以尝试使用 Core Animation DisplayLink 而不是 while 循环。这就是它通常在图形框架中完成的方式。 currentRunLoop 每 1/60 秒调用一次您的更新方法。

如果使用 NSRunLoop,您应该在更新中删除 sleep 调用。

CADisplayLink *displayLink;

// Set your update method
displayLink = [CADisplayLink displayLinkWithTarget:[Graphics class]
selector:@selector(update)];
// Set fps to device refresh rate (60)
[displayLink setFrameInterval:1.0f];

// Add your display link to current run loop
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

// Stop updating
[displayLink invalidate];

最后一行停止执行,所以在完成循环之前不要调用它。

关于ios - 游戏中的渲染循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14132621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com