Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 性能问题UIKit徒手绘图_Ios_Uiimage_Uikit_Grand Central Dispatch_Uibezierpath - Fatal编程技术网

Ios 性能问题UIKit徒手绘图

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

我已经皈依了 但我的iPad Air有一些性能问题。它在iphone6上运行良好(FPS方面),但iPad的性能却很差!有没有可能通过改变触摸屏来提高iPad的性能?我已尝试仅使用选项初始化UIGraphicsBeginImageContextWithOptions。。。在接触中,没有运气

任何想法都很感激

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{
如果值更高{返回更高}
返回值
}

你解决了这个问题吗?你解决了吗?