找回密码
 点一下
楼主: 忘记自己

您的地图 有掉线情况么。。那么进来看看吧。。

  [复制链接]
发表于 2008-5-10 16:22:17 | 显示全部楼层
话说。原文以及讨论。
http://www.islga.org/bbs/read.php?tid=1138
回复

使用道具 举报

发表于 2008-5-10 16:28:30 | 显示全部楼层
老白的签名引用的是everguo的话咧~

虽然对掉线有少许了解,除了做技能演示会用到等待时间函数,

作图绝对很少想用到它。
回复

使用道具 举报

发表于 2008-5-10 16:36:19 | 显示全部楼层
引用第15楼amp34于2008-05-10 15:39发表的  :
您所说的掉线是指数据不同导致的没有任何提示的与其它玩家断开吗?
还是指读秒的掉线呢?

这两种情况有什么区别吗?
话说我玩过一张地图就经常出现不读秒断开连接
而且还经常是分成两边,各自玩各自的
回复

使用道具 举报

发表于 2008-5-10 16:45:06 | 显示全部楼层
那么报告下我的测试
在显示精度为0.0001下,triggersleep的测试为同步

个人认为比较重要的第一个测试很有意思
如lz所说,会出现有可能掉线,也可能不掉线的情况~
时差在0.005以上基本直接掉线
如果只是静静等触发制造单位,能够维持连线的,即使刷的很快,但是~如果玩家另外加入额外的干扰操作,极有可能指不定什么时候掉线,且有可能出现后遗灵异状况,比如我弄出过使游戏菜单失灵的
以下使用过的触发
[codes=jass]function isnothing takes nothing returns nothing
endfunction

function dosth takes nothing returns nothing
call CreateUnit(Player(0),'hfoo',0,0,0)
endfunction

function deplayer   takes player p1,player p2 returns nothing
local timer t=CreateTimer()
local real ext=0
if GetLocalPlayer()==p1 then
set ext=0.1
elseif GetLocalPlayer()==p2 then
set ext=0.2
endif
call TimerStart(t,ext,false,function isnothing)
endfunction

function deplayer2 takes player p1,player p2 returns nothing
local timer t=CreateTimer()
local real ext=0
if GetLocalPlayer()==p1 then
set ext=1.126
elseif GetLocalPlayer()==p2 then
set ext=1.127
endif
call TimerStart(t,ext,false,function dosth)
endfunction

function debugTriggerSleepTime takes nothing returns nothing
local timer t =CreateTimer()
call TimerStart(t,GetRandomReal(1,2),false,null)
call TriggerSleepAction(GetRandomReal(0,1))
call PauseTimer(t)
call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,10,R2SW(TimerGetElapsed(t),5,5))
call DestroyTimer(t)
set t=null
endfunction

function Trig_syn_Actions takes nothing returns nothing
call deplayer2(Player(0),Player(1))
endfunction

//===========================================================================
function InitTrig_syn takes nothing returns nothing
    set gg_trg_syn = CreateTrigger(  )
    call TriggerRegisterPlayerEventEndCinematic( gg_trg_syn, Player(0) )
    call TriggerRegisterPlayerEventEndCinematic( gg_trg_syn, Player(1) )
    call TriggerAddAction( gg_trg_syn, function Trig_syn_Actions )
endfunction
[/codes]
当然,如果是do nothing的,是没问题的

那么关于结论呐
回复

使用道具 举报

 楼主| 发表于 2008-5-10 16:48:51 | 显示全部楼层
支持LS的 研究精神
想法到理论  理论到实践   实践到真理   
貌似 我差了很多。。。
回复

使用道具 举报

发表于 2008-5-10 18:49:04 | 显示全部楼层
异步联线的话,联文明IV的时候经常发生,不过那个好像是因为不同版本造成的吧,也许是因为不同网速,最终大家都在同一个游戏中发展出不同的形态……
回复

使用道具 举报

发表于 2008-5-10 19:35:43 | 显示全部楼层
引用第10楼喀尔硫司之瞳于2008-05-10 13:32发表的  :
其他的我不知道
LS说的本地玩家不一定会造成掉线   请不要有这种误区
只是返回值的问题
嗯,现在越来越喜欢本地玩家了..
回复

使用道具 举报

发表于 2008-5-10 21:20:58 | 显示全部楼层
引用第22楼hmmm于2008-05-10 16:36发表的  :


这两种情况有什么区别吗?
话说我玩过一张地图就经常出现不读秒断开连接
而且还经常是分成两边,各自玩各自的

各自玩各自的怎么弄?
回复

使用道具 举报

发表于 2008-5-27 03:41:22 | 显示全部楼层
好像PolledWait(Real time) 这个函数可以做到比较精确地等待,但是我不知道是否会造成掉线。
我单机测试过 PolledWait 0.01秒 一千次 也是瞬间完成的,但用wait就很久。这个差异当地图上东西越多的时候越明显
回复

使用道具 举报

发表于 2008-5-27 10:47:20 | 显示全部楼层
偶在自己改的图里用了无数的wait,和同学玩了N次,除了有点卡,其它还好……
回复

使用道具 举报

发表于 2008-6-30 20:48:56 | 显示全部楼层
.......好复杂..........刻苦研究去.......
回复

使用道具 举报

发表于 2008-7-3 14:06:32 | 显示全部楼层
好象是容易掉啊,连机的特别
回复

使用道具 举报

发表于 2008-7-10 18:55:47 | 显示全部楼层
引用第28楼namevain于2008-05-27 03:41发表的  :
好像PolledWait(Real time) 这个函数可以做到比较精确地等待,但是我不知道是否会造成掉线。
我单机测试过 PolledWait 0.01秒 一千次 也是瞬间完成的,但用wait就很久。这个差异当地图上东西越多的时候越明显

PolledWait 这个函数 是用TimerStart+TriggerSleepAction做出来的
效率比TriggerSleepAction这个还低..
能精确么
回复

使用道具 举报

发表于 2008-7-16 15:28:24 | 显示全部楼层
真是神奇。。
  
完全看不懂。。
  
  
回复

使用道具 举报

发表于 2008-7-23 17:44:18 | 显示全部楼层
看到源自流连忘返站上的一篇讨论贴帖后面的小结,觉得有必要贴上来:
由 gonzdevour 發表於 2008年06月12日 8:57 pm

轉一下自己的文:

Q. 如何解決伺服器分離(Server Split,以下簡稱分流)現象?

1. 首先確定自己玩絕對不會當機

如果自己玩就會跳出或當機,那就不屬於分流的問題。

2. 檢查以下各項:

a. 是否使用了pan camera as necessary的觸發

古早以前有個WE教學站(忘記名字)寫了個英雄選擇範例,
凡使用了這個範例的圖都出現了分流現象,
因為它選擇英雄後拉攝影機的選項用的是上述那條。
(其實簡單地用pan camera或apply camera object就可以正常運\作了。)

b. 商店是否全地圖可賣東西

我忘記要怎麼設定商店才會變成全地圖可賣東西,
好像是把中立商店複製貼上後直接create給單一玩家。
藍綠大戰的前作Norne's Thread草草結束,95%因為這個。

c. 任何部隊攻擊力的骰子數是否超過10個

不要懷疑,鐵定分流。
藍綠大戰做到1.16差點就掛了,就是因為小兵攻擊力骰子升級會超過10。
這個問題的解決要歸功於War3Campaigns的討論串。

d. 是否調整過中立生物的索敵範圍

如果你想要有效地限縮CP怪的索敵範圍,
調整camp radius和guard distance,發現沒差多少,
你就會把腦筋動到這條:

GamePlay Constants: Maximum Creep Camp Radius (Pathing Cells)

保證分流,動一點點都不行。
藍綠大戰在2.65停滯了很久就是因為這個。
能活到現在,要感謝y38011鍥而不捨地幫我開Game測圖,
以及在不知情的狀況下加Game而分流的朋友們........

e. 是否不當使用local player的觸發

這就不解釋了,自學指南有錯誤寫法範例。
而且相較於前面幾項,算是容易抓的BUG。

f. 偵測子字串(Substring)時是否使用了空字串(<Empty>)為條件

簡單說,偵測字串的條件不能寫成:
string containing <Empty> as a substring

g. 關於Game Cache設定

這個功能我不熟,整理一些高手的意見:

Danny(自學手冊)

遊戲快取可用在多人連線遊戲中,做為暫存工具,
但不能將檔案寫入硬碟或從硬碟中讀取(也就是不同地圖之間的資料傳輸),
因為每台電腦的硬碟中可能有不同的檔案,這麼做會造成不同步而斷線。
(按:簡單說就是不能在多人遊戲地圖裡使用Save Game Cache和Reload All)

tv580025

初始化Game Cache時,有的玩家會因為Game Cache滿了,而無法進行初始化,
導致不同步而斷線。
(按:已知Jass Bug有一條是GameCache不能超過256個)

h. 關於MPQ改動造成的分流

基本上都跟mpq中飾物與可毀物的改動有關係。
如果你發現分流地圖上的飾物變成紅黑方塊,
那就屬於mpq改動的分流。一般來說有兩種常見原因:

1. 魔獸本身沒裝好,mpq中存在損壞的檔案。

最簡單的解決方法是重灌魔獸。
當然,如果你知道是哪個檔出問題,跟朋友借檔案然後用mpq程式壓進去也行。

2. SLK優化程式優化了飾物與可毀物

當你先玩過別人的地圖,接著再開你自己的地圖,就會出現紅黑方塊而分流,

基本上這不是你的問題,而可能是前一張地圖所造成的。
U9mapopt是中國魔獸網站U9的高手發佈的一種支援多國語言的SLK優化程式,
這個程式的技術源於大名鼎鼎的Widgetizer,可以加速地圖讀取。

目前中國、台灣大部份熱門地圖如仙之俠道、三國信長等,都使用了這個程式,
他們勾了哪些選項我不清楚,但很明顯的是:如果他們勾了「清理可毀壞與飾物」,
就會導致之後你開的另一張圖產生數據不同步的現象。

由於可毀壞與飾物的數據將會從你玩第一張圖開始,保留到你重開魔獸為止,
也就是說,假設之前開了仙之俠道,魔獸就會保留著仙俠的可毀壞與飾物數據,

接著你開了你自己的圖,卻還是使用仙俠的數據,
而仙俠的可毀與飾物數據已砍除部份物件,與你的地圖不同
因此導致不同步而跳出的結果。

自學手冊舉例的地圖AoM,
也是因為它匯入了自訂的Units/DestructableData.slk檔案,
造成玩下一張圖時會分流。原理同上。

3. 其他的可能性

以下是自學手冊(指南)的引文:

=================================
此外還有一些不明原因可能造成分流。
其中有一些網路謠傳會增加分流機率的因素,如下。
這些項目未經也難以進行實際的驗證,如果可以就盡量試著避免看看吧:)

1.過高的骰子數
2.過高的生命、攻擊力、法力等數值
3.遊戲中改變遊戲速度
4.把某些特定部隊的聲音設成無聲
5.過度頻繁地抓取部隊的Custom value
6.傳訊給單一玩家
7.給單一玩家任務訊息
8.打開單一玩家的電影模式
9.給單一不在場的玩家錢
=================================

1.過高的骰子數?

已實證。

2.過高的生命、攻擊力、法力等數值?

應該只是謠言。TD、守城類的地圖,這幾個數值都幾千幾萬起算的,

3.遊戲中改變遊戲速度?

未測。

4.把某些特定部隊的聲音設成無聲?

未測。(誰知道是哪些特定部隊??)

5.過度頻繁地抓取部隊的Custom value?

謠言可能性不小。
藍綠大戰的小兵路線就是是抓Custom Value在走的,夠頻繁了吧。

6.傳訊給單一玩家?

謠言,藍綠經常傳訊給單一玩家

7.給單一玩家任務訊息?

謠言,藍綠經常給單一玩家任務訊息

8.打開單一玩家的電影模式??

未測

9.給單一不在場的玩家錢?

謠言可能性大,藍綠會給不在場的玩家加錢。

4. 總結

我認為應該要有個觀念,分流並不是謠傳的那種複合性機率產生的問題。
之前常會看到一種說法:「喔因為你的地圖a太多、b也太多,種種不利因素加在一起,所以容易分流啊」

保證那些跟你這樣說的人自己沒遇過分流,也沒解決過。

以上被發現的分流的原因,每一個都是單獨存在的,
請用耐心找到那個單一存在的原因,並且排除它。

以上,給有分流困擾的WEer們參考。
回复

使用道具 举报

发表于 2008-7-23 21:11:22 | 显示全部楼层
支持楼上!
回复

使用道具 举报

发表于 2008-7-25 11:34:02 | 显示全部楼层
我现在比较无聊,所以再开话题。。

如上文所引n种掉线情况,现自己验证证实过的只有两个。。
一个是单位攻击骰子数过大,一个是bj函数移动镜头那个

于是我很自作主张的做个分类小结
情况一:
不可预测之天灾。比如那个骰子数过大就是。实际测试中,分流出现在此单位创建后并做出若干攻击。嗯,属于内部随机数机制的不可靠错误吧
因为我仅从两台机器用多开工具测得,同属一台机器的会分流到一起,也许这个结果和所属cpu有关?~~不知道如果都是同一型号的会如何。该类型的错误让人感到很没安全感啊,毕竟属于不可控的因数。

情况二:这类情况的诱因是可追踪和控制的,比如可破坏物的slk,最好举例的就是那个镜头函数pan camera as necessary,其本质如下
[codes=jass]function SmartCameraPanBJ takes player whichPlayer, location loc, real duration returns nothing
    local real dist
    if (GetLocalPlayer() == whichPlayer) then
        // Use only local code (no net traffic) within this block to avoid desyncs.

        set dist = DistanceBetweenPoints(loc, GetCameraTargetPositionLoc())
        if (dist >= bj_SMARTPAN_TRESHOLD_SNAP) then
            // If the user is too far away, snap the camera.
            call PanCameraToTimed(GetLocationX(loc), GetLocationY(loc), 0)
        elseif (dist >= bj_SMARTPAN_TRESHOLD_PAN) then
            // If the user is moderately close, pan the camera.
            call PanCameraToTimed(GetLocationX(loc), GetLocationY(loc), duration)
        else
            // User is close enough, so don't touch the camera.
        endif
    endif
endfunction[/codes]
明眼人很快就能看出问题来(我倒是看了老久。。)
那么问题在何处呢~考考大家(提示:比如localplayer啦,location啦)
这件事情告诉我们,不要相信bj
回复

使用道具 举报

发表于 2008-7-25 13:40:48 | 显示全部楼层
用户被禁言,该主题自动屏蔽!
回复

使用道具 举报

发表于 2008-8-2 02:27:32 | 显示全部楼层
嗯,关于Kook所说的内容,我会去查一下,我的图有没关这种现象.之后再来报告,
先留个位置吧.

较久没来看,居然贴子关闭了..只好编辑回复了..

某图中,因为有些单位的黄金奖励股子数超过10而致致掉线...

因此,我猜测,掉线原因之一的攻击奖励数,可以和黄金,木头的奖励数合为一类..
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-2 09:02 , Processed in 0.077759 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表