【问题标题】:Haxe+OpenFL app freezes when long-lasting loops used使用长时间循环时,Haxe+OpenFL 应用程序冻结
【发布时间】:2023-04-08 04:01:01
【问题描述】:

所以,问题就在标题中。当我进行长时间循环时,无论目标平台如何,应用程序都会冻结。 第三方循环也会导致冻结:

var s:Socket = new Socket();
var data:String; 
s.connect(new Host("localhost"), 5000);
s.waitForRead();

我什至无法制作一个简单的套接字应用程序,因为它的主要思想是使用持久循环。当我不使用 OpenFL 时,一切正常。我应该手动减少循环内的 CPU 负载吗?如果可以,我该怎么做?

【问题讨论】:

  • 也许你用这个s.waitForRead() 调用阻塞了主线程(从而阻塞了游戏/应用程序循环)?如果是这种情况,您可以将此代码放在单独的线程中或完全避免阻塞调用(通过从其他循环中轮询或使用基于事件的 API,如果您的目标平台支持它们)。
  • @JonasMalacoFilho 是对的。 AFAIK,OpenFL 模仿 Flash 的 15 秒循环限制。

标签: loops infinite-loop haxe openfl


【解决方案1】:

openfl.net.Socket 可能是您正在寻找的 - 它扩展了 openfl.events.EventDispatcher,因此利用基于事件的 API 来处理侦听/接收数据等,因此可以在不阻塞的情况下使用它主线程

因此,如何设置其中之一的示例可能如下所示(摘自an OpenFL forum post

socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(Event.CLOSE, onClose);
socket.addEventListener(IOErrorEvent.IO_ERROR, onError);
socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecError);
trace("Connecting to server.");
socket.connect("52.36.8.250", 443);

有一点需要注意,addEventListenerlistener 参数似乎是Dynamic -> Void,所以使用传递给回调的值可能有点棘手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 2011-10-16
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    相关资源
    最近更新 更多