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

Reply via email to