jjzjj

ios - 对 "InputModeProperties.plist"的数百次访问滞后于我的游戏 (iPhone)

coder 2023-07-25 原文

我有一个关于 Tiny Wings 错误修复的奇怪问题。在我的游戏中,我使用类似的东西:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];      
[userDefaults setFloat:musicVolume forKey:@"musicVolume"];

用于保存一些偏好和高分表。在游戏结束时出现游戏结束屏幕时,游戏将高分保存到标准用户默认值。在游戏显示如下 UIAlertView 之前它运行良好:

UIAlertView *alert = [[UIAlertView alloc] init];
[alert setTitle:@"Get ready!"];
[alert setDelegate:self];
[alert addButtonWithTitle:@"Ok"];
[alert show];
[alert release];

每次游戏将内容保存到标准用户默认值时 AlertView 消失后,游戏会滞后一段时间(在某些设备上会滞后几秒钟)。在游戏使用 UITextField 输入玩家名称后也会发生这种情况。在使用两个 UIKit 元素之一之前,游戏中没有任何延迟,但在使用它们之后,游戏会延迟,直到我重新启动应用程序。我已经用 Performance Tools 分析了问题,“I/O Activity”Instrument 显示有数百次“打开 - 读取 - 关闭”访问

/System/Library/Frameworks/UIKit.framework/InputModeProperties.plist

这会导致延迟。

我完全不知道该怎么做。有什么想法吗?

编辑:
苹果开发者论坛中有一个帖子http://devforums.apple.com/message/424374#424374有人有同样的问题,似乎它只出现在 iOS 4.3 中。我已经对其进行了测试,延迟只发生在我的 4.3 设备上(而不是在 3.1 iPod Touch 和 4.2 iPad 上)。

最佳答案

编辑

不错的错误解决方法:

简短版本:只是延迟错误触发调用,直到用户不生气为止。

长版:

因为我认为问题来自 [NSUserDefaults standardUserDefaults] 调用,这会触发脏 plist 加载循环 AFTER 某些操作请求键盘布局(如 UIAlert)...

我建议在应用加载时调用 [NSUserDefaults standardUserDefaults] 一次(任何导致错误的调用之前),并保持在所有应用程序生命周期中单例类中返回的引用。我不认为内存占用会很大......(我在几个没有任何问题的应用程序中这样做)。更糟糕的是,plist load*100 只会在应用程序加载时执行一次,而不是在游戏期间执行。

如果问题来自 [userDefaults setXxxx:...] 调用,同样的解决方法,您可以只保留值以保存在内存中,稍后在 userDefaults 中设置它们,就像就在同步之前他们...但是如果出现任何问题,比如崩溃,就有丢失信息的风险。我个人更喜欢在每次设置之后sync以确保数据完整性...

ENDOFEDIT


简短的回答:iOS4.3 错误,很少有机会找到解决方法...报告错误并等待下一次 iOS 更新...2 周后的 WWDC...1~2 个月。

长的:

在查看了 UIKit 的组装后,这是我的猜测:

  • InputModeProperties.plist 包含按区域设置的所有键盘布局的列表。
  • UIKit 将其用于多种用途,例如显示键盘时,以确定可用的键盘布局。 (语言环境...)
  • 有一件事很有趣,我们可以在 NSUserDefaults 中找到它的一些信息:

    NSLog(@"%@", [[NSUserDefaults standardUserDefaults] dictionaryRepresentation]);
    ==> {
    AppleKeyboards =     (          // I have two keyboard in preferences
       "fr_FR@hw=French;sw=AZERTY", // french  first
       "en_US@hw=US;sw=QWERTY"      // english second
    );
    ...
    
  • 但与您的分数不同,这些信息并未存储在应用首选项中。 ( NSGlobalDomain, or more likely Separate domains for each of the user’s preferred languages )
  • 所以我不会对 UIKit + NSUserDefaults 中存在导致脏 plist 加载循环的冲突(错误)感到惊讶。
  • 你说大约有 100 个电话?这类似于 plist 中语言环境/布局的数量!

NSUserDefaults 中没有可用的键盘时...(就像在同步之后,让我们想象一个这样做的错误)... UIKit 可以尝试所有可用的键盘来确定用户一,肮脏地解析这个 4.4K plist 一百次......就像在显示 UIAlertView 时......在 NSUSerDefault 同步/更改之后。

谁知道呢?拥有源代码的 Apple 人员 :)

我不会惊讶地去偏好设置键盘而不是默认的美国然后恢复到美国会解决这个问题。对你的情况没用,但会确认这个问题。看到另一个 4.3 错误...

正如其他人所说,不使用 NSUserDefaults 而是在/Documents 中使用一个简单的自定义 plist 可能是一个(不)体面的解决方法。

Tiny Wings 很棒! :)

关于ios - 对 "InputModeProperties.plist"的数百次访问滞后于我的游戏 (iPhone),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6024245/

有关ios - 对 "InputModeProperties.plist"的数百次访问滞后于我的游戏 (iPhone)的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  5. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  6. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  9. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  10. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

随机推荐