dango_generator 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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