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

, если я запустил игру, а затем провел большим и большим пальцем по этой палке (дико поворачиваясь от 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;
}
}
}