OX論壇
Would you like to react to this message? Create an account in a few clicks or log in to continue.

如何減少LAG?

3 posters

向下

如何減少LAG? Empty 如何減少LAG?

發表  丘 周四 8月 21, 2008 12:12 am

請問~使用RGSS時

怎讓~一個腳本自動執行

是用RETURN?還是直接打名稱?還是......

如果利用並行處理事情~會超LAG的

但是又不能完全將事件指令翻成RGSS

減少LAG~"~

例如:

def xxx
$xxx = 1
xxx
end

or

def xxx
$xxx = 1
return
end

$xxx都不是1

怎麼寫?
丘
拿著衝鋒槍瘋狂掃射的瘋子
拿著衝鋒槍瘋狂掃射的瘋子

文章數 : 146
注冊日期 : 2008-05-21
年齡 : 33
來自 : 台北中和

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  愚零鬥武多 周四 8月 21, 2008 9:57 am

def xxx
$xxx = 1
end

如果只是單純的將內建事件指令改成RGSS CODE老實講是多此一舉,除了麻煩也對改善LAG無益
除非你完全摒棄用內建事件內容去架構你的系統,完全只靠Scripts

你舉的def xxx看你def xxx是建構在哪個class?
假設你是寫在class Game_Character
那麼你可以寫在class Game_Character的def update裡作執行
例:
代碼:

# 變數1>0時執行xxx
if $game_variables[1] > 0
 xxx
end
如果你def xxx是寫在class Game_Battler
那相同在class Game_Character的def update裡作執行....
代碼:

# 帶頭角色存在時
if $game_party.actors[0] != nil
  # 變數1不等於帶頭角色ID時
  if $game_variables[1] != $game_party.actors[0].id
    # 變數1寫入帶頭角色ID
    $game_variables[1]= $game_party.actors[0].id
    # 執行xxx
    $game_party.actors[0].xxx
  end
end
將一些原本在事件裡判斷的直接寫在腳本裡是解決LAG的方法之一,但不是絕對
例如你在每一禎重複使用到迴圈處理大量運算或者是重複刷新圖像文字等都會造成LAG
用一些條件分歧去做判斷當沒必要就不要去執行某些運算

像我之前在作改正時攻擊型態判定與跟隨系統寫的很嚴謹導致運算過於繁複LAG
所以後來把判定改寬鬆用腦殘式簡單判定與腦殘式跟隨就提昇了不少速度(相對也犧牲完整度)
另外我也刪了不必要的東西比如說小地圖
愚零鬥武多
愚零鬥武多
不正常人類研究中心自慰隊員
不正常人類研究中心自慰隊員

文章數 : 421
注冊日期 : 2008-04-06

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  丘 周四 8月 21, 2008 11:41 pm

所以沒有自創CLASS來做回圈嗎?

必須使用特定CLASS有UPDATE來使用?

我大約懂意思

必須找出原本最先定義的地方直接使用

而不是使用內建指令來做

每定義一次就增加一點LAG

而內建指令是不斷定義與整合所變成的嗎?

還有一個不解的問題

舉例

class Game_Character
def passable?(x, y, d)
# 求得新的座標
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
end
end

請問定義與()的使用方法
丘
拿著衝鋒槍瘋狂掃射的瘋子
拿著衝鋒槍瘋狂掃射的瘋子

文章數 : 146
注冊日期 : 2008-05-21
年齡 : 33
來自 : 台北中和

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  雲的彼方 周五 8月 22, 2008 12:07 pm

無筆劃丘 寫到:所以沒有自創CLASS來做回圈嗎?

必須使用特定CLASS有UPDATE來使用?

我大約懂意思

必須找出原本最先定義的地方直接使用

而不是使用內建指令來做

每定義一次就增加一點LAG

還有一個不解的問題

舉例

class Game_Character
def passable?(x, y, d)
# 求得新的座標
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
end
end

請問定義與()的使用方法

而內建指令是不斷定義與整合所變成的嗎?

loop do
要循環的處理
end

這樣他就會一直跑
不過如果你沒有更新畫面
過一下子之後
遊戲就會自動結束喔
只要打上
Graphics.update
他就會更新畫面囉
一般的loop迴圈都會加上這段

除非裡面執行的東西
不是要顯示在遊戲裡面的
但這樣的話自己要想好要怎麼中斷
if 變數 布林 結果
break
end

我之前不知道在哪裡看到的
他說超過多久沒更新
他就會認為是繳本怎麼樣
然後關閉程式

必須使用特定CLASS有UPDATE來使用?
某類#update方法
方法都是自己定義的喔
RGSS也有內建很多方法拉...
他會執行這個方法是因為
上面的main裡面有一個無限回圈
一直執行這個方法

每定義一次就增加一點LAG
這個我也不知道
定義方法會不會增加記憶體(我想應該不會...)
一般使用方法才會

尤其是open或是計算某些很大的數
譬如說10000**10000...

必須找出原本最先定義的地方直接使用
而不是使用內建指令來做
上面說過了...
自己定義就可以了

class Game_Character
def passable?(x, y, d)
# 求得新的座標
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
end
end
請問定義與()的使用方法

遊戲內他內建的使用方法是
$game_character = Game_Character.new
看你要使用哪個變數帶入他了
要使用這個類
一定要用
別問我...
我也不知道為啥...
Object#new
Game_Character.new
使用這個方法只要打上
$game_character.passable?(X座標, Y座標, 下左右上(2468))
不過遊戲內不是這樣執行

而內建指令是不斷定義與整合所變成的嗎?
這個你應該是說對了...

雲的彼方
拿著木劍的戰士
拿著木劍的戰士

文章數 : 48
注冊日期 : 2008-08-09

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  愚零鬥武多 周五 8月 22, 2008 4:30 pm

無筆劃丘 寫到:所以沒有自創CLASS來做回圈嗎?
必須使用特定CLASS有UPDATE來使用?
我大約懂意思
必須找出原本最先定義的地方直接使用
而不是使用內建指令來做
每定義一次就增加一點LAG
而內建指令是不斷定義與整合所變成的嗎?
還有一個不解的問題
舉例
class Game_Character
def passable?(x, y, d)
# 求得新的座標
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
end
end
請問定義與()的使用方法
自創class做迴圈?應該沒那個必要....從之前您的提問看來您的企劃應該是做ARPG類的
你應該好好搞懂一下運作原理....以下教學有點長請有耐心看完。

既然是ARPG類的必定和Game_Character類脫不了關係
其中class Game_Map在一開始setup的時候就生成class Game_Event存在@events裡
在遊戲一被啟動就生成class Game_Player並存在$game_player實體....

Game_Player與Game_Event都是Game_Character的子類,你可以把它們都看成一樣就是代表事件本身。
Game_Character的update就是"每禎都會被執行一次,除非核心$scene不是Scene_Map(處理地圖)才跳出循環執行"。
因為class Scene_Map每禎update $game_map與$game_player
$game_map裡的 def update就有寫同步update Game_Event
代碼:

    # 更新地圖事件
    for event in @events.values
      event.update
    end
Game_Map裡的@events就是代表事件(class Game_Event)的集合Hash表,後面用.update
就會指向Game_Character 2的def update
$game_player.update一樣指向Game_Character 2的def update
為何會這樣?因為Game_Character是代表事件類別的父類,所以身為子類的Game_Player與Game_Event
不需要再重定義一次update
直接由父類去執行def update的內容除非有特殊需求。
所以為何教你寫在def update裡?因為他每禎都會被執行一次,就等同於平行事件的原理一樣。

至於平行事件運作的原理請在Game_Event的最後找到
代碼:

  #--------------------------------------------------------------------------
  # ● 更新畫面
  #--------------------------------------------------------------------------
  def update
    super
    # 自動啟動事件判斷
    check_event_trigger_auto
    # 平行處理有效的情況下
    if @interpreter != nil
      # 不在執行中的場合的情況下
      unless @interpreter.running?
        # 設定事件
        @interpreter.setup(@list, @event.id)
      end
      # 更新編譯器
      @interpreter.update
    end
  end
其中super的意思就是當子類也寫了同樣的定義(def update)用super可以直接引用他的父類也就是
Game_Character 2的def update內容,
在此不用再寫一次。白話一點就是Game_Character 2的def update執行完接著會執行super後的CODE
當事件本身的平行處理變數@interpreter != nil會先生成一個平行事件處理@interpreter.setup(@list, @event.id)
然後每次當事件每禎update一次時同時@interpreter.update....
這就是事件本身平行處理的運作原理。

然而RM為了使用人性化指令介面,使用了class Interpreter這個特殊類別做為視窗編輯器與程式碼溝通的橋樑
你可以去看一下Interpreter 1也有一個def update,裡頭使用
代碼:

  #--------------------------------------------------------------------------
  # ● 更新畫面
  #--------------------------------------------------------------------------
  def update
    # 初始化循環計時數值
    @loop_count = 0
    # 循環
    loop do
      # 循環計時數值加 1
      @loop_count += 1
      # 如果執行了 100 個事件指令
      if @loop_count > 100
        # 為了防止系統停止、取用 Graphics.update
        Graphics.update
        @loop_count = 0
      end
      ..........

     

      # 嘗試執行事件列表、返回值為錯誤(false)的情況下
      if execute_command == false
        return
      end
      # 推進索引
      @index += 1
    end
  end
其中execute_command就是代表執行內建指令寫的一條一條指令(操作開關變數,條件分歧的等等)
會何平行事件會造成LAG的原因就在此
假設一個事件裏寫了10行指令,那麼就表示事件每update一次就會執行這10行指令(因為他用loop do)
然而class Interpreter所執行處理並不是很有效率的處理法,會做大量的參數判斷,
這樣做是為不懂程式碼的使用者所設計的,就是把簡單的內建指令轉程式碼。
也因此這裡做了一些判斷或轉換需要時間處理,假設地圖上有10個平行事件,每個事件裏寫了10行指令
那總共每禎要執行10*10=100次的 Interpreter運行....平性事件多與平行事件內建指令寫的多LAG情況就可想而知了....

那麼如果你懂得一些RGSS代碼,為何要用效率不佳的平行事件作為你的系統核心?
當然直接寫在Game_Event或Game_Player裡最好。
例如假設你定義敵人事件,要去偵測與主角間的距離去改變移動模式,你可以在Game_Event裡用
代碼:

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 更新畫面
  #--------------------------------------------------------------------------
  def update
    super
    # 自動啟動事件判斷
    check_event_trigger_auto
    # 測量與主角距離並改變移動模式
    check_player_range($game_variables[10],$game_variables[11])
    # 平行處理有效的情況下
    if @interpreter != nil
      # 不在執行中的場合的情況下
      unless @interpreter.running?
        # 設定事件
        @interpreter.setup(@list, @event.id)
      end
      # 更新編譯器
      @interpreter.update
    end
  end
  #--------------------------------------------------------------------------
  # ● 測量與主角距離並改變移動模式(警戒開始距離,停止警戒距離)
  #--------------------------------------------------------------------------
  def check_player_range(range1,range2)
    # 判斷地圖ID去決定敵人事件
    case $game_map.map_id
    when 1 # 1號地圖時
      # 如果事件本身ID不是1或3或5或7就不是敵人事件,強制返回
      unless [1,3,5,7].include?(@id)
        return
      end
    when 2 # 2號地圖時
      # 如果事件本身ID不是2或3或4就不是敵人事件,強制返回
      unless [2,3,4].include?(@id)
        return
      end
    else # 沒被定義到的地圖ID就強制返回(代表不在戰鬥用地圖之內此功能就不執行)
      return
    end 
    # 初始化@player_temp_x
    @player_temp_x = $game_player.x if @player_temp_x == nil
    # 初始化@player_temp_y
    @player_temp_y = $game_player.y if @player_temp_y == nil
    # 主角沒有移動的情況下,強制返回
    if @player_temp_x == $game_player.x && @player_temp_y == $game_player.y
      return
    end
    # 寫入主角座標
    @player_temp_x = $game_player.x
    @player_temp_y = $game_player.y   
    # 計算與主角的步數
    step = (@x-$game_player.x).abs+(@y-$game_player.y).abs
    # 與主角的距離小於range1時,設置成接近主角
    if step < range1
      @move_type = 2
    # 與主角的距離大於range2時,設置成不移動 
    elsif step > range2
      @move_type = 0
    end
  end 
end

def check_player_range(range1,range2)
你所質疑的定義def XXXX後面加括號就是在定義函數時同步帶入參數做運算子的意思
上面的案例在Game_Event每禎update時去執行check_player_range($game_variables[10],$game_variables[11])
也就是將def check_player_range的一個局部變量range1=$game_variables[10]的值
將def check_player_range的一個局部變量range2=$game_variables[11]的值
當step < range1(等同與主角的距離小於$game_variables[10]時),將事件的@move_type = 2(接近)
當step > range2(等同與主角的距離大於$game_variables[11]時),將事件的@move_type = 0(不移動)

上面這個例子做了多重檢查(事件ID檢查.主角移動檢查.距離檢查),如果其中一個沒達到條件就強制返回....
這樣就算每禎都執行到這個函數,但條件不足的事件幾乎都沒多執行些什麼,
這個範例程式很短所以你不會感覺到什麼差異,但程式一長需要做複雜運算之前你先用條件分歧作判斷,
把不符規定的擋下來就可以避免許多不必要的多餘運算。

假設1號地圖的1號事件開始條件是設為按確定鍵,事件內容什麼都不用寫,
只要主角移動到警戒範圍就會追擊;遠離一定範圍就會待機....
不用設置為平行處理直接寫在Scripts一樣有平行處理的效果,而且執行效能絕對比寫在事件裏要佳。
但最重要還是製作者自己的撰寫風格,防止不必要的大量運算就能減少LAG。
愚零鬥武多
愚零鬥武多
不正常人類研究中心自慰隊員
不正常人類研究中心自慰隊員

文章數 : 421
注冊日期 : 2008-04-06

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  丘 周六 8月 23, 2008 12:05 am

我聽懂了~
代碼:
舉例
@interpreter.setup(@list, @event.id)
此為
  def setup(list, event_id)
    # 清除註釋器的內部狀態
    clear
    # 記憶地圖 ID
    @map_id = $game_map.map_id
    # 記憶事件 ID
    @event_id = event_id
    # 記憶執行內容
    @list = list
    # 初始化索引
    @index = 0
    # 清除分歧資料用複述
    @branch.clear
  end

()內的變數執行時可做判定且可代替任何東西

而平行處理~處理然是不斷更新編譯器達到的效果~而且替代繁複~

馬上得成果配合滑鼠系統

class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● 系統畫面
#--------------------------------------------------------------------------
def check_event_range(range_x,range_y)
@range_x = ($mouse_x - screen_x)
@range_y = ($mouse_y - screen_y)
if @range_x > -50 && @range_x < 50 && @range_y > -50 && @range_y < 50
p @range_x
p @range_y
end
end
#--------------------------------------------------------------------------
# ● 更新畫面
#--------------------------------------------------------------------------
def update
super
# 自動啟動事件判定
check_event_trigger_auto
# 系統畫面
check_event_range(@range_x,@range_y)
# 並行處理有效的情況下
if @interpreter != nil
# 不在執行中的場合的情況下
unless @interpreter.running?
# 設定事件
@interpreter.setup(@list, @event.id)
end
# 更新解釋器
@interpreter.update
end
end
end
丘
拿著衝鋒槍瘋狂掃射的瘋子
拿著衝鋒槍瘋狂掃射的瘋子

文章數 : 146
注冊日期 : 2008-05-21
年齡 : 33
來自 : 台北中和

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  丘 周六 8月 23, 2008 10:37 am

請教一個問題

請問用RGSS寫顯示圖片為什麼比內建指令還要慢?

且我看過內建指令顯示圖片的定義

那位甚麼 Game_picture 使用在 Game_screen 中

卻沒有 <

是不是顯示圖片的內建指令並不是顯示圖片而是再SCREEN理的數據替換值?

利用統一回圈?

不知道怎麼竄起來的

而說明書的模組~好像也沒寫道
丘
拿著衝鋒槍瘋狂掃射的瘋子
拿著衝鋒槍瘋狂掃射的瘋子

文章數 : 146
注冊日期 : 2008-05-21
年齡 : 33
來自 : 台北中和

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  雲的彼方 周六 8月 23, 2008 1:40 pm

無筆劃丘 寫到:請教一個問題

請問用RGSS寫顯示圖片為什麼比內建指令還要慢?

且我看過內建指令顯示圖片的定義

那位甚麼 Game_picture 使用在 Game_screen 中

卻沒有 <

是不是顯示圖片的內建指令並不是顯示圖片而是再SCREEN理的數據替換值?

利用統一回圈?

不知道怎麼竄起來的

而說明書的模組~好像也沒寫道

Game_screen類裡面有寫到

def initialize
@tone = Tone.new(0, 0, 0, 0)
@tone_target = Tone.new(0, 0, 0, 0)
@tone_duration = 0
@flash_color = Color.new(0, 0, 0, 0)
@flash_duration = 0
@shake_power = 0
@shake_speed = 0
@shake_duration = 0
@shake_direction = 1
@shake = 0
@pictures = [nil]
for i in 1..100
@pictures.push(Game_Picture.new(i))
end
@weather_type = 0
@weather_max = 0.0
@weather_type_target = 0
@weather_max_target = 0.0
@weather_duration = 0
end

雲的彼方
拿著木劍的戰士
拿著木劍的戰士

文章數 : 48
注冊日期 : 2008-08-09

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  愚零鬥武多 周日 8月 24, 2008 3:46 pm

無筆劃丘 寫到:
馬上得成果配合滑鼠系統

class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● 系統畫面
#--------------------------------------------------------------------------
def check_event_range(range_x,range_y)
@range_x = ($mouse_x - screen_x)
@range_y = ($mouse_y - screen_y)
if @range_x > -50 && @range_x < 50 && @range_y > -50 && @range_y < 50
p @range_x
p @range_y
end
end
#--------------------------------------------------------------------------
# ● 更新畫面
#--------------------------------------------------------------------------
def update
super
# 自動啟動事件判定
check_event_trigger_auto
# 系統畫面
check_event_range(@range_x,@range_y)
# 並行處理有效的情況下
if @interpreter != nil
# 不在執行中的場合的情況下
unless @interpreter.running?
# 設定事件
@interpreter.setup(@list, @event.id)
end
# 更新解釋器
@interpreter.update
end
end
end
這樣寫有點怪怪的@@
應該寫成這樣才有意義
代碼:

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 系統畫面
  #--------------------------------------------------------------------------
  def check_event_range(max,min)
    range_x = ($mouse_x - screen_x)
    range_y = ($mouse_y - screen_y)
    if range_x > min && range_x < max && range_y > min && range_y < max
      p range_x
      p range_y
    end
  end
  #--------------------------------------------------------------------------
  # ● 更新畫面
  #--------------------------------------------------------------------------
  def update
    super
    # 自動啟動事件判定
    check_event_trigger_auto
    # 開關1控制最大值和最小值
    a = $game_switches[1] == true ? 50 : 100
    b = $game_switches[1] == true ? -50 : -100
    # 系統畫面
    check_event_range(a,b)
    # 並行處理有效的情況下
    if @interpreter != nil
      # 不在執行中的場合的情況下
      unless @interpreter.running?
        # 設定事件
        @interpreter.setup(@list, @event.id)
      end
      # 更新解釋器
      @interpreter.update
    end
  end
end
@range_x,@range_y這兩個實體變數與你定義的def xxxx都同屬同一個類別Game_Event時
在Game_Event的類別的任何函數內都可以任意呼叫@range_x,@range_y
你用check_event_range(@range_x,@range_y)去帶入實體變數做運算子算是多此一舉
若只是單純的要把實體變數或全局變數跟定值做比較是不需要用def xxxx後面加()的定義方式

要加()的時機是指"某些特殊狀況要帶入不一樣的參數做運算時"
也就是說你要帶入該函數做運算的參數不是固定值而是要經過計算或判斷的變動值
例如我寫的範例就是當開關1off時使判定範圍a,b從50加大到100變大了
如果你的距離都固定跟50比較則def後面這個()可以不用加
愚零鬥武多
愚零鬥武多
不正常人類研究中心自慰隊員
不正常人類研究中心自慰隊員

文章數 : 421
注冊日期 : 2008-04-06

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  愚零鬥武多 周日 8月 24, 2008 4:15 pm

無筆劃丘 寫到:請教一個問題

請問用RGSS寫顯示圖片為什麼比內建指令還要慢?
樓上雲的彼方已經解釋過Game_Screen與Game_Picture的關係,在此我也補充一些....
並不是RGSS寫顯示圖片比內建指令還要慢
而是內建已經將圖片生成所需的精靈(Sprite)先行製作出來並佔用記憶體....

你可以在class Spriteset_Map的42~47行找到
代碼:

    # 製作圖片
    @picture_sprites = []
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
        $game_screen.pictures[i]))
    end
其中的Sprite_Picture.new就是對應到class Sprite_Picture < Sprite
在RGSS裡Sprite_Picture就是Sprite的子類
所以等同在地圖運行時他生成了50個Sprite_Picture.new
只有當Sprite_Picture記憶的圖檔名@picture_name跟Game_Picture所給他的參數@picture.name不同時
他才會去執行圖像的改變....

也就是Sprite_Picture的預先生成Sprite,
不顯示圖像的時候把Sprite的visible = false(設為不可見)
要顯示圖像的時候把Sprite的visible = true(設為可見),然後直接去改變對應的圖像參數bitmap,
所以這種做法可以做到高速化
內建RGSS的行走圖圖像.戰鬥者圖像.戰鬥動畫圖像都是使用一樣的原理

你也可以仿造此邏輯預先生成Sprite佔用記憶體就能達到高速顯示的效果,
只是最後不用時要記得要做釋放Sprite的動作(.bitmap.dispose)
愚零鬥武多
愚零鬥武多
不正常人類研究中心自慰隊員
不正常人類研究中心自慰隊員

文章數 : 421
注冊日期 : 2008-04-06

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  雲的彼方 周日 8月 24, 2008 5:48 pm

愚零鬥武多 寫到:
無筆劃丘 寫到:請教一個問題

請問用RGSS寫顯示圖片為什麼比內建指令還要慢?
樓上雲的彼方已經解釋過Game_Screen與Game_Picture的關係,在此我也補充一些....
並不是RGSS寫顯示圖片比內建指令還要慢
而是內建已經將圖片生成所需的精靈(Sprite)先行製作出來並佔用記憶體....

你可以在class Spriteset_Map的42~47行找到
代碼:

    # 製作圖片
    @picture_sprites = []
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
        $game_screen.pictures[i]))
    end
其中的Sprite_Picture.new就是對應到class Sprite_Picture < Sprite
在RGSS裡Sprite_Picture就是Sprite的子類
所以等同在地圖運行時他生成了50個Sprite_Picture.new
只有當Sprite_Picture記憶的圖檔名@picture_name跟Game_Picture所給他的參數@picture.name不同時
他才會去執行圖像的改變....

也就是Sprite_Picture的預先生成Sprite,
不顯示圖像的時候把Sprite的visible = false(設為不可見)
要顯示圖像的時候把Sprite的visible = true(設為可見),然後直接去改變對應的圖像參數bitmap,
所以這種做法可以做到高速化
內建RGSS的行走圖圖像.戰鬥者圖像.戰鬥動畫圖像都是使用一樣的原理

你也可以仿造此邏輯預先生成Sprite佔用記憶體就能達到高速顯示的效果,
只是最後不用時要記得要做釋放Sprite的動作(.bitmap.dispose)

Sprite.dispose不是比較好嗎??

雲的彼方
拿著木劍的戰士
拿著木劍的戰士

文章數 : 48
注冊日期 : 2008-08-09

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  愚零鬥武多 周日 8月 24, 2008 9:14 pm

雲的彼方 寫到:
Sprite.dispose不是比較好嗎??
我的意思是這樣....
代碼:

class Sprite_Picture < Sprite
  #--------------------------------------------------------------------------
  # ● 釋放所佔的記憶體空間
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end
    super
  end
end

# 生成
@test = Sprite.new
@test.bitmap = RPG::Cache.picture(file_name)
# 釋放
@test.bitmap.dispose
@test.dispose

其實比較佔記憶體的是bitmap(圖像類別),兩個都要釋放比較好
愚零鬥武多
愚零鬥武多
不正常人類研究中心自慰隊員
不正常人類研究中心自慰隊員

文章數 : 421
注冊日期 : 2008-04-06

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  丘 周一 8月 25, 2008 8:09 pm

愚零鬥武多 寫到:
雲的彼方 寫到:
Sprite.dispose不是比較好嗎??
我的意思是這樣....
代碼:

class Sprite_Picture < Sprite
  #--------------------------------------------------------------------------
  # ● 釋放所佔的記憶體空間
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end
    super
  end
end

# 生成
@test = Sprite.new
@test.bitmap = RPG::Cache.picture(file_name)
# 釋放
@test.bitmap.dispose
@test.dispose

其實比較佔記憶體的是bitmap(圖像類別),兩個都要釋放比較好


所以~愚大的方法

是類似說明書的寫法

devil = Sprite.new
devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01")

但是......RPG::Cache.picture(file_name)這段不懂

RPG::Cache是處理模組的類別嗎?
丘
拿著衝鋒槍瘋狂掃射的瘋子
拿著衝鋒槍瘋狂掃射的瘋子

文章數 : 146
注冊日期 : 2008-05-21
年齡 : 33
來自 : 台北中和

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  雲的彼方 周二 8月 26, 2008 2:40 am

丘 寫到:
愚零鬥武多 寫到:
雲的彼方 寫到:
Sprite.dispose不是比較好嗎??
我的意思是這樣....
代碼:

class Sprite_Picture < Sprite
  #--------------------------------------------------------------------------
  # ● 釋放所佔的記憶體空間
  #--------------------------------------------------------------------------
  def dispose
    if self.bitmap != nil
      self.bitmap.dispose
    end
    super
  end
end

# 生成
@test = Sprite.new
@test.bitmap = RPG::Cache.picture(file_name)
# 釋放
@test.bitmap.dispose
@test.dispose

其實比較佔記憶體的是bitmap(圖像類別),兩個都要釋放比較好


所以~愚大的方法

是類似說明書的寫法

devil = Sprite.new
devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01")

但是......RPG::Cache.picture(file_name)這段不懂

RPG::Cache是處理模組的類別嗎?

RPG::Cache.picture是RGSS內建的方法
就是取得Graphics\Picture的圖片

RPG::Cache.picture("file_name")跟Bitmap.new("Graphics/Picture/file_name")是一樣的喔

路徑要以String的方式輸入要注意

在腳本裡要把\改成/
就是你從內容複製下來的路徑Graphics\Picture
要改成Graphics/Picture(這個你應該知道了...)

雲的彼方
拿著木劍的戰士
拿著木劍的戰士

文章數 : 48
注冊日期 : 2008-08-09

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  愚零鬥武多 周二 8月 26, 2008 10:14 am

丘 寫到:所以~愚大的方法

是類似說明書的寫法

devil = Sprite.new
devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01")

但是......RPG::Cache.picture(file_name)這段不懂

RPG::Cache是處理模組的類別嗎?

按F1說明檔找RPG::Cache,裡頭有詳細說明
愚零鬥武多
愚零鬥武多
不正常人類研究中心自慰隊員
不正常人類研究中心自慰隊員

文章數 : 421
注冊日期 : 2008-04-06

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  丘 周二 8月 26, 2008 8:30 pm

我看到了謝謝大大~

那請問

為什麼圖片不能改ZOOM_X的百分比呢?
丘
拿著衝鋒槍瘋狂掃射的瘋子
拿著衝鋒槍瘋狂掃射的瘋子

文章數 : 146
注冊日期 : 2008-05-21
年齡 : 33
來自 : 台北中和

回頂端 向下

如何減少LAG? Empty 回復: 如何減少LAG?

發表  雲的彼方 周二 8月 26, 2008 11:24 pm

丘 寫到:我看到了謝謝大大~

那請問

為什麼圖片不能改ZOOM_X的百分比呢?

#大於1放大小於1縮小
#浮點數...相差不要太大
#增加零點幾就差很多了
Sprite.zoom_x = 1
Sprite.zoom_y = 1

Tilemap類卻沒有這個功能
很討厭...

RMXP的說明書有介紹很多

雲的彼方
拿著木劍的戰士
拿著木劍的戰士

文章數 : 48
注冊日期 : 2008-08-09

回頂端 向下

回頂端


 
這個論壇的權限:
無法 在這個版面回復文章