我在游戏中使用java + AndEngine.
在游戏中我有一些冻结,我寻找信息,并找到了如何优化游戏性能的一些步骤:
我遵循了这些步骤,但从来没有在游戏过程中遇到过一些冻结.
现在我在游戏开始之前创建并加载所有纹理并且不卸载它们,这是一个坏主意吗?我如何优化游戏过程?也许我必须在主要活动之前释放所有可能的内存,然后在每个级别之后重新加载它们?
我慢慢地过度工作......
我有一个庞大的应用程序,包括线程,计时器,调用(不是BeginInvoke,因此它是同步的)和Application.DoEvents.
在这里发帖太多了,我不知道问题究竟在哪里.
我的每一种方法都在尝试捕获.记录每个渔获量.
如果我从Visual Studio(F5)启动应用程序或通过Ants进行性能分析,则没有问题.应用程序运行了几天.但是,只要我通过Windows资源管理器启动相同的调试版本,它就会每隔几个小时冻结一次.它会毫无例外地冻结.如果我将visual studio附加到此应用程序并将其分解,它将在Application.Run上停止(new Form1());
我真的很困惑,也不知道要修复它.
这是一个.net 3.5 winforms应用程序
它看起来像一个线程挂在这里:
if (grabber.InvokeRequired)
{
Console.WriteLine("grabber.InvokeRequired");
this.Invoke((MethodInvoker) delegate { grabber.Navigate("http://www.google.de"); }); // <-- hang
}
else
{
grabber.Navigate(ig.StartUrl);
}
Run Code Online (Sandbox Code Playgroud)
此片段是计时器事件的一部分
_timeout = new System.Timers.Timer(10000);
_timeout.Elapsed += new ElapsedEventHandler(OnWatchDogBark);
Run Code Online (Sandbox Code Playgroud)
编辑
DoEvents()的示例.这是在lock()和调用中
grabber.DocumentCompleted -= grabber_DocumentCompleted;
grabber.Navigate("http://www.google.de");
while (grabber.ReadyState != WebBrowserReadyState.Complete)
{
timeout--;
Application.DoEvents();
Thread.Sleep(200);
if (timeout < 0)
{
timeout = 50;
grabber.Navigate("http://www.google.de");
}
}
Run Code Online (Sandbox Code Playgroud)
目前我使用System.Windows.Forms.Timer和一些锁,但没有任何改进.
好吧,我使用WinDbg来获取一些信息
!线程
PreEmptive GC Alloc Lock
ID OSID ThreadOBJ State GC Context Domain Count …Run Code Online (Sandbox Code Playgroud) 我们的应用似乎是半随机挂在psynch_mutexwait.它似乎与更新存储在CoreData中的大量数据的后台进程有关 - 但我完全无法弄清楚是谁锁定导致死锁的原因.
以下是lldb给我的完整堆栈跟踪 - 这显然是不完整的,并且线程1的最后一帧是伪造的.在那之前,我在该方法中有一个断点,它从未被击中过.
是否有任何方法可以确定正在等待什么锁?(或者甚至获得正确的堆栈跟踪?)当然,涉及很多代码,这使得随机NSLog语句成为一项艰巨的任务.
(lldb) bt all
* thread #1: tid = 0x2503, 0x39da20fc libsystem_kernel.dylib`__psynch_mutexwait + 24, stop reason = signal SIGSTOP
frame #0: 0x39da20fc libsystem_kernel.dylib`__psynch_mutexwait + 24
frame #1: 0x39ceb128 libsystem_c.dylib`pthread_mutex_lock + 392
frame #2: 0x00022068 OnDeck`-[AttendanceWorkoutsController buildTable](self=0x00000003, _cmd=0x00000000) + 508 at AttendanceWorkoutsController.m:100
thread #2: tid = 0x2803, 0x39d92648 libsystem_kernel.dylib`kevent64 + 24
frame #0: 0x39d92648 libsystem_kernel.dylib`kevent64 + 24
frame #1: 0x39ccb4f0 libdispatch.dylib`_dispatch_mgr_invoke + 796
thread #5: tid = 0x2b03, 0x39d91eb4 libsystem_kernel.dylib`mach_msg_trap + 20
frame #0: 0x39d91eb4 …Run Code Online (Sandbox Code Playgroud) 当我CGFontCreateWithDataProvider 在飞机模式下拨打电话时,我的应用会冻结.不是飞机模式,它工作正常.字体存储在设备上,不应该发生网络访问.
在调用此方法加载本地字体文件时:
[self registerIconFontWithURL:[[NSBundle mainBundle] URLForResource:@"FontAwesome" withExtension:@"otf"]];
Run Code Online (Sandbox Code Playgroud)
的值url在下面的方法是:
文件:///var/mobile/Applications/48D3DA14-235B-4450-A081-7A6BA6116667/Blah.app/FontAwesome.otf
+ (void)registerIconFontWithURL:(NSURL *)url
{
NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[url path]], @"Font file doesn't exist");
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithURL((__bridge CFURLRef)url);
//******Freezes after the next line******
CGFontRef newFont = CGFontCreateWithDataProvider(fontDataProvider);
//******FROZEN******
CGDataProviderRelease(fontDataProvider);
CFErrorRef error;
CTFontManagerRegisterGraphicsFont(newFont, &error);
CGFontRelease(newFont);
}
Run Code Online (Sandbox Code Playgroud)
iOS 7.1.x,iPhone 5.
我不知道为什么会发生这种情况并且无法找到任何帮助.有没有人知道为什么会发生这种情况?
提前致谢!
那是什么意思?
在一个项目的说明中,它说"冻结Rails宝石".这与冻结Rails版本有什么不同?
什么是冷冻的?
我疯狂地搜索了互联网,但是"WTP冻结"或"Eclipse冻结"产生了许多不同的结果,几乎不可能找到合适的结果.我有以下问题.
在HTML或CSS编辑器中,当我意外地将鼠标悬停在属性值上时,Eclipse会在CPU加载100%时挂起3-4秒,然后生成一个工具提示消息,其中包含有关标记及其属性的一些信息.我不需要那些提示.天哪,我甚至不需要语法着色,如果这会阻止我这个挂起.
我尝试禁用所有自动完成功能,看似相关的所有内容,但这并没有改变一点.我找了一个设置来完全禁用WTP而不卸载它,但是再次 - 没有运气.
我使用Eclipse Helios.我有所有最新的插件.如果需要,我会提供任何其他信息.
有没有人有类似的问题,能够解决它?这真让我疯狂.
BOUNTY
赏金将发送给任何找到方法或解决方法的人,这将使弹出窗口合理快速.我在Eclipse的许多地方遇到过这个问题 - 例如PyDev:
我有强烈的程序感觉,这是弹出窗口的一般问题,而不是WTP/PyDev.以下是我已采取的措施:
我的设置是Ubuntu Natty,Oracle Java 1.6 - repos中的最新版本
进一步发现
好吧,我刚刚发现99%的冻结时间花在了一个org.eclipse.swt.internal.gtk.OS._gtk_widget_realize似乎不对的电话里面.有线索吗?
我鼓励所有遇到过这个问题的人在Eclipse bug跟踪器上投票支持这个bug.
由于Apple已经放弃了Spin Control.app-无响应的状态进程监控和日志记录实用程序 - 我需要更换.
我知道我可以spindump直接使用,但我真的很喜欢它的自动图形前端.
谁能建议一个好的替代品?
我的需求是:按名称自动对我的进程进行采样,并在进程无响应时存储日志.
我最近安装了ubuntu 16.04(自动更新到这个版本),我通常用Java开发,我知道eclipse,所以我安装它,一切都很好.
我配置了所需的一切(Java路径,JDK ......没什么特别的),工作正常,除了Eclipse UI.
每次我创建一个项目时UI都会冻结(虽然项目是正确创建的),每次我运行任何程序时(尽管程序运行正常(不总是正确的xD,但这是我的错)),以及许多其他任务.
知道为什么会这样吗?甚至更好,如何解决?
我还仔细检查了我使用的JRE(因为我发现人们遇到了开源软件的问题),我使用的是oracle的版本(现在还不确定这个名字,抱歉,版本8).它是64位版本的一切.
编辑:我忘了提到我使用火星版.另外,我刚刚安装了NetBeans(8.1),完全相同的问题,然后我认为这是图形驱动程序的问题,再次安装,仍然有同样的问题.不知道现在该尝试什么.
更新:检查日志文件.我觉得没什么奇怪的,但可能会遗漏一些东西:
!SESSION 2015-12-04 13:24:38.930 -----------------------------------------------
eclipse.buildId=4.5.1.M20150904-0015
java.version=1.8.0_66
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=es_ES
Command-line arguments: -os linux -ws gtk -arch x86_64
!ENTRY org.eclipse.core.resources 2 10035 2015-12-04 13:24:40.542
!MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes.
Run Code Online (Sandbox Code Playgroud)
更新2:我只是运行@dan建议的命令.这是结果
"main" #1 prio=6 os_prio=0 tid=0x00007f0ec000a000 nid=0x26e0 runnable [0x00007f0ec9a18000]
java.lang.Thread.State: RUNNABLE
at org.eclipse.swt.internal.gtk.OS._gtk_widget_get_allocation(Native Method)
at org.eclipse.swt.internal.gtk.OS.gtk_widget_get_allocation(OS.java:14234)
at org.eclipse.swt.widgets.Control.getBounds(Control.java:832)
at org.eclipse.jface.fieldassist.ControlDecoration.getDecorationRectangle(ControlDecoration.java:1185)
at org.eclipse.jface.fieldassist.ControlDecoration$3.paintControl(ControlDecoration.java:635)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:230) …Run Code Online (Sandbox Code Playgroud) 对于我的图像处理算法,我使用的是python/OpenCV.我的算法输出应该在同一个窗口一遍又一遍地更新.
然而,有时窗口冻结并且根本不更新,但算法仍在运行并且同时多次更新图片.在这台Ubuntu机器上,窗口变成深灰色.
以下是相关代码的摘录:
for i in range(0,1000):
img = loadNextImg()
procImg = processImg(img)
cv2.imshow("The result", procImg)
cv2.waitKey(1)
Run Code Online (Sandbox Code Playgroud)
注意:processImg()程序大约需要1-2秒.该行在cv2.imshow(procImg)第一个实例中创建窗口(即没有先前的调用)