草庐IT

objective-c - 仅适用于新 iPad 3 : wait_fences: failed to receive reply: 10004003

coder 2024-01-27 原文

所以我知道有很多关于此的问题,但据我所知,这是一个独特的情况,所以我想我会发布它。希望这将添加一些信息,最终可以让我们回答为什么会发生这种情况。我收到错误:wait_fences:无法收到回复:10004003,当我的设备旋转时。我的观点的动画是从以下开始的:
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
我只在新 iPad 3 上遇到错误。我在原始 iPad 和低至 3GS 的 iPhone 上使用了完全相同的程序。它们都没有出现 wait_fences 错误,而且它们的旋转速度都比 iPad 3 快。

我几乎只使用 Core Graphics 来绘制 View 。我还确保它们在调整大小时重新绘制,所以我不会得到像素化的 View 。如果我在调整大小时禁用重绘,则不会出现此错误(但会出现拉伸(stretch) View )。如果我完全禁用核心图形绘制,则不会出现错误(但是,当然,我会看到黑色 View )。

我使用了 Time Profiler,发现问题主要在于绘制渐变:


我已经修改了代码来填充而不是绘制渐变,这确实缓解了这个问题。我会说渐变是问题,除非我在其他情况下(除了响应旋转)做这些动画并且它工作得很好。

我还想指出,我特别注意确保我只对实际出现在屏幕上的 View 进行动画处理。我知道屏幕外的动画 View 有时会导致发生此错误。

我没有包含动画代码

关于为什么会发生这种情况的任何想法?特别是因为它只发生在 iPad 3 上?

对于那些会问的人,这是执行动画的代码。它通常会被包裹在一个 UIView 动画 block 中。

- (void) setFramesForFocusView:(CustomControl *)focusView atX:(CGFloat)x showInput:(BOOL)showInput{
    CGSize bSize = self.bounds.size;
    CGRect fRect = focusView.frame;
    fRect.size.width = bSize.width;

    CGRect iRect;
    if (focusView.inputViewIsSystemKeyboard){
        if (_keyboardRect.origin.y < 0 || _keyboardRect.origin.y >= CGRectGetMaxY(self.bounds) || CGRectIsEmpty(_keyboardRect) || CGRectGetMaxY(_keyboardRect) > CGRectGetMaxY(self.bounds)) return;
        iRect = _keyboardRect;
    } else {
        iRect = (focusView.inputUIView && showInput) ? CGRectMake(0, bSize.height / 2, bSize.width, bSize.height / 2) : CGRectZero;
    }

    CGRect iaRect = focusView.inputAccessoryUIView.frame;
    CGFloat availableFieldHeight = iRect.origin.y - iaRect.size.height;

    iRect.size.width = bSize.width;
    iaRect.size.width = bSize.width;

    if (!showInput){
        iRect.origin.y = bSize.height;
    }
    iaRect.origin.y = iRect.origin.y - iaRect.size.height;

    iRect.origin.x = x;
    iaRect.origin.x = x;
    focusView.inputUIView.frame = iRect;
    focusView.inputAccessoryUIView.frame = iaRect;

    if (focusView.expandInput){
        fRect.origin.y = 0;
        fRect.size.height = availableFieldHeight;
    } else {
        if (focusView.labelPlacement != LabelPlacementTop && focusView.labelPlacement != LabelPlacementBottom){
            fRect.size.height = _currentView.storedFrame.size.height + [focusView.label.text sizeWithFont:focusView.label.font].height; 
        }
        fRect.origin.y = availableFieldHeight - fRect.size.height;
    }
    if (fRect.size.height > availableFieldHeight){
        fRect.origin.y = 0;
        fRect.size.height = availableFieldHeight;
    }
    fRect.origin.x = x;
    [focusView setLabelPlacement:LabelPlacementTop toFrame:fRect];
}

最佳答案

嗯,这很快。 @RobNapier 是正确的,因为这是一个时间问题。我注释掉了我的动画,哇,后面还有很多其他的动画 View !即使我明确地只对屏幕上的 View 进行动画处理,还有另一个 ViewController 在我的 View 后面接收旋转事件而我……呃……不知道?我的意思是,我应该知道吧?我写了代码。起初我没有意识到,因为我的一组 View 覆盖了整个屏幕。不幸的是,这将需要大量重写。我使用自定义容器 Controller ,现在我发现我需要重新考虑我的实现。很多东西都被不必要地旋转/动画化了。但是哇...回答了很多性能问题....

更新

所以我认为我面临的问题与其他 View Controller 动画的额外 View 有关。然而,虽然这在技术上是正确的,但它并不像我想象的那样真实。通过从窗口中删除整个根 View 层次结构并仅用我想要旋转的 View Controller 替换它,我绝对确保没有其他 View 被动画化。这肯定有帮助,但并不完全。真的,它只是“降低了阈值”,因此我不太可能遇到“wait_fences”错误。尽管在某些情况下,我仍然发现我收到了错误。

我相信我遇到的问题是我使用了 UIScrollView。我的实现管理的 subview 数量可变。具体的view是我自己自定义的一个UIPickerView的实现,可以想象,它管理的view数量会变得非常大。我发现如果这些 subview 变得太多,我就会开始收到“wait_fences”错误。

所以看起来:如果 UIScollView 是动画的,它会为它的所有 subview 设置动画,即使这些 subview 不在屏幕上。 这个很重要。我宁愿怀疑很多正在为这个错误而苦苦挣扎的人可能没有意识到这一点。这些屏幕外 subview 中的每一个都让您更接近于遇到“wait_fences”错误。我的解决方案是“简单的”:我要将 UIScrollView 转换为 UITableView。这意味着要重写大量代码,但至少我知道屏幕外的 subview 将从屏幕上移除,因此不会被动画化。

我还注意到其他一些东西:Core-Graphic Gradients 对你打击很大。如果他们不使用渐变,我可以为更多的屏幕外 View 设置动画。当然,我喜欢渐变并且我不愿意放弃它们(这就是为什么我要重写我的 PickerView)但是要注意它很有趣也很重要。

更新 2

完成将我的 UIScrollView 重写为 tableView,这似乎已经完成了。我没有延迟也没有 wait_fences旋转屏幕时出错。

更新 2

所以是的,点击 wait_fences 容易多了iPad 3 上的错误比任何其他 iPad/iPhone 都差。我已经检查了我所有的代码,确保我永远不会为屏幕上没有的任何东西设置动画,所以这个问题已经解决了。我还是收到了 wait_fences当我使用“重”绘图例程时,iPad 3 上出现错误。我发现的东西让我击中了它:

  • Gradients:渐变确实让 CPU 在视网膜屏幕上工作。
  • 透明度:如果您的 View 不是不透明的,CPU 会努力找出 View 的透明区域。
  • 透明颜色:与 View 透明度不同。这是将透明颜色/渐变叠加在彼此的顶部以获得“效果”,例如光泽,突出任何内容。
  • 纹理:我发现使用纹理使它更有可能击中 wait_fences错误,但没有什么比梯度/透明度更接近。
  • 关于objective-c - 仅适用于新 iPad 3 : wait_fences: failed to receive reply: 10004003,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10938328/

    有关objective-c - 仅适用于新 iPad 3 : wait_fences: failed to receive reply: 10004003的更多相关文章

    1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    2. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

      我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

    3. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

      如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

    4. ruby - inverse_of 是否适用于 has_many? - 2

      当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

    5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

      1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

    6. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

      我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

    7. ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态? - 2

      s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成

    8. ruby - 你会如何在 Ruby 中表达成语 "with this object, if it exists, do this"? - 2

      在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中

    9. ruby - 在 Ruby 中,为什么 Array.new(size, object) 创建一个由对同一对象的多个引用组成的数组? - 2

      如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta

    10. ruby object.hash - 2

      一个对象的散列值是什么意思?在什么情况下两个对象具有相同的哈希值??还有说Array|Hash不能是Hashkeys,这个跟对象的hash值有关系,为什么? 最佳答案 对于要存储在HashMap或哈希集中的对象,必须满足以下条件:如果认为两个对象相等,则它们的哈希值也必须相等。如果两个对象不被认为是相等的,那么它们的哈希值应该很可能不同(两个不同的对象具有相同哈希值的次数越多,对HashMap/集合的操作性能就越差)。因此,如果两个对象具有相同的哈希值,则很有可能(但不能保证)它们相等。上面“相等”的确切含义取决于散列方法的实现者。

    随机推荐