我正在为我制作的游戏添加网络多人游戏.当服务器向客户端发送更新数据包时,我会包含一个时间戳,以便客户端确切知道该信息何时有效.但是,服务器计算机和客户端计算机的时钟可能设置为不同的时间(甚至可能只有几秒钟的差异),因此服务器的时间戳需要转换为客户端的本地时间.
所以,我想知道计算服务器和客户端之间时差的最佳方法.当前,客户端在初始化期间对服务器执行时间戳记录,记录请求何时被发送以及何时被应答,并且猜测时间戳大致在旅程的中途生成.客户还运行其中10个试验并取平均值.
但是,问题是我在重复运行程序时会得到不同的结果.在每组10中,每次测量很少发生超过400毫秒的偏差,这可能是可以接受的.但是如果我在程序的每次运行之间等待几分钟,那么得到的平均值可能不同意多达2秒,这是不可接受的.
有没有更好的方法来确定两个联网设备的时钟之间的差异?或者至少有一种方法来调整我的算法以产生更准确的结果?
可能相关或不相关的详细信息:这些设备是通过蓝牙进行通信的iPod Touch.我测量的ping是50-200毫秒.我不能要求用户同步他们的时钟.:)
更新:在下面的答案的帮助下,我写了一个objective-c类来处理这个问题.我在我的博客上发布了它:http://scooops.blogspot.com/2010/09/timesync-was-time-sink.html
我有一个在视网膜显示器上运行得很好(55-60fps)的游戏.我想添加一个与现有场景融合的全屏叠加层.然而,即使使用小的纹理,性能也很大.我可以进行优化以使其可用吗?
如果我使用80x120纹理(纹理是动态渲染,这就是为什么它不是正方形),我得到25-30FPS.如果我使纹理变小,性能会提高,但质量是不可接受的.但一般来说,叠加的质量不是很重要(它只是照明).
渲染器利用率为99%.
即使我使用文件(.png)中的方形纹理,性能也很糟糕.
这是我创建纹理的方式:
[EAGLContext setCurrentContext:context];
// Create default framebuffer object.
glGenFramebuffers(1, &lightFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, lightFramebuffer);
// Create color render buffer and allocate backing store.
glGenRenderbuffers(1, &lightRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, lightRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, LIGHT_WIDTH, LIGHT_HEIGHT);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, lightRenderbuffer);
glGenTextures(1, &lightImage);
glBindTexture(GL_TEXTURE_2D, lightImage);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, LIGHT_WIDTH, LIGHT_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lightImage, 0);
Run Code Online (Sandbox Code Playgroud)
这是渲染......
/* Draw scene... */
glBlendFunc(GL_ONE, GL_ONE);
//Switch to offscreen texture buffer
glBindFramebuffer(GL_FRAMEBUFFER, …Run Code Online (Sandbox Code Playgroud)