ios - CPU & Memory steadily increase & FPS drops all because of vector movement -
my cpu & memory steadily increases on course of 6 minutes during play testing of current sprite kit game. i've found method '-(void)walktoward:(cgpoint)targetposition' inside player class responsible (it moves character tapped location on screen), don't understand why. game orthogonal no gravity. player class initialized in skscene called tesmap. here code inside player class:
player.h
#import <spritekit/spritekit.h> #import "characterwalking.h" @interface player : characterwalking //player movement stuff. @property nstimeinterval lastupdatetime; //keep track of last time update: called. @property nstimeinterval dt; //keep track of delta time since last update. @property cgpoint velocity; //cgpoints represent positions. however, here it'll represent 2d vector (direction & length) instead. @property cgpoint touchlocation; //where player move to. @property cgpoint lasttouchlocation; //will keep track of last position. @property bool walking; //will either stop or begin walking animation. @property float distance; -(void)walktoward:(cgpoint)targetposition; -(void)facecurrentdirection; -(void)gps:(cftimeinterval)ct; @end
player.m
-(void)gps:(nstimeinterval)ct { //keeps track of update methods update function: actual update timing different/inexact every time. if (self.lastupdatetime) { _dt = ct - _lastupdatetime; //calculate time since last call update: & store in _dt. } else { _dt = 0; } _lastupdatetime = ct; //nslog(@"%0.2f milliseconds since last update", _dt * 1000); //log time in milliseconds (1 second = 1000 milliseconds). /*distance: fundamental tracking charatcer's last position*/ cgpoint offset = cgpointsubtract(_lasttouchlocation, self.position); //distance between previous location & current player position. _distance = cgpointlength(offset); //converts cgpoint cgfloat if statement. if (_distance < 50 * _dt) { _walking = no; self.position = _lasttouchlocation; self.physicsbody.velocity = cgvectormake(0, 0); [self facecurrentdirection]; //update texture. } } -(void)facecurrentdirection { //some direction facing code in here. } //this problem seems hide. -(void)walktoward:(cgpoint)targetposition { _walking = yes; cgpoint targetvector = cgpointnormalize(cgpointsubtract(targetposition, self.position)); //gets distance between point & b. targetvector = cgpointmultiplyscalar(targetvector, 50); //50 interpreted speed: larger # faster player moves. //commented out. player can't move now. cpu & memory not steadily increasing... wtf //self.physicsbody.velocity = cgvectormake(targetvector.x, targetvector.y); //velocity vector measured in meters per second. [self facecurrentdirection]; } -(instancetype)init { //bla bla bla //just code here sets player character. _walking = no; } return self; }
here how looks inside skscene/map:
testmap.h
//#import more bla bla bla #import "player.h" @interface testscene1 : skscene //bla bla bla @property player *player; //bla bla bla @end
testmap.m
-(void)touchesbegan:(nsset *)touches withevent:(uievent *)event { uitouch *touch = [touches anyobject]; _player.touchlocation = [touch locationinnode:_worldnode]; _player.lasttouchlocation = _player.touchlocation; //save previous position. [_player walktoward:_player.touchlocation]; //tells player sprite move toward location of user’s tap. } -(void)update:(nstimeinterval)currenttime { /*called before each frame rendered*/ [_player gps:currenttime]; }
i can't understand why 'physicsbody.velocity' within player class influencing cpu & memory increase. game starts @ 60 fps after 6 minutes fps drops anywhere between 30 15. if nobody knows why happening, can show me how set vector movement player class?
i have figured out own problem. during character movement through touch, skscene's -(void)update:(nstimeinterval)currenttime method runs characters class method [_player gps:currenttime]; tracks speed , distance. here's hiccup, method sets character texture according direction facing. every frame same texture continues placed character flooding memory repetitive textures. had put conditional stop texture setting method while character standing wouldn't called every frame called once.
Comments
Post a Comment