вращение изображения в прикосновенияхПеремещение перемещения вперед и назад с помощью CGAffineTransformMakeRotation снижает частоту кадров вдвое - PullRequest
2 голосов
/ 29 мая 2011

в 3D-игре, после оптимизации я набрал 60fps на iPad2, основной цикл запуска находится во вторичном потоке, со встроенным интерфейсом построителя интерфейса в главном потоке (этот вопрос касается пользовательского интерфейса основного потока)

У меня есть два контроллера, дроссельная заслонка и палка для крена в пользовательском интерфейсе, который использует сенсорное взаимодействие, вы можете увидеть палку на этом изображении ниже.

она имеет вращательное движение180 градусов, как вы можете себе представить из этого изображения

enter image description here

, если я запустил игру, а затем провел большим и большим пальцем по этой палке (дико поворачиваясь от 0 градусов к-180 градусов) fps падает до 33fps вместо 60fps ..

просто комментируя эту строку ниже из приведенного ниже списка кода, возвращает fps обратно до 60fps (я вытираю большим пальцем и игра делает этокатится, но изображение этой флешки, конечно, не движется), поэтому можно играть в игру на полную частоту кадров без обновления изображения этой флешки (показывая, что это именно эта рутинав одиночку) это обновление и преобразование изображения с помощью этого метода сильно влияет на мой fps.см. этот код ниже, как вы думаете, есть ли способ обойти это снижение производительности?(в противном случае мне понадобится какая-то общая круглая область с кругом, представляющим область касания, чтобы дать представление о крене, который вы видите в некоторых играх, как, я думаю, бесконечное лезвие ... но я бы предпочел иметь это интерактивное изображениепоказывая истинную цель. Вы видите что-то, что мне не хватает? Нужно изменить? было бы лучше?

  joypadCap.transform = CGAffineTransformMakeRotation(touchAngle); //rotation in radians

вот соответствующий код из установленного viewController, "джойстик" являетсяНа изображении, которое вы видите выше, дроссель - это другое изображение, и он влияет на частоту кадров, но не в такой степени, как вышеупомянутый одиночный вызов, потому что дроссель просто перемещает изображение в правильное место и не использует эту CGAffineTransformMakeRotation. Но эта операция делаетуменьшите частоту кадров примерно на 8 кадров в секунду.

@interface stickController : UIViewController
{
    IBOutlet UIImageView *throttleStickCap;
    IBOutlet UIImageView *joypadCap;
etc......

@implementation stickController

@synthesize frontViewButton, backViewButton, leftViewButton, rightViewButton, upViewButton, gunSight;

//------------------------------------------------------------------------------------
- (void)viewDidLoad
{
NSLog(@"viewDidLoad");
    [super viewDidLoad];
    throttleStick = throttleStickCap.frame;
    throttleStickCenterx = throttleStickCap.center.x;
    throttleStickCentery = throttleStickCap.center.y;
    throttleStickMax = 72.0f;
    throttleStickMin = -7.0f;

    joypad = joypadCap.frame;
    joypadCenterx = joypadCap.center.x;
    joypadCentery = joypadCap.center.y;
    joypadMax = 50.0f;
    joypadMin = -50.0f;

    theStickController = self;
}

//------------------------------------------------------------------------------------
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSSet *allTouches = [event allTouches];
    for (UITouch *touch in allTouches)
    {
        CGPoint touchLocation = [touch locationInView:self.view];

        if (CGRectContainsPoint(throttleStick, touchLocation))
        {
            throttleStickTouchHash = [touch hash];
        }

        if (CGRectContainsPoint(joypad, touchLocation))
        {
            joypadTouchHash = [touch hash];

            CGPoint touchLocation = [touch locationInView:self.view];
            float dx = touchLocation.x - (float)joypadCenterx;
            float dy = touchLocation.y - (float)joypadCentery;

            distance = sqrtf(powf(dx, 2.0f) + powf(dy, 2.0f));

            if (distance > joypadMax)
            {
                enoughDistance = shootDistance;
                createBulletSet();
            }
        }
    }
}

//------------------------------------------------------------------------------------
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSSet *allTouches = [event allTouches];

    for (UITouch *touch in allTouches)
    {
        if ([touch hash] == throttleStickTouchHash)
        {
            CGPoint touchLocation = [touch locationInView:self.view];

            distance = throttleStickCentery - touchLocation.y;

            if (distance > throttleStickMax)
            {
                throttleStickCap.center = CGPointMake(throttleStickCenterx, throttleStickCentery - throttleStickMax);
                throttle = throttleStickMax;
            }
            else if (distance < throttleStickMin)
            {
                throttleStickCap.center = CGPointMake(throttleStickCenterx, throttleStickCentery - throttleStickMin);
                throttle = throttleStickMin;
            }
            else
            {
                throttleStickCap.center = CGPointMake(throttleStickCap.center.x, touchLocation.y);
                throttle = distance;
            }
            throttle *= .10;
            throttleStick = throttleStickCap.frame;
        }

        if ([touch hash] == joypadTouchHash)
        {
            CGPoint touchLocation = [touch locationInView:self.view];
            float dx = touchLocation.x - (float)joypadCenterx;
            float dy = touchLocation.y - (float)joypadCentery;

            distance = sqrtf(powf(dx, 2.0f) + powf(dy, 2.0f));

            if (distance > joypadMax) createBulletSet();
                else enoughDistance = shootDistance;

            if (dx > joypadMax) roll = joypadMax;
                else if (dx < joypadMin) roll = joypadMin;
                else roll = dx;

            joypad = joypadCap.frame;

            touchAngle = atan2(dy, dx) + 1.570796;

            if ((dx < 0.0f) && (dy > 0.0f)) touchAngle = -1.570796;
            else if ((dx > 0.0f) && (dy > 0.0f)) touchAngle = 1.570796;

    //      joypadCap.transform = CGAffineTransformMakeRotation(touchAngle); //rotation in radians
        }
    }
}

//------------------------------------------------------------------------------------
- (void)forceTouchesEnd
{
    throttleStickMoving = NO;
    throttleStickTouchHash = 0;
    throttle = 0.0f;
    throttleStickCap.center = CGPointMake(throttleStickCenterx, throttleStickCentery);
    throttleStick = throttleStickCap.frame;

    joypadMoving = NO;
    joypadTouchHash = 0;
    roll = 0.0f;
    joypadCap.transform = CGAffineTransformMakeRotation(0.0f); //rotation in radians
    joypad = joypadCap.frame;
}

//------------------------------------------------------------------------------------
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    for (UITouch *touch in touches)
    {
        if ([touch hash] == throttleStickTouchHash)
        {
            throttleStickTouchHash = 0;
        }

        if ([touch hash] == joypadTouchHash)
        {
            joypadTouchHash = 0;
            roll = 0.0f;

            joypad = joypadCap.frame;

            return;
        }
    }
}
...