Author: filipzelic
Date: Fri Jul 10 19:14:06 2015
New Revision: 38785
URL: http://svn.gna.org/viewcvs/gnustep?rev=38785&view=rev
Log:
Calculating delay before next frame needs to be rendered.
Modified:
libs/quartzcore/trunk/ChangeLog
libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h
libs/quartzcore/trunk/Source/CAAnimation.m
libs/quartzcore/trunk/Source/CAImplicitAnimationObserver.m
libs/quartzcore/trunk/Source/CALayer+FrameworkPrivate.h
libs/quartzcore/trunk/Source/CALayer.m
libs/quartzcore/trunk/Source/CARenderer.m
libs/quartzcore/trunk/Tests/hello_animation.m
Modified: libs/quartzcore/trunk/ChangeLog
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/ChangeLog?rev=38785&r1=38784&r2=38785&view=diff
==============================================================================
--- libs/quartzcore/trunk/ChangeLog (original)
+++ libs/quartzcore/trunk/ChangeLog Fri Jul 10 19:14:06 2015
@@ -1,19 +1,33 @@
+2015-07-09 Filip Zelic <[email protected]>
+
+ * Headers/QuartzCore/CARenderer.h:
+ * Source/CAAnimation.m:
+ * Source/CAImplicitAnimationObserver.m:
+ * Source/CALayer+FrameworkPrivate.h:
+ * Source/CALayer.m:
+ * Source/CARenderer.m:
+ Now renderer can calculate delay before next frame needs to be rendered.
+
+ * Tests/hello_animation.m:
+ Animations updated to use method nextFrameTime to render only as needed
+ instead 60 frames per second.
+
2015-07-02 Filip Zelic <[email protected]>
- * Headers/QuartzCore/CAAnimation.h
- * Headers/QuartzCore/CALayer.h
- * Headers/QuartzCore/CARenderer.h
- * Source/CAAnimation+FrameworkPrivate.h
- * Source/CAAnimation.m
- * Source/CALayer+FrameworkPrivate.h
- * Source/CALayer.m
- * Source/CARenderer+FrameworkPrivate.h
- * Source/CARenderer.m
+ * Headers/QuartzCore/CAAnimation.h:
+ * Headers/QuartzCore/CALayer.h:
+ * Headers/QuartzCore/CARenderer.h:
+ * Source/CAAnimation+FrameworkPrivate.h:
+ * Source/CAAnimation.m:
+ * Source/CALayer+FrameworkPrivate.h:
+ * Source/CALayer.m:
+ * Source/CARenderer+FrameworkPrivate.h:
+ * Source/CARenderer.m:
Layers and animations now can notify renderer about changes that
- have influence on the next frame time
-
- * Tests/hello_animation.m
- Added delegation method that is notified when next frame time changes
+ have influence on the next frame time.
+
+ * Tests/hello_animation.m:
+ Added delegation method that is notified when next frame time changes.
2012-10-18 Ivan VuÄica <[email protected]>
Modified: libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h?rev=38785&r1=38784&r2=38785&view=diff
==============================================================================
--- libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h (original)
+++ libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h Fri Jul 10
19:14:06 2015
@@ -65,6 +65,7 @@
CFTimeInterval _firstRender;
CFTimeInterval _currentTime;
CFTimeInterval _nextFrameTime;
+ BOOL _takeNoteThatNextFrameTimeChangeIsExecuting;
NSMutableArray * _rasterizationSchedule;
Modified: libs/quartzcore/trunk/Source/CAAnimation.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CAAnimation.m?rev=38785&r1=38784&r2=38785&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CAAnimation.m (original)
+++ libs/quartzcore/trunk/Source/CAAnimation.m Fri Jul 10 19:14:06 2015
@@ -74,6 +74,7 @@
}
[_layers addPointer:layer];
+ [self takeNoteThatNextFrameTimeChanged];
}
- (void) handleRemovedFromLayer: (CALayer *)layer
@@ -83,6 +84,8 @@
if(layer == [_layers pointerAtIndex: index])
[_layers removePointerAtIndex: index];
}
+
+ [self takeNoteThatNextFrameTimeChanged];
}
- (void) takeNoteThatNextFrameTimeChanged
Modified: libs/quartzcore/trunk/Source/CAImplicitAnimationObserver.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CAImplicitAnimationObserver.m?rev=38785&r1=38784&r2=38785&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CAImplicitAnimationObserver.m (original)
+++ libs/quartzcore/trunk/Source/CAImplicitAnimationObserver.m Fri Jul 10
19:14:06 2015
@@ -85,6 +85,13 @@
[[CATransaction topTransaction] registerAction: action
onObject: object
keyPath: keyPath];
+
+ // TODO: Remove once implicit animations are properly integrated into
NSRunLoop.
+ if ([object isKindOfClass: [CALayer class]])
+ {
+ CALayer * layer = (CALayer *)object;
+ [layer takeNoteThatNextFrameTimeChanged];
+ }
}
@end
Modified: libs/quartzcore/trunk/Source/CALayer+FrameworkPrivate.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CALayer%2BFrameworkPrivate.h?rev=38785&r1=38784&r2=38785&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CALayer+FrameworkPrivate.h (original)
+++ libs/quartzcore/trunk/Source/CALayer+FrameworkPrivate.h Fri Jul 10
19:14:06 2015
@@ -42,6 +42,7 @@
- (void) discardPresentationLayer;
- (CFTimeInterval) applyAnimationsAtTime: (CFTimeInterval)time;
+- (CFTimeInterval) calculatedNextFrameTime;
- (CFTimeInterval) activeTime;
- (CFTimeInterval) localTime;
Modified: libs/quartzcore/trunk/Source/CALayer.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CALayer.m?rev=38785&r1=38784&r2=38785&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CALayer.m (original)
+++ libs/quartzcore/trunk/Source/CALayer.m Fri Jul 10 19:14:06 2015
@@ -932,6 +932,7 @@
/* Just make use of convertTime:toLayer: instead of reimplementing */
return [layer convertTime: theTime toLayer: self];
}
+
- (CFTimeInterval) convertTime: (CFTimeInterval)theTime toLayer: (CALayer
*)layer
{
/* Method used to convert 'activeTime' of self into 'activeTime'
@@ -954,27 +955,52 @@
/* layer was one of our ancestors? great! */
if (layer == l)
return theTime;
-
+
/* For each layer, we invert the formula in -activeTime. */
theTime -= [l timeOffset];
theTime /= [l speed];
theTime += [l beginTime];
}
-
+
if (layer == nil)
{
/* We were requested time in "media time" timespace. */
return theTime;
}
-
+
/* Use activeTime/localTime mechanism to convert media time into
layer time */
CFTimeInterval oldFrameBeginTime = currentFrameBeginTime;
currentFrameBeginTime = theTime;
theTime = [layer activeTime];
currentFrameBeginTime = oldFrameBeginTime;
-
+
return theTime;
+}
+
+- (CFTimeInterval) calculatedNextFrameTime
+{
+ CFTimeInterval lowestNextFrameTime = __builtin_inf();
+
+ for (NSString * animationKey in [self animationKeys])
+ {
+ CAAnimation * animation = [_animations objectForKey: animationKey];
+
+ CFTimeInterval nextFrameTime = [animation beginTime];
+ nextFrameTime = [self convertTime: nextFrameTime toLayer: nil];
+
+ if(nextFrameTime < lowestNextFrameTime)
+ lowestNextFrameTime = nextFrameTime;
+ }
+
+ for (CALayer * sublayer in [self sublayers])
+ {
+ CFTimeInterval nextFrameTime = [sublayer calculatedNextFrameTime];
+ if (nextFrameTime < lowestNextFrameTime)
+ lowestNextFrameTime = nextFrameTime;
+ }
+
+ return lowestNextFrameTime;
}
/* *************** */
Modified: libs/quartzcore/trunk/Source/CARenderer.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CARenderer.m?rev=38785&r1=38784&r2=38785&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CARenderer.m (original)
+++ libs/quartzcore/trunk/Source/CARenderer.m Fri Jul 10 19:14:06 2015
@@ -64,6 +64,7 @@
atTime: (CFTimeInterval)theTime;
- (void) _renderLayer: (CALayer *)layer
withTransform: (CATransform3D)transform;
+- (void) calculateNewNextFrameTime;
- (id) initWithNSOpenGLContext: (NSOpenGLContext*)ctx
options: options;
@end
@@ -89,7 +90,15 @@
- (void) takeNoteThatNextFrameTimeChanged
{
+ [self calculateNewNextFrameTime];
+ if (_takeNoteThatNextFrameTimeChangeIsExecuting)
+ {
+ return;
+ }
+
+ _takeNoteThatNextFrameTimeChangeIsExecuting = YES;
[self.delegate nextFrameTimeDidChange];
+ _takeNoteThatNextFrameTimeChangeIsExecuting = NO;
}
/* *** class methods *** */
@@ -835,13 +844,18 @@
{
[self _rasterize: rasterizationSpec];
}
-
+
/* Release rasterization schedule */
[_rasterizationSchedule release];
_rasterizationSchedule = nil;
}
-
+- (void) calculateNewNextFrameTime
+{
+ CFTimeInterval newNextFrameTime = [_layer calculatedNextFrameTime];
+ if (newNextFrameTime < _nextFrameTime)
+ _nextFrameTime = newNextFrameTime;
+}
@end
Modified: libs/quartzcore/trunk/Tests/hello_animation.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Tests/hello_animation.m?rev=38785&r1=38784&r2=38785&view=diff
==============================================================================
--- libs/quartzcore/trunk/Tests/hello_animation.m (original)
+++ libs/quartzcore/trunk/Tests/hello_animation.m Fri Jul 10 19:14:06 2015
@@ -418,7 +418,7 @@
[[self openGLContext] flushBuffer];
- _timer = [NSTimer scheduledTimerWithTimeInterval: 1./60 //[_renderer
nextFrameTime]-CACurrentMediaTime()
+ _timer = [NSTimer scheduledTimerWithTimeInterval: [_renderer
nextFrameTime]-CACurrentMediaTime()
target: self
selector: @selector(timerAnimation:)
userInfo: nil
@@ -427,7 +427,25 @@
-(void) nextFrameTimeDidChange
{
+ CFTimeInterval currentTime = CACurrentMediaTime();
+ NSLog(@"Current time %g", currentTime);
NSLog(@"GSCARendererDelegate - next frame time did change: next frame time
is %g", [_renderer nextFrameTime]);
+
+ // TODO: Remove once implicit animations are properly integrated into
NSRunLoop.
+ if ([[CATransaction topTransaction] isImplicit])
+ {
+ [CATransaction commit];
+ }
+
+ if (isinf([_renderer nextFrameTime]) || [_renderer nextFrameTime] <
currentTime)
+ {
+ [_timer invalidate];
+ _timer = [NSTimer scheduledTimerWithTimeInterval: [_renderer
nextFrameTime]-currentTime
+ target: self
+ selector:
@selector(timerAnimation:)
+ userInfo: nil
+ repeats: NO];
+ }
}
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs