Ios 性能问题UIKit徒手绘图
我已经皈依了 但我的iPad Air有一些性能问题。它在iphone6上运行良好(FPS方面),但iPad的性能却很差!有没有可能通过改变触摸屏来提高iPad的性能?我已尝试仅使用选项初始化UIGraphicsBeginImageContextWithOptions。。。在接触中,没有运气 任何想法都很感激Ios 性能问题UIKit徒手绘图,ios,uiimage,uikit,grand-central-dispatch,uibezierpath,Ios,Uiimage,Uikit,Grand Central Dispatch,Uibezierpath,我已经皈依了 但我的iPad Air有一些性能问题。它在iphone6上运行良好(FPS方面),但iPad的性能却很差!有没有可能通过改变触摸屏来提高iPad的性能?我已尝试仅使用选项初始化UIGraphicsBeginImageContextWithOptions。。。在接触中,没有运气 任何想法都很感激 override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { increm
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
incrementalImage = UIImage()
ctr = 0
bufIdx = 0
if let touch = touches.first as? UITouch{
pts[0] = touch.locationInView(self)
isFirstTouchPoint = true
}
}
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
if let touch = touches.first as? UITouch{
if !isBusy {
var p: CGPoint = touch.locationInView(self)
self.ctr++
self.pts[self.ctr] = p
if self.ctr == 4 {
self.pts[3] = CGPointMake((self.pts[2].x + self.pts[4].x) / 2.0, (self.pts[2].y + self.pts[4].y) / 2.0)
for var i = 0; i < 4; i++ {
self.pointsBuffer[self.bufIdx+i] = self.pts[i]
}
self.bufIdx += 4
var bounds: CGRect = self.bounds
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
var offsetPath = UIBezierPath()
if self.bufIdx == 0 {
return}
var ls = [LineSegment](count: 4, repeatedValue: LineSegment())
for var i = 0; i < self.bufIdx; i+=4{
if self.isFirstTouchPoint{
ls[0] = LineSegment(firstPoint: self.pointsBuffer[0], secondPoint: self.pointsBuffer[0])
offsetPath.moveToPoint(ls[0].firstPoint)
self.isFirstTouchPoint = false
}
else{
ls[0] = self.lastSegmentOfPrev!
}
var frac1:CGFloat = self.FF/(self.clamp(self.len_sq(self.pointsBuffer[i], p2: self.pointsBuffer[i+1]),lower: self.LOWER,higher: self.UPPER))
var frac2:CGFloat = self.FF/(self.clamp(self.len_sq(self.pointsBuffer[i+1], p2: self.pointsBuffer[i+2]),lower: self.LOWER,higher: self.UPPER))
var frac3:CGFloat = self.FF/(self.clamp(self.len_sq(self.pointsBuffer[i+2], p2: self.pointsBuffer[i+3]),lower: self.LOWER,higher: self.UPPER))
ls[1] = self.lineSegmentPerpendicularTo(LineSegment(firstPoint: self.pointsBuffer[i],secondPoint: self.pointsBuffer[i+1]), fraction: frac1)
ls[2] = self.lineSegmentPerpendicularTo(LineSegment(firstPoint: self.pointsBuffer[i+1],secondPoint: self.pointsBuffer[i+2]), fraction: frac2)
ls[3] = self.lineSegmentPerpendicularTo(LineSegment(firstPoint: self.pointsBuffer[i+2],secondPoint: self.pointsBuffer[i+3]), fraction: frac3)
offsetPath.moveToPoint(ls[0].firstPoint)
offsetPath.addCurveToPoint(ls[3].firstPoint, controlPoint1: ls[1].firstPoint, controlPoint2: ls[2].firstPoint)
offsetPath.addLineToPoint(ls[3].secondPoint)
offsetPath.addCurveToPoint(ls[0].secondPoint, controlPoint1: ls[2].secondPoint, controlPoint2: ls[1].secondPoint)
offsetPath.closePath()
self.lastSegmentOfPrev = ls[3]
}
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.mainScreen().scale)
var rectpath: UIBezierPath = UIBezierPath(rect: self.bounds)
UIColor.clearColor().setFill()
rectpath.fill()
if self.incrementalImage != nil{
self.incrementalImage!.drawAtPoint(CGPointZero)
UIColor.blackColor().setStroke()
UIColor.blackColor().setFill()
offsetPath.stroke()
offsetPath.fill()
self.incrementalImage = UIGraphicsGetImageFromCurrentImageContext()
offsetPath.removeAllPoints()
}
UIGraphicsEndImageContext()
dispatch_async(dispatch_get_main_queue()) {
self.bufIdx = 0
self.setNeedsDisplay()
}
self.isAwaitingPlay = true
}
self.pts[0] = self.pts[3];
self.pts[1] = self.pts[4];
self.ctr = 1;
}
}
}
}
struct LineSegment
{
var firstPoint:CGPoint = CGPointZero
var secondPoint:CGPoint = CGPointZero
}
func len_sq(p1:CGPoint,p2:CGPoint)->CGFloat{
var dx = p2.x - p1.x
var dy = p2.y - p1.y
return dx*dx + dy*dy
}
func clamp(value:CGFloat,lower:CGFloat,higher:CGFloat)->CGFloat{
if value<lower{ return lower}
if value>higher{return higher}
return value
}
override func touchsbegined(touchs:Set,withEvent-event:UIEvent){
增量图像=UIImage()
ctr=0
bufIdx=0
如果让触摸=触摸。首先作为?UITouch{
pts[0]=触摸位置查看(自)
isFirstTouchPoint=true
}
}
覆盖功能触摸移动(触摸:设置,withEvent事件:UIEvent){
如果让触摸=触摸。首先作为?UITouch{
如果我很忙{
变量p:CGPoint=touch.locationInView(自)
自我中心++
self.pts[self.ctr]=p
如果self.ctr==4{
self.pts[3]=CGPointMake((self.pts[2].x+self.pts[4].x)/2.0,(self.pts[2].y+self.pts[4].y)/2.0)
对于变量i=0;i<4;i++{
self.pointsBuffer[self.bufIdx+i]=self.pts[i]
}
self.bufIdx+=4
变量边界:CGRect=self.bounds
调度异步(调度获取全局队列(调度队列优先级默认为0)){
var offsetPath=UIBezierPath()
如果self.bufIdx==0{
返回}
变量ls=[LineSegment](计数:4,repeatedValue:LineSegment())
对于变量i=0;iCGFloat{
变量dx=p2.x-p1.x
变量dy=p2.y-p1.y
返回dx*dx+dy*dy
}
func钳位(值:CGFloat,下限:CGFloat,上限:CGFloat)->CGFloat{
如果值更高{返回更高}
返回值
}
你解决了这个问题吗?你解决了吗?