C,C ++,Java,PHP,Ruby,图灵,VB
计算机科学加拿大 
C,C ++,Java,PHP,Ruby,图灵,VB  

用户名:   Password: 
 登记登记   
 代码优化
指数 -> ,图灵 -> 图灵教程
查看上3d中奖规则主题 可打印的版本下载主题利率主题订阅本主题私人信息刷新页面 查看下3d中奖规则主题
作者 信息
Mirhagk.




邮政发布: 2009年12月15日3:01 PM  帖子主题:代码优化

程序员需要做的四件事来做好游戏。

1.提出3d中奖规则好主意并计划游戏。

2.写下游戏的代码

3.制作模拟Idiot证明(请记住人们是多么愚蠢)

4.尽可能使惊人的游戏成为有效的


今天我将谈论第四件物品,因为它似乎是大多数程序员的最大问题。

我创建了3d中奖规则简单的程序来展示许多优化代码的方法。如果您不明白,则评论该程序,但您真的应该是因为它非常基本

图灵:

var. X,Y. : %角色的位置
x := maxx. div 2
y := 最大 div 2
var. 钥匙 : 大批 char 布尔基 %键盘输入
var. t := 时间流逝 %保持时间
var.Tlast. := t %最后帧的时间
var.FPS. : 真实的 %保持每秒帧的轨道
集体 (黑色的) %将背景设置为黑色
颜色 (白色的) %和字体颜色到白色
CLS.
环形
    Input.keydown. (钥匙) %获取键盘状态
    t := 时间流逝 - tlast
    如果 t = 0 然后 %以防止划分0我们说较少
        fps := 1000          %超过1秒已通过它是1000fps
    别的
        fps := 1000 / (t) %fps等于1秒除以运行最后一帧的时间
    结尾 如果
    tlast := 时间流逝
    text.locate. (1, 1)
    FPS.
    如果 钥匙 (key_up_arrow.) 然后 %简单的运动
        y += 1
    埃莉丝 钥匙 (key_down_arrow.) 然后
        y -= 1
    结尾 如果
    如果 钥匙 (key_right_arrow.) 然后
        x += 1
    埃莉丝 钥匙 (key_left_arrow.) 然后
        x -= 1
    结尾 如果
    为了 X : 1 .. maxx. 经过 10
        为了 Y : 1 .. 最大 经过 10
            窗玻璃 (x,y,x - 5,y - 5, 黄色的) %绘制了背景的星星
        结尾 为了
    结尾 为了
    绘图 (x,y, 3, 3, 亮红) %绘制了角色
    延迟 (10)
    CLS. %清除屏幕
结尾 环形


显然不是3d中奖规则非常有用的游戏大声笑,但它就像3d中奖规则例子。所以首先,可能是最常见的问题之一是“闪烁”。

好吧,这是CLS所在的第3d中奖规则问题。现在它清除了屏幕然后做了一堆代码,然后画出了东西。当它执行代码时,它会忽略要少得多,然后在绘制它之前清除屏幕。

然而,这真的没有太大的差异,因为你可以只使用View.update和offscreenonly [URL =](更多关于它进入它)[/ url]但请记住,脱离呼叫的双缓冲区会减速。


好吧,接下来是我最喜欢的改进。延迟是3d中奖规则你几乎永远不会移动的命令。如果您注意到FPS计数器,它会在我的计算机上运行大约25个fps(可能会在您的速度上运行较高,但它不会以100 fps运行,如果它是10毫秒的延迟,它应该正在做。

延迟确实是等待指定的毫秒数量。然而,这不是很好的,因为您不知道该程序将在不同的机器上运行多长时间,甚至可以在几分钟到分钟。

time.delaysincelast(毫秒:int)将自上次延迟或time.delaysincelast等待指定数量的毫秒数量(因此,如果代码需要7毫秒,则运行7毫秒.Delaysincelast是10那么它将等待3毫秒)

如果替换延迟时间.Delaysincelast您将看到对您的程序速度的立即改进(它将通过每秒提高10帧,除非您的计算机已经快速地运行代码)

但等等,为什么延迟完全?你为什么要限制电脑的速度?我们为此代码拥有的唯一原因是我们希望字符的速度保持一致。

运动是相对的朋友,所以而不是通过一定数量增加位置,而不是我们为什么基于多时间过去了。
这就是我的意思:
图灵:

    如果 钥匙 (key_up_arrow.) 然后 %相对运动
        y += 1 * (t) / 10
    埃莉丝 钥匙 (key_down_arrow.) 然后
        y -= 1 * (t) / 10
    结尾 如果
    如果 钥匙 (key_right_arrow.) 然后
        x += 1 * (t) / 10
    埃莉丝 钥匙 (key_left_arrow.) 然后
        x -= 1 * (t) / 10
    结尾 如果

当然,这是工作x和y必须是真实的(从INT变为真实),必须在绘制时舍入:
图灵:

绘图 (圆形的 (x), 圆形的 (y), 3, 3, 亮红) %绘制了角色


在这个例子中,除了3d中奖规则更平滑的运动之外,你不会注意到不同的差异,但如果你拿走了窗玻璃命令,你会注意到他以前的速度移动。



最后但现在最少,关闭您的计划。如果您必须在右上角单击“X”以继续停止程序,这并不是好事。您应该在主循环中的语句时出口。对于我们来说,我们将使用
[语法=图灵]
键退出(key_esc)
[/句法]

现在,如果按转义键,这将停止程序。但是,如果您注意到窗口保持打开状态。那就是因为你没有控制关闭默认窗口。这就是为什么而不是View.set你应该在程序顶部做以下
图灵:

var. screen:=赢dow.open.(“脱机”)

这与相同的操作方式View.set(或屏幕),除了您现在在变量中窗口并且可以使用以下内容
图灵:

窗口(scr)

如果您在代码结束时(结束循环之后),那么它将停止程序并在按转义键时关闭它。


当然,许多其他方法可以改善您的代码,这些方法只是可以在大多数程序中使用的最简单的方法。

如果您发布代码,我可以帮助您修改代码以使其运行更快。

BTW最终代码是:

图灵:

var. 屏幕 := 赢dow.open. (“脱机”) %打开3d中奖规则新窗口
var. X,Y. : 真实的 %角色的位置
x := maxx. div 2
y := 最大 div 2
var. 钥匙 : 大批 char 布尔基 %键盘输入
var. t := 时间流逝 %保持时间
var.Tlast. := t %最后帧的时间
var.FPS. : 真实的 %保持每秒帧的轨道
集体 (黑色的) %将背景设置为黑色
颜色 (白色的) %和字体颜色到白色
CLS.
环形
    Input.keydown. (钥匙) %获取键盘状态
    t := 时间流逝 - tlast
    如果 t = 0 然后 %以防止划分0我们说较少
        fps := 1000          %超过1秒已通过它是1000fps
    别的
        fps := 1000 / (t) %fps等于1秒除以运行最后一帧的时间
    结尾 如果
    tlast := 时间流逝
    text.locate. (1, 1)
    FPS. %每秒放置框架
    如果 钥匙 (key_up_arrow.) 然后 %相对运动
        y += 1 * (t) / 10
    埃莉丝 钥匙 (key_down_arrow.) 然后
        y -= 1 * (t) / 10
    结尾 如果
    如果 钥匙 (key_right_arrow.) 然后
        x += 1 * (t) / 10
    埃莉丝 钥匙 (key_left_arrow.) 然后
        x -= 1 * (t) / 10
    结尾 如果
    为了 X : 1 .. maxx. 经过 10
        为了 Y : 1 .. 最大 - 10 经过 10
            窗玻璃 (x,y,x - 5,y - 5, 黄色的) %绘制了背景的星星
        结尾 为了
    结尾 为了
    绘图 (圆形的 (x), 圆形的 (y), 3, 3, 亮红) %绘制了角色
    view.update. %更新屏幕
    CLS. %清除屏幕
    出口 什么时候 钥匙 (key_esc.) 按Escape时%退出
结尾 环形
窗口 (屏幕) %关闭了窗口
赞助
赞助
赞助
赞助
魔鬼




邮政发布: 2009年12月15日下午4:15  帖子主题:Re:代码优化

首先,您的FPS检测代码不正确(如果是<0然后fps蘸入否定),因为你在测试时,不是t = 0,而不是t<=0.

其次,有合法的理由锁定到每秒给定的帧数,包括多人网络编程。我也不得不限制我的3d中奖规则程序(虽然这是Java并使用OpenGL),因为我的显卡正在弄得奇怪的呜咽声。

第三,虽然你的“完成”程序可能会更顺利地运行,你在这里添加了什么实际优化?一切看起来都很顺畅,但只要我能看到,就没有任何实际运行。
托尼




邮政发布: 2009年12月15日星期二7:04 PM  帖子主题:Re:代码优化

随着魔法指出,将是更合适的标题 帧速率控制 - http://9tt6y.icu/v3/viewtopic.php?p=5626

嗯..这似乎是从2003年开始的,我猜测延迟尚未介绍。
最新来自compsci.ca/blog: Tony's 编程博客。 DWite - A. 编程竞赛.
Mirhagk.




邮政发布: 2009年12月16日星期三上午8:00  帖子主题:Re:Re:代码优化

魔鬼@Tue 2009年12月15日下午4:15写道:
首先,您的FPS检测代码不正确(如果是<0然后fps蘸入否定),因为你在测试时,不是t = 0,而不是t<=0.

其次,有合法的理由锁定到每秒给定的帧数,包括多人网络编程。我也不得不限制我的3d中奖规则程序(虽然这是Java并使用OpenGL),因为我的显卡正在弄得奇怪的呜咽声。

第三,虽然你的“完成”程序可能会更顺利地运行,你在这里添加了什么实际优化?一切看起来都很顺畅,但只要我能看到,就没有任何实际运行。


首先,我甚至没有意识到框架可能会跑步(以为它有点不可能......)

是的,我猜这个标题有点有点误解,因为它只是让程序跑得更顺畅。我想指出的大事是使用时间.Delaysincelast而不是延迟(使其更有可能以恒定的速度运行,所以你可能会用于Mulitplayer的东西)。

而且我也相信,如果你正在制作MulitPlayer游戏,那么只要你的位置而不是速度,那么你不应该有3d中奖规则问题让它尽可能快地运行。 (默认情况下XNA尽可能快地,唯一有限的是绘图)。

如果您有绘图或MulitPlayer的问题,那么您可以通过执行以下操作来限制这些内容:
图灵:

var. t:
var.告诉:=时间流逝
var.FPS.:
var. refresh:=0


环形
t:=Time.Elapsed-told
如果 t<=0 然后
FPS.:=1000
别的
FPS.:=1000 div t
刷新+ = t
结尾 如果
告诉:=时间流逝

%%更新代码

如果 refresh>=20 然后
刷新:= 刷新 摩擦 20
%%绘图代码
结尾 如果
结尾 环形


这将在游戏时将图形限制为50fps,而更新代码仍将尽可能快地运行。这几乎是XNA的确切方式,所以他们没有获得缓慢的刷新率或更糟糕的游戏,这些游戏在某人的电脑上慢慢地慢慢地慢慢,但是当切换到Xbox时比预期的速度更快,这将搞砸游戏。所有程序员都应该学习如何以恒定的速度移动他们的物体,无论它是什么系统。 (例如,如果你制作多人游戏但是3d中奖规则玩家的电脑很慢,那么它会发生什么,因为他们等待那个人,或者那个人有点喘息但仍然工作,并且仍然有很好的电脑的人仍然可以慢慢减慢每个人的速度播放正常,如果我错了,请纠正我,但我相信第二个选择更好,因为如果只有玩家才能故障,你仍然可以至少玩,而不是因为每个人都要戒烟)

编辑:如果3d中奖规则mod想要将主题标题更改为更合适的东西,请随意这样做
魔鬼




邮政发布: 2009年12月16日星期三上午10:48  帖子主题:Re:代码优化

减法可以产生负数的唯一原因是因为Time.Elapeed对它的不准确性相对较大,一些系统上的50ms。这听起来不太好,但在60fps时,每个帧只有约17米。

我同意运动率应与帧率无关。

通常,多人游戏具有“刻度率”,可以控制他们向服务器发送消息的频率。常见值为每秒33,66和100次。这些与抽取速度无关。在客户端无法跟上服务器期望的费率的情况下,客户端将遇到一些可怕的滞后,否则服务器将踢它们。

您的最新代码更有用,尽管它值得记住及时不准确。(我不知道在图灵中有更好的选择,但许多其他语言让您在纳秒中获得当前时间)。
Mirhagk.




邮政发布: 2009年12月16日星期三上午11:50  帖子主题:Re:代码优化

50毫米滞后?你确定吗??哇,这实际上很像强烈。这可能会产生生死与死亡之间的差异,(多球员游戏肯定会有50ms滞后)。

至于多人游戏的事情,如果使用客户的最后3d中奖规则数据,并且刚刚跳过发送IT数据的主机(如果它连续超过3d中奖规则),那么它不会更好,然后它会被踢它)

这样,如果客户的计算机滞后,那么他们将有3d中奖规则帧跳过模式(一切都在帧的一半左右移动,虽然相同的速度),但其他人都会免费(除了跳过框架的人除外)

看起来很糟糕,但它不会影响游戏太多。

我正在考虑制作3d中奖规则多人游戏....如果只有图灵可以通过互联网进行游戏(据我所知,净命令只在局域网上执行)
魔鬼




邮政发布: 2009年12月16日星期三下午1:48  帖子主题:Re:代码优化

规格规格:“在IBM PC兼容中,这是自定义系统启动以来的总时间。持续时间的硬件分辨率以55毫秒为单位。例如,时间。可以通过多达55毫秒关闭。"

它不是滞后,只是3d中奖规则错误的边缘。所提供的价值可以达到55ms,或落后的55毫秒。

处理多人游戏中的网络问题有很多策略。鉴于丢失某些部分数据包的网络中平滑,实时播放的目标(50%或更多,即使),有一些主要策略。

1.永远不要等待来自其他端的数据(如果您是服务器,如果您是客户端,则服务器)。如果更新按时到达那么大,更新。
2.基于先前数据外推动运动。这通常意味着继续基于物理模型移动玩家(通常是速度,加上碰撞和重力等物理等)。
3.跟踪自另3d中奖规则上次发送数据以来的时间长度;如果它过长,请断开它们。
4.跟踪另一端发送数据的频率。如果他们不经常发出,请断开它们。

如果您想考虑客户不一定播放公平的重要可能性,您还必须做一些工作。客户可以想象地发送谎言和诡计作为他们的更新数据,以使服务器混淆为使其无形,超快或超准确。狡猾的客户甚至可以通过在几次刚才发出邮戳的更新报文来使服务器认为合法数据包迟到才延迟到达,允许说的客户在那段时间内实际完成的内容来“及时旅行”。

区分物理学和图形更新速率也很重要。通常,物理更新速率相对较低(每秒20-30个更新),而图形和网络更新率为高(可变,30-90和固定,33,66或100)。这是因为物理学计算得昂贵,因为如果物理学仅更新每个第三帧,则没有人确实注意到。
Mirhagk.




邮政发布: 2009年12月16日星期三下午3:11  帖子主题:Re:代码优化

有些事情需要更新每个帧,如碰撞检测(虽然如果您使用纯粹的线性碰撞检测,那么您不必担心)

其他事情完全不需要更新,如分数,如果分数需要500 ms更新,则没有人真正的注意事项。

我现在要做两件事。首先,我要研究帧率最慢的帧速率,以便有人注意到,然后我要研究并看看游戏是否只​​有在需要更新时更新代码更快地运行。

还如果有人知道如何在互联网上做出游戏实际工作,请告诉我好吗?
赞助
赞助
赞助
赞助
魔鬼




邮政发布: 2009年12月16日星期三下午3:33  帖子主题:Re:代码优化

您可能只需要指定实际的互联网地址,而不是LAN地址。最简单的方式是LAN地址几乎总是192.168.1。*或192.168.0。*,其中*为1到255.更复杂的方式是Traceroute到该IP地址,看看数据包是否留下了本地网络。
Mirhagk.




邮政发布: 2009年12月16日星期三下午3:48  帖子主题:Re:代码优化

这里是我对屏幕刷新率的测试。我会说你可以逃脱大约20个,但你没有在30次注意到。让我知道好吧。
图灵:

var.:= 赢dow.open. (“脱机”)
“这是3d中奖规则测试,了解可视更新在注意之前有多慢:"
var.FPS. :
var. t :
var.告诉 := 时间流逝
var.maxframe.. := 真的

var. XV,YV. : 真实的 := 1
var. X,Y. : 真实的 := 0
var.col := 亮蓝色
var.碰撞 := 错误的
var. c : 细绳 (1)
颜色 (白色的)
集体 (黑色的)

环形
    如果maxframe.. 然后
        t := 时间流逝 - told
        如果 t < 1 然后
            fps := 1000
        别的
            fps := 1000 div t
        结尾 如果
        如果 哈希 然后
            get (c)
            fps := 200
            maxframe := 错误的
        结尾 如果
    别的
        延迟 ((1000 divFPS.) - t)
        如果 哈希 然后
            get (c)
            如果FPS. > 20 然后
                fps -= 10
            埃莉丝FPS. > 1 然后
                fps -= 1
            别的
                出口
            结尾 如果
        结尾 如果
    结尾 如果
    told := 时间流逝
    %窗玻璃(round (x), round (y), 15, 15, white)
    CLS.
    x += XV. * (1000 / fps) / 2
    y += yv. * (1000 / fps) / 2
    text.locate. (1, 1)
    FPS.
    如果maxframe.. 然后
        “截图尽可能快地运行”
        “按任意键切换到200 fps” ..
    别的
        “目前以上述速度运行”
        “如果你能注意到滞后请告诉我”
        “按任意键降低刷新率”
    结尾 如果
    绘图 (圆形的 (x), 圆形的 (y), 15, 15,Col.)
    view.update.
    如果 x > maxx. 然后
        xv := -1
        collided := 真的
    埃莉丝 x < 0 然后
        xv := 1
        collided := 真的
    结尾 如果
    如果 y > 最大 然后
        yv := -1
        collided := 真的
    埃莉丝 y < 0 然后
        yv := 1
        collided := 真的
    结尾 如果
    如果碰撞 然后
        col := 兰德 (0, 5)
        案件col
            标签 0 :
                col := 亮红
            标签 1 :
                col := 亮蓝色
            标签 2 :
                col := brighp.colle.
            标签 3 :
                col := 42
            标签 4 :
                col := 黄色的
            标签 5 :
                col := Brightgreen.
        结尾 案件
        collided := 错误的
    结尾 如果
结尾 环形
“感谢您使用Nathan的帧速率测试。请转到 www.compsci." ..
“.ca并找到图灵下的代码优化线程>turing tutorials"
“请让我发布,让我知道你注意到它滞后的速度是什么”
"(如果您还没有请尝试这一点,所以你可以得到“ ..
“准确的答案”
view.update.
输入.Pause.
窗口 ()


好的,有没有办法获得图灵的IP地址?我猜它只返回本地IP地址
从上3d中奖规则显示帖子:   
   指数 -> ,图灵 -> 图灵教程
查看上3d中奖规则主题 告诉3d中奖规则朋友可打印的版本下载主题利率主题订阅本主题私人信息刷新页面 查看下3d中奖规则主题

11  [ 10 Posts ]
跳到:   


Style:  
搜索: