- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 Cordova 实时创建一个简单的游戏(如 Agar.io):Javascript、AJAX、PHP 和 MySQL。
代码运行良好:
1) JS发送X和Y给PHP服务器
2) PHP将X和Y保存到MySQL数据库
3) PHP 从 MySQL 数据库中检索 X 和 Y
4) PHP 帖子 X 和 Y
5) JS 检索 X 和 Y 的 PHP post
6) 在检索到的 X 和 Y 坐标处显示圆
问题来了..
太慢了!整个过程大约需要 1 秒才能完成(延迟 1 秒)。此外,有时它甚至会滞后 2-10 秒!
我知道这种方法不是最快的,但我仍然觉得我可能做错了什么或效率低下。
帮助
这可能是最有效的方法,但我觉得我做错了什么。或者也许有更好的方法来做到这一点?
此外,我目前正在使用 HostMonster,共享帐户(也许这就是问题所在?),我正在等待他们打开它,以便我可以升级到专用服务器并在那里试用。
注意:与此同时,我真的尽量避免使用 Node.js/Websockets,因为服务器非常昂贵。而且免费的非常有限 =/
更糟的是,我会学习更多 JS PHP MySQL :)
JavaScript
function update
{
ctx.clearRect(0, 0, c.width, c.height);
ctx.drawImage(test, positionX - c.width/40, positionY - c.width/40, c.width/20, c.width/20);
if((directionX != positionX || directionY != positionY) &&
dataServerSendOn && dataServerGetOn)
{
dataServerSendOn = false;
dataServerGetOn = false;
setTimeout(function(){requestAnimationFrame(sendData);}, FPS);
}
requestAnimationFrame(update);
}
function sendData()
{
var params = "uuid=" + uuid + "&directionX=" + directionX + "&directionY=" + directionY;
http.open("POST", url, true);
//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.onreadystatechange =
function()//Call a function when the state changes.
{
if(http.readyState == 4 && http.status == 200)
{
dataServerSendOn = true;
requestAnimationFrame(getData);
}
}
http.send(params);
}
function getData()
{
xmlhttp.onreadystatechange =
function()
{
/*
* 0: Hasn't Started
* 1: Connected to the Server
* 2: Server has received our request
* 3: Server Processing
* 4: Request is finished and data is ready
*/
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
httpTransferString = xmlhttp.responseText;
requestAnimationFrame(sortData);
}
}
xmlhttp.open("GET", "http://www.example.com/game", true);
xmlhttp.send();
}
function sortData()
{
positionX = "";
positionY = "";
for(var i = 0; httpTransferString[i] != '&'; i++)
{
positionX += httpTransferString[i];
}
for(var i = positionX.length + 1; httpTransferString[i] != '#'; i++)
{
positionY += httpTransferString[i];
}
dataServerGetOn = true;
}
PHP
<?php
require 'core.php';
require 'connect.php';
if(loggedin())
{
if(isset($_POST['uuid']) &&
isset($_POST['directionX']) &&
isset($_POST['directionY']))
{
$uuid = $_POST["uuid"];
$directionX = $_POST["directionX"];
$directionY = $_POST["directionY"];
$query = "SELECT `UUID` FROM `users` WHERE `UUID`='$uuid'";
if($query_run = mysql_query($query))
{
$queryX = "UPDATE `users` SET `x` = '$directionX' WHERE `uuid`='$uuid'";
$query_runX = mysql_query($queryX);
$queryY = "UPDATE `users` SET `y` = '$directionY' WHERE `uuid`='$uuid'";
$query_runY = mysql_query($queryY);
}
}
}
else
{
echo "You're not logged in";
}
?>
<form name="tcpForm" action="<?php echo $current_file; ?>" method="POST">
UUID <input type="text" name="uuid"> <br>
directionX <input type="text" name="directionX"><br>
directionY <input type="text" name="directionY"><br>
<input type="submit" value="Send">
</form>
如有任何建议,我将不胜感激,我还是菜鸟 =]
最佳答案
HTTP 不被认为是实时应用程序的最佳选择,因为它不提供完整的双向通信。这意味着无论何时服务器端发生变化,都无法通知客户端。客户端需要发送大量请求,这会给服务器带来很大的负载,或者使用long-polling
。 长轮询
是一种方式,实际上更像是一种 hack,可以部分规避 HTTP 中缺乏双向通信的问题。它包括客户端向服务器发送请求,服务器保持连接打开,直到有东西可以响应客户端。这也不是最佳选择,因为服务器可能会用完套接字。
现在,对于良好的实时服务(或游戏),您可以使用一些专门针对实时的协议(protocol)。输入 WebSockets
和 WebRTC
。
WebSockets 是服务器和客户端之间的持久双工(双向)连接,它允许客户端向服务器发送和接收更小的“请求”,基本上只有特定于应用程序的数据。与 HTTP 不同,这是一个持久连接,这意味着您不需要为每个请求发送额外的数据(例如 header )。另一件好事是,所有主要浏览器都支持 WebSockets,并且目前正在成为实时通信的事实标准。
WebRTC - 这是一种点对点连接协议(protocol),您可以连接到其他客户端进行通信,而不是直接连接到服务器。这几乎意味着您的玩家将直接相互连接,而且速度会更快,因为他们不会连接到可能会出现性能问题或网络退化的集中位置。大多数现代浏览器都支持它,IE 落后。
因此,这些是创建实时服务/应用程序的最佳可用选项。我建议使用 WebSockets,因为它更成熟并且目前采用率更高。如果你决定使用 PHP,你可以检查一些现成的库来处理 websockets,例如 http://socketo.me/
关于javascript - 使用 Cordova、Javascript、PHP、MySQL 的实时多人游戏 - 帮助和提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38012870/
我有这个问题: 我们声称对 float 使用相等测试是不安全的,因为算术运算会引入舍入错误,这意味着两个应该相等的数字实际上并不相等。 对于这个程序,您应该选择一个数字 N,并编写一个程序来显示 1
为什么这个脚本的输出是 5 而不是 8 ? 我认为 -- 意味着 -1 两次。 var x = 0; var y = 10; while ( x
我现在可以从 cmd 窗口中执行的 FFmpeg 过程中读取最后一行。 使用脚本主机模型对象引用此源。 Private Sub Command1_Click() Dim oExec
使用 vlookup,当匹配发生时,我想从匹配发生的同一行显示工作表 2 中 C 列的值。我想出的公式从 C 列表 2 中获取值,但它从公式粘贴在表 3 上的行中获取,而不是从匹配发生的位置获取。 这
我在破译 WCF 跟踪文件时遇到了问题,我希望有人能帮助我确定管道中的哪个位置发生了延迟。 “Processing Message XX”的跟踪如下所示,在事件边界和传输到“Process Actio
我有四个表,USER、CONTACT、CONACT_TYPE 和 USER_CONTACT USER_CONTACT 存储用户具有填充虚拟数据的表的所有联系人如下 用户表 USER_ID(int)|
以下有什么作用? public static function find_by_sql($sql="") { global $database; $result_set = $data
我正在解决 JavaBat 问题并且对我的逻辑感到困惑。 这是任务: Given a day of the week encoded as 0=Sun, 1=Mon, 2=Tue, ...6=Sat,
我正在研究一些 Scala 代码,发现这种方法让我感到困惑。在匹配语句中,sublist@ 是什么?构造?它包含什么样的值(value)?当我打印它时,它与 tail 没有区别,但如果我用尾部替换它,
我正在使用以下代码自行缩放图像。代码很好,图像缩放也没有问题。 UIImage *originImg = img; size = newSize; if (originImg.size.width >
Instruments 无法在我的 iPad 和 iPhone 上启动。两者都已正确配置,我可以毫无问题地从 xcode 调试它们上的代码,但 Instruments 无法启动。 我听到的只是一声嘟嘟
我想用 iPhone 的 NSRegularExpression 类解析此文本: Uploaded652.81 GB 用于摘录上传和652.81文本。 最佳答案 虽然我确实认为 xml 解析器更适合解
我找到了 solution在 Stackoverflow 上,根据过滤器显示 HTML“li”元素(请参阅附件)。本质上基于 HTML 元素中定义的 css 类,它填充您可以从中选择的下拉列表。 我想
这是一个简单的问题,但我是在 SQL 2005 中形成 XML 的新手,但是用于形成如下所示表中的 XML 的最佳 FOR XML SQL 语句是什么? Column1 Column2 -
我在 www.enigmafest.com 有一个网站!您可以尝试打开它!我面临的问题是,在预加载器完成后,主页会出现,但其他菜单仍然需要很长时间才能加载,而且声音也至少需要 5 分钟! :( 我怎样
好吧,我正在尝试用 Haskell 来理解 IO,我想我应该编写一个处理网页的简短小应用程序来完成它。我被绊倒的代码片段是(向 bobince 表示歉意,但公平地说,我并不想在这里解析 HTML,只是
如何使用背景页面来突出显示网站上的某个关键字,无论网站是什么(谷歌浏览器扩展)?没有弹出窗口或任何东西,它只是在某人正在查看的网站上编辑关键字。我以前见过这样的,就是不明白怎么做!谢谢你的帮助。 最佳
我是 Javascript 新手,需要一些帮助。 先看图片: . 积分预测器应用程序。 基本上当用户通过单选按钮选择获胜团队时它应该在积分栏中为获胜队添加 10 分,并且并根据得分高的球队自动对表格进
这是我的情况 - 我要发送一份时事通讯,我试图做的是,当用户单击电子邮件中的链接时,它会重定向到我的网页,然后会弹出一个灯箱,显示视频。我无法在页面加载时触发灯箱,因为您可以在查看灯箱之前转到同一页面
我有这个代码。 ¿Cuanto es ? Ir 我想获取用户输入的“验证码”值。我尝试这个但行不通。有什么帮助吗? var campo = d
我是一名优秀的程序员,十分优秀!