我使用Cordova为iOS和Android编写了一个混合游戏.这款游戏在iOS和Android上都运行得很好,我几乎准备好发布它,但我只需要制作一些启动画面.完成后,我在两个平台上进行了一次最终测试,结果发现几分钟后Android上的游戏崩溃!它以前从未这样做,我不知道是什么导致它.最新的是我的手机在玩游戏时变得如此热,一段时间后你几乎不能再拿它了(我测得126F).
我只使用两个插件:cordova-plugin-admob-free和cordova-plugin-splashscreen.出于测试目的,我删除了两个以查看它们是否导致崩溃,但崩溃仍然存在.
当使用Cordova(cordova运行android - 设备)构建游戏时崩溃,如果我在PhoneGab Build上构建它并手动安装apk.
我已尝试使用chrome:// inspect进行调试,但我没有看到控制台上出现任何错误.我也跑了
adb logcat
Run Code Online (Sandbox Code Playgroud)
但是日志太复杂了,我无法理解导致崩溃的原因.如果有人想看一下,我已经在这里上传了一份日志副本.游戏的名称是"mygame"(这不是它的名字,但我将其更改为日志文件中的名称).
我不知道如何找出造成这次崩溃的原因.在iOS上,一切都很好.这只是导致此问题的Android.如果您需要更多信息或者我需要更具体,请告诉我您需要的更多信息,我会将其添加到这篇文章中.
编辑2018年8月24日: 我已经能够在另一部Android手机和模拟器上进行测试,并且没有在那里崩溃.我仍然需要弄清楚导致崩溃的原因,因为它是我手机上崩溃的唯一应用程序.我还想知道当我运行它时会导致巨大的电池耗尽.这也是新的.
编辑2018年8月26日: 嗯,更多的Android设备正在经历崩溃.我在我的设备上做了一些测试.我删除了两个Cordova插件(AdMob en SplashScreen)en启动游戏.我让它坐在开始屏幕上,所以在那一点上,还没有创建任何游戏对象,它所做的只是一些简单的计算和一些context.drawImage()调用.一段时间后手机仍会变热并崩溃.可能是context.drawImage()有内存泄漏吗?
编辑2018年8月27日: 我剥离了应用程序,以便在游戏的主循环中只剩下两个drawImage()(和一个requestAnimatonFrame()).一个drawImage()将画布作为源,另一个作为img对象.一段时间后它仍然崩溃.然后我用一个img对象作为源删除了drawImage(),经过一个小时的测试后它仍然没有崩溃.然后我添加了一些drawImage()全部用画布作为源 - 并且没有崩溃.然后我用img对象替换了画布作为源,几分钟后它就崩溃了.所以我认为将img对象作为源的drawImage()导致崩溃是安全的吗?
编辑2018年8月29日: 我在我的代码中更改了所有drawImages()以使用画布作为源.画布仅使用图像填充一次.我第一次跑完比赛时,它并没有崩溃!我以为我已经解决了这个问题,但经过一些测试后我发现它确实崩溃了,但游戏崩溃需要更长的时间.因此,即使这是朝着解决一个很好的一步,但它仍然是没有的解决方案.
编辑2018年8月30日: 我能够通过Android Studio运行游戏,当它崩溃时,调试控制台显示:
E/chromium: [ERROR:gl_fence_egl.cc(55)] Failed to get EGLSync attribute. error code:12300
W/google-breakpad: ### ### ### ### ### ### ### ### ### ### ### ### ###
Chrome build fingerprint:
68.0.3440.91
344009152
### ### ### ### ### ### ### ### ### ### ### ### ###
A/libc: Fatal …Run Code Online (Sandbox Code Playgroud) 我正在运行一个旧的Debian服务器,每天一次通过Perl脚本获取网页.从昨天开始,脚本因"500 SSL协商失败"错误而失败.
use strict;
use LWP::UserAgent;
my $browserObj = LWP::UserAgent->new();
$response = $browserObj->get( "https://www.domain.tld" );
print $response->status_line . "\n" if( ! $response->is_success );
Run Code Online (Sandbox Code Playgroud)
就像我说的,它是一个运行旧版本的旧服务器:
我制作了服务器的快照,以便我可以尝试各种解决方案,如果失败则返回快照.这正是我在每次测试后所做的,返回到原始服务器状态.
测试1: 我尝试的第一件事是将OpenSSL更新为1.0.2d.这没有帮助,我仍然得到"SSL协商失败"错误.然后我更新了Crypt:SSLeay.这完全打破了SSL(导致服务器无法连接到任何安全服务器).
测试2:在 不更新OpenSSL的情况下更新了Crypt :: SSLeay.导致服务器无法再次连接到安全服务器.
测试3:将 OpenSSL更新为1.0.2d.更新了LWP.没有区别.仍有"500 SSL协商失败"
还有什么我可以尝试的吗?
PS:由于几个原因,我无法更新Debian本身.
我有一个大的平面文本文件,其中的行包含名称/值对("varname = value").这些对由多字符分隔符分隔.因此,此文件中的单行可能如下所示:
var1=value1|^|var2=value2|^|var3=value3|^|var4=value4
Run Code Online (Sandbox Code Playgroud)
每行包含大约50个名称/值对.
我需要迭代这个文件的行(大约有100,000行)并将名称/值对存储在一个哈希中,这样
$field{'var1'} = value1
$field{'var2'} = value2
etc...
Run Code Online (Sandbox Code Playgroud)
我做的是这样的:
# $line holds a single line from the file
my @fields = split( /\Q|^|\E/, $line );
foreach my $field (@fields) {
my ($name, $value) = split( /=/, $field );
$hash{$name} = $value;
}
Run Code Online (Sandbox Code Playgroud)
对整个文件的每一行执行此操作需要(在我的PC上)大约2秒钟.这似乎不是很长时间,但我真的想加快这一点.
在这2秒中,第一次分割大约需要0.6秒,而foreach循环大约需要1.4秒.所以我以为我会摆脱foreach循环并把它全部放在一个分裂中:
%hash = split( /\Q|^|\E|=/, $line );
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,以这种方式解析整个文件需要更长的时间!我的问题并不是为什么这需要更长时间(虽然理解为什么会是一个很好的奖励),但我的问题是,是否还有其他(更快)的方法来完成工作.
提前致谢.
------编辑下面这行------
我发现改变了这个:
%hash = split( /\Q|^|\E|=/, $line );
Run Code Online (Sandbox Code Playgroud)
进入这个:
$line =~ s/\Q|^|\E/=/g;
%hash = split( /=/, $line );
Run Code Online (Sandbox Code Playgroud)
使它快三倍!以这种方式解析整个文件现在需要一秒钟......
------这条线下面的片段------
use strict;
use …Run Code Online (Sandbox Code Playgroud) 转换为两个"相同"字符串的大写时,我遇到了一个非常奇怪的问题.该程序正在从网站读取行并将其与存储在文本文件中的行进行比较.如果找不到该行,则将其添加到文件末尾.除非该行包含特殊字符,否则此操作完美.由于某种原因,比较导致不匹配.我通过首先将它们转换为大写来比较两个字符串,这就是它出错的地方.下面是一些代码.我省略了填充两个变量的部分.我只是展示了奇怪的部分.
print "$pageLine <-> $dbLine\n";
print uc( $pageLine ) . " <-> " . uc( $dbLine ) . "\n";
Run Code Online (Sandbox Code Playgroud)
这导致了
Diëtisten <-> Diëtisten
DIëTISTEN <-> DIËTISTEN
Run Code Online (Sandbox Code Playgroud)
请注意,第一个中的ë不会转换为大写.
foreach my $kar (split( //, $pageLine) ) {
print ord($kar) . ":";
}
print "\n";
foreach my $kar (split( //, $dbLine) ) {
print ord($kar) . ":";
}
print "\n";
Run Code Online (Sandbox Code Playgroud)
这导致:
68:105:235:116:105:115:116:101:110:32:40:78:86:68:41:
68:105:235:116:105:115:116:101:110:32:40:78:86:68:41:
Run Code Online (Sandbox Code Playgroud)
有人知道这里发生了什么吗?
提前致谢.
我有一个大约100,000个元素的字符串数组.我需要迭代每个元素并用其他单词替换一些单词.这需要几秒钟的纯perl.我需要尽可能加快速度.我正在测试使用以下代码段:
use strict;
my $string = "This is some string. Its only purpose is for testing.";
for( my $i = 1; $i < 100000; $i++ ) {
$string =~ s/old1/new1/ig;
$string =~ s/old2/new2/ig;
$string =~ s/old3/new3/ig;
$string =~ s/old4/new4/ig;
$string =~ s/old5/new5/ig;
}
Run Code Online (Sandbox Code Playgroud)
我知道这实际上并没有替换测试字符串中的任何内容,但它仅用于速度测试.
我对Inline :: C寄予厚望.我之前从未与之合作,Inline::C但在阅读了一下之后,我认为实施起来相当简单.但很显然,即使调用存根函数,它什么都不是很多慢.这是我测试过的片段:
use strict;
use Benchmark qw ( timethese );
use Inline 'C';
timethese(
5,
{
"Pure Perl" => \&pure_perl,
"Inline C" => \&inline_c
}
);
sub pure_perl { …Run Code Online (Sandbox Code Playgroud) 几天前,我在本地机器上安装了 Mojolicious 包,因为我需要在我的生产服务器上的 Perl 程序之一中实现一个 websocket。它安装没有问题,我能够运行一个简单的测试脚本:
use strict;
use warnings;
use Mojo::UserAgent;
use Mojo::IOLoop;
# Open WebSocket
my $ua = Mojo::UserAgent->new;
$ua->insecure(1); # Otherwise the handshake will fail
$ua->websocket('wss://some.server.com' => sub {
my ($ua, $tx) = @_;
# Check if WebSocket handshake was successful
unless( $tx->is_websocket ) {
print "Handshake failed!\n";
return;
}
# Wait for WebSocket to be closed
$tx->on(finish => sub {
my ($tx, $code, $reason) = @_;
print "WebSocket closed with status $code.\n";
});
# Close WebSocket …Run Code Online (Sandbox Code Playgroud) 我有标量中的 HTML 代码。HTML 代码可以包含我想要替换的某个域的 URL。例如:
my $code = <<ENDCODE;
<img src="http://server1.olddomain.com/image1.jpg">
<img src="http://server5.otherdomain.com/image2.jpg">
<img src="http://server2.olddomain.com/image3.jpg">
ENDCODE
Run Code Online (Sandbox Code Playgroud)
URL 的服务器部分可以是任何内容(因此不一定是“www”)。我希望将所有指向 olddomain.com 的图像 URL 替换为 newdomain.com,但前提是该图像存在于 newdomain.com 上。所以我不能简单地进行直接替换,而是需要调用一个函数(进行必要的检查)。所以我想我会做这样的事情:
$code =~ s/src=\"(.+?\.olddomain\.com\/.+?)\"/URLReplace($1)/gsie;
Run Code Online (Sandbox Code Playgroud)
URLReplace 是一个执行所有检查并在必要时替换 URL 的函数。问题是正则表达式找到两个匹配项:
http://www.olddomain.com/image1.jpg
Run Code Online (Sandbox Code Playgroud)
和
http://www.otherdomain.com/image2.jpg">\n<img src="http://www.olddomain.com/image3.jpg
Run Code Online (Sandbox Code Playgroud)
问题当然是第一个.+?捕获了直到下一个“.olddomain.com”的所有内容,在第二个匹配中,它是 .olddomain.com http://www.somedomain.com/image2.jpg">\n<img src="http://www。
那么我该如何解决这个问题呢?
perl ×6
regex ×2
android ×1
cordova ×1
inline-c ×1
javascript ×1
mojolicious ×1
openssl ×1
performance ×1
phonegap ×1
split ×1
ssl ×1
string ×1
uppercase ×1