dango_generator 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -30,12 +30,7 @@ package org.rubyforge.dango {
30
30
  private var is_debug:Boolean; // Debugモードかどうかのフラグ
31
31
  private var is_connect:Boolean = false; // 接続完了しているかどうか
32
32
 
33
- private var receve_count:uint = 0; // データ受信回数
34
33
  private var frame_rate:uint = 24; // デフォルトのフレームレート(想定値)
35
- private var receive_cache:Array = []; // 受信データの一時保管用のキャッシュ
36
-
37
- private var recv_not_yet_size:uint = 0; // データ受信時のキャッシュサイズ
38
- private var recv_not_yet_str:String = ""; // データ受信時のキャッシュデータ
39
34
 
40
35
  private var polling_timer:Timer; // ポーリング(ハートビート)用タイマーの設定
41
36
  private var polling_timer_msec:uint = 5000; // ポーリング(ハートビート)用タイマーのミリ秒
@@ -44,9 +39,20 @@ package org.rubyforge.dango {
44
39
  private var delay_send_timer_msec:uint = 1500; // 遅延送信用のタイマーのミリ秒
45
40
  private var delay_send_cache:Array = []; // 遅延送信用のキャッシュ
46
41
 
47
- private var recv_timer_msec:uint; // 受信用タイマーの実行間隔
48
- private var recv_timer:Timer; // 受信用タイマーの追加
49
- private var recv_last_date:Date = new Date(); // 受信用処理落ちチェック用
42
+ private var receve_count:uint = 0; // データ受信回数
43
+ private var receive_row_cache:Array = []; // 受信データの一時保管用のキャッシュ
44
+
45
+ private var recv_not_yet_size:uint = 0; // データ受信時のキャッシュサイズ
46
+ private var recv_not_yet_str:String = ""; // データ受信時のキャッシュデータ
47
+
48
+ private var recv_wait_do_cache:Array = []; // 実行待ち受信キャッシュ
49
+ private var recv_cache_timer_msec:uint; // 受信キャッシュ用タイマーの実行間隔
50
+ private var recv_cache_timer:Timer; // 受信キャッシュ用タイマーの追加
51
+
52
+ private var recv_do_count_no:uint = 0; // 受信実行の回数
53
+ private var recv_do_timer_msec:uint; // 受信実行用タイマーの実行間隔
54
+ private var recv_do_timer:Timer; // 受信実行用タイマーの追加
55
+ private var recv_do_last_date:Date = new Date(); // 受信キャッシュ用処理落ちチェック用
50
56
 
51
57
  public var server_time:String = ""; // サーバーの時計
52
58
 
@@ -136,12 +142,19 @@ package org.rubyforge.dango {
136
142
  delay_send_timer.addEventListener(TimerEvent.TIMER, delay_send_callback); // イベントリスナーの発行
137
143
  delay_send_timer.start(); // タイマーの作動開始
138
144
 
139
- // fps用タイマーの設定(3フレームごとに動かすよう変更)
140
- recv_timer_msec = uint((1000 * 3) / frame_rate);
141
- if(is_debug){ trace("DangoClientFramework:recv_timer_msec:" + recv_timer_msec); }
142
- recv_timer = new Timer(recv_timer_msec, 0); // タイマーの追加
143
- recv_timer.addEventListener(TimerEvent.TIMER, recv_callback); // イベントリスナーの発行
144
- recv_timer.start(); // タイマーの作動開始
145
+ // 受信キャッシュ用タイマーの設定(4フレームごとに動かすよう変更)
146
+ recv_cache_timer_msec = uint((1000 * 4) / frame_rate);
147
+ if(is_debug){ trace("DangoClientFramework:recv_cache_timer_msec:" + recv_cache_timer_msec); }
148
+ recv_cache_timer = new Timer(recv_cache_timer_msec, 0); // タイマーの追加
149
+ recv_cache_timer.addEventListener(TimerEvent.TIMER, recv_cache_callback); // イベントリスナーの発行
150
+ recv_cache_timer.start(); // タイマーの作動開始
151
+
152
+ // 受信実行用タイマーの設定(2フレームごとに動かすよう変更)
153
+ recv_do_timer_msec = uint((1000 * 2) / frame_rate);
154
+ if(is_debug){ trace("DangoClientFramework:recv_do_timer_msec:" + recv_do_timer_msec); }
155
+ recv_do_timer = new Timer(recv_do_timer_msec, 0); // タイマーの追加
156
+ recv_do_timer.addEventListener(TimerEvent.TIMER, recv_do_callback); // イベントリスナーの発行
157
+ recv_do_timer.start(); // タイマーの作動開始
145
158
 
146
159
  // 接続完了のときに接続完了をサーバーに通知するためのハートビート送信
147
160
  var hb_id:String = make_heartbeat();
@@ -189,37 +202,6 @@ package org.rubyforge.dango {
189
202
  this.dispatchEvent(new DangoErrorEvent("DangoError", DangoErrorCode.IOError, msg));
190
203
  }
191
204
 
192
- /*
193
- //プログレスイベントの処理(呼び出し用イベントのディスパッチ)
194
- private function socketDataHandler(evt:ProgressEvent):void {
195
- receve_count ++;
196
- if(is_debug){ trace("DangoClientFramework:socketDataHandler:" + receve_count); }
197
- var receive_data:Object = this.receive_notice();
198
-
199
- if(recv_not_yet_size == 0){ // 未受信データが無ければ
200
- if(receive_data != {}){ // データが空なら無視する
201
- var notice_name:String = receive_data["notice"];
202
-
203
- if(notice_name == "_notice_sid"){ // 接続直後のsid通知なら
204
- this.sid = receive_data["_sid"];
205
- // if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + ":" + DangoUtil.now2str()); }
206
- if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + ":" + receve_count); }
207
-
208
- } else if(notice_name == "_heart_beat"){ // heart beat通知なら
209
- if(is_debug){ trace("DangoClientFramework:_heart_beat:" + receve_count); }
210
-
211
- } else { // 通常のデータならイベント発生
212
- if(is_debug){ trace("DangoClientFramework:dispatchEvent:dango_" + notice_name + ":" + receve_count); }
213
- this.dispatchEvent(new DangoReceiveEvent("dango_" + notice_name, receive_data));
214
- }
215
- } else { // データが空なら
216
- // if(is_debug){ trace("DangoClientFramework:receive_data is empty." + DangoUtil.now2str()); }
217
- if(is_debug){ trace("DangoClientFramework:receive_data is empty."); }
218
- }
219
- }
220
- }
221
- */
222
-
223
205
  // プログレスイベントの処理(呼び出し用イベントのディスパッチ)
224
206
  // とにかくキャッシュに入れるだけ
225
207
  private function socketDataHandler(evt:ProgressEvent):void {
@@ -227,7 +209,7 @@ package org.rubyforge.dango {
227
209
  if(is_debug){ trace("DangoClientFramework:socketDataHandler:" + receve_count + ":start:" + DangoUtil.now2str()); }
228
210
  var byte_array:ByteArray = new ByteArray;
229
211
  socket.readBytes(byte_array, 0, socket.bytesAvailable);
230
- receive_cache.push([byte_array, receve_count]);
212
+ receive_row_cache.push([byte_array, receve_count]);
231
213
  }
232
214
 
233
215
  // Event送出用
@@ -253,64 +235,78 @@ package org.rubyforge.dango {
253
235
 
254
236
 
255
237
  /**
256
- * recv_callback
257
- * フレームレート単位で動く処理(キャッシュにデータがあればデータ受信)
238
+ * recv_cache_callback
239
+ * 受信データの再構成とキャッシュをする
258
240
  *
259
241
  * @param evt:TimerEvent
260
242
  * @return void
261
243
  */
262
- public function recv_callback(evt:TimerEvent):void {
263
- // if(is_debug){ trace("DangoClientFramework:recv_callback:" + DangoUtil.now2str()); }
244
+ public function recv_cache_callback(evt:TimerEvent):void {
245
+ // if(is_debug){ trace("DangoClientFramework:recv_cache_callback:" + DangoUtil.now2str()); }
246
+
247
+ if(receive_row_cache.length > 0){
248
+ if(is_debug){ trace("DangoClientFramework:recv_cache_callback:receive_row_cache.length=" + receive_row_cache.length + ":" + DangoUtil.now2str()); }
249
+ var arr:Array = receive_row_cache.shift(); // Queueとして取り出し
250
+ var byte_array:ByteArray = arr[0];
251
+ var recv_c:uint = arr[1];
252
+ // if(is_debug){ trace("DangoClientFramework:recv_c=" + recv_c); }
253
+ var receive_data:Array = this.parse_notice(byte_array);
254
+
255
+ if(recv_not_yet_size == 0){ // 未受信データが無ければ、ひとつのデータ受信が完了とみなす
256
+ if(receive_data != []){ // データが空じゃなければ処理開始
257
+ for(var i:uint = 0; i < receive_data.length; i++){
258
+ var notice_name:String = receive_data[i]["notice"];
259
+ var recv_server_time:String = receive_data[i]["server_time"];
260
+
261
+ if(is_debug){ trace("DangoClientFramework:push recv_wait_do_cache:dango_" + notice_name + ": recv_c:" + recv_c + ":" + i + " recv_server_time:" + recv_server_time); }
262
+ recv_wait_do_cache.push([notice_name, receive_data[i], recv_server_time, recv_do_count_no]);
263
+
264
+ recv_do_count_no ++;
265
+ }
266
+ } else { // データが空なら
267
+ // if(is_debug){ trace("DangoClientFramework:receive_data is empty." + DangoUtil.now2str()); }
268
+ if(is_debug){ trace("DangoClientFramework:receive_data is empty."); }
269
+ }
270
+ }
271
+ }
272
+ }
273
+
274
+ /**
275
+ * recv_do_callback
276
+ * 受信データの実行する処理
277
+ *
278
+ * @param evt:TimerEvent
279
+ * @return void
280
+ */
281
+ public function recv_do_callback(evt:TimerEvent):void {
282
+ // if(is_debug){ trace("DangoClientFramework:recv_do_callback:" + DangoUtil.now2str()); }
264
283
 
265
284
  // 前回から時間がかかりすぎている(処理落ちしかけている場合は)スキップ
266
285
  var start_date:Date = new Date();
267
- // if(is_debug){ trace("DangoClientFramework:recv_last_date.time=" + recv_last_date.time + " start_date.time=" + start_date.time); }
268
- if(recv_last_date.time > start_date.time - (recv_timer_msec * 1.5)){
269
- if(receive_cache.length > 0){
270
- // while(receive_cache.length > 0){
271
- if(is_debug){ trace("DangoClientFramework:recv_callback:receive_cache.length=" + receive_cache.length + ":" + DangoUtil.now2str()); }
272
- var arr:Array = receive_cache.shift(); // Queueとして取り出し
273
- var byte_array:ByteArray = arr[0];
274
- var recv_c:uint = arr[1];
275
- if(is_debug){ trace("DangoClientFramework:recv_c=" + recv_c); }
276
- var receive_data:Array = this.receive_notice(byte_array);
277
-
278
- if(recv_not_yet_size == 0){ // 未受信データが無ければ、ひとつのデータ受信が完了とみなす
279
- if(receive_data != []){ // データが空じゃなければ処理開始
280
- for(var i:uint = 0; i < receive_data.length; i++){
281
- var notice_name:String = receive_data[i]["notice"];
282
- server_time = receive_data[i]["server_time"];
283
-
284
- if(notice_name == "_notice_sid"){ // 接続直後のsid通知なら
285
- this.sid = receive_data[i]["_sid"];
286
- if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + " recv_c:" + recv_c + " server_time:" + server_time); }
287
-
288
- } else { // 通常のデータならイベント発生
289
- if(is_debug){ trace("DangoClientFramework:dispatchEvent:dango_" + notice_name + ": recv_c:" + recv_c + ":" + i + " server_time:" + server_time); }
290
- this.dispatchEvent(new DangoReceiveEvent("dango_" + notice_name, receive_data[i]));
291
- }
292
- }
293
- } else { // データが空なら
294
- // if(is_debug){ trace("DangoClientFramework:receive_data is empty." + DangoUtil.now2str()); }
295
- if(is_debug){ trace("DangoClientFramework:receive_data is empty."); }
296
- }
297
- }
286
+ if(recv_do_last_date.time > start_date.time - (Number(recv_do_timer_msec) * 1.3)){
287
+ if(recv_wait_do_cache.length > 0){
288
+ var recv_arr:Array = recv_wait_do_cache.shift();
289
+ var notice_name:String = recv_arr[0];
290
+ var recv_data:Object = recv_arr[1];
291
+ server_time = recv_arr[2];
292
+ var count_no:uint = recv_arr[3];
298
293
 
299
- /*
300
- // 処理に時間がかかりすぎている場合は、スキップさせる(while用)
301
- if(is_debug){ trace("DangoClientFramework:recv_callback:end_date:" + DangoUtil.now2str()); }
302
- var end_date:Date = new Date();
303
- if(start_date.time < end_date.time - recv_timer_msec){
304
- if(is_debug){ trace("DangoClientFramework:break"); }
305
- break;
294
+ if(notice_name == "_notice_sid"){ // 接続直後のsid通知なら
295
+ this.sid = recv_data["_sid"];
296
+ if(is_debug){ trace("DangoClientFramework:this.sid=" + this.sid + " server_time=" + server_time); }
297
+
298
+ } else { // 通常のデータならイベント発生
299
+ if(is_debug){ trace("DangoClientFramework:dispatchEvent:dango_" + notice_name + " server_time=" + server_time); }
300
+ this.dispatchEvent(new DangoReceiveEvent("dango__before_filter", recv_data, count_no));
301
+ this.dispatchEvent(new DangoReceiveEvent("dango_" + notice_name, recv_data, count_no));
306
302
  }
307
- */
308
303
  }
309
304
  }
310
305
 
311
- recv_last_date = new Date();
306
+ recv_do_last_date = new Date(); // 前回の実行の終了時間の保持
312
307
  }
313
308
 
309
+
314
310
  /**
315
311
  * polling_callback
316
312
  * ハートビート用タイマーコールバック
@@ -357,7 +353,7 @@ package org.rubyforge.dango {
357
353
 
358
354
  for (i = 0; i < 5; i++) {
359
355
  if(delay_send_cache.length == 0) { break; }
360
- send_obj_dup = delay_send_cache.pop();
356
+ send_obj_dup = delay_send_cache.shift();
361
357
  // データをすぐ送信
362
358
  this.send_data_to_server(send_obj_dup);
363
359
  if(is_debug){ trace("DangoClientFramework:delay_send_callback:sent:" + DangoUtil.now2str()); }
@@ -439,12 +435,12 @@ package org.rubyforge.dango {
439
435
 
440
436
  /**
441
437
  * receive data from server.
442
- * フレームワーク側のデータ受信の一般処理
438
+ * データ受信のデータのパースなど
443
439
  *
444
440
  * @return Object
445
441
  */
446
- public function receive_notice(byte_array:ByteArray):Array {
447
- if(is_debug){ trace("DangoClientFramework:receive_notice:" + DangoUtil.now2str()); }
442
+ public function parse_notice(byte_array:ByteArray):Array {
443
+ if(is_debug){ trace("DangoClientFramework:parse_notice:" + DangoUtil.now2str()); }
448
444
 
449
445
  // 変数定義
450
446
  var recv_data_orig:String = "";
@@ -533,5 +529,15 @@ package org.rubyforge.dango {
533
529
  }
534
530
  }
535
531
 
532
+ /**
533
+ * dango_before_filter の雛形
534
+ * すべてのdango通知の前処理用のメソッド
535
+ * over writeすべし
536
+ *
537
+ * @param evt:DangoReceiveEvent
538
+ * @return void
539
+ protected function dango__before_filter(evt:Object):void {
540
+ }
541
+ */
536
542
  }
537
543
  }
@@ -5,17 +5,21 @@ package org.rubyforge.dango {
5
5
  public class DangoReceiveEvent extends Event {
6
6
  private var dango_type:String;
7
7
  public var receive_data:Object;
8
+ public var receive_count_no:uint;
8
9
 
9
- public function DangoReceiveEvent(type:String, receive_data_orig:Object,
10
+ public function DangoReceiveEvent(type:String,
11
+ receive_data_orig:Object,
12
+ receive_count_no_orig:uint,
10
13
  bubbles:Boolean = false,
11
14
  cancelable:Boolean = false) {
12
15
  dango_type = type;
13
16
  receive_data = receive_data_orig;
17
+ receive_count_no = receive_count_no_orig;
14
18
  super(type, bubbles, cancelable);
15
19
  }
16
20
 
17
21
  public override function clone():Event {
18
- return(new DangoReceiveEvent(dango_type, receive_data));
22
+ return(new DangoReceiveEvent(dango_type, receive_data, receive_count_no));
19
23
  }
20
24
  }
21
25
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dango_generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keisuke Minami
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-05-26 00:00:00 +09:00
12
+ date: 2008-06-15 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15