HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1016
ドッシーonkeyと動作速度がつりあわない4解決


ドッシー

リンク

2013/10/16(Wed) 04:08:06|NO.57625

チャットを作っています。
といってもhspsock等の通信はせずに、ネットワークで共有してるファイルを利用することで実現させているのですが・・
(メインルーチンはrepeat〜loopで1ターンごとに1秒間休みます。

文字の入力はinputによるオブジェクトで行います。
また、Enterキーで書き込むことができます。
つまりonkeyによってキー取得をしなければいけません。

タイピング速度が遅ければ気にならないのですが、自分が普通にタイピングをすると遅延が生じてしまいます。
一秒間に3度も4度(どのくらいかは計ってません)もonkeyによって同じサブルーチンを意味もなく繰り返すはめになっているからです。
現にonkeyを一時的に止めてみたところ遅延は全くなくなっていました。

快適な入力とキー取得の両方を実現したいのですが、自分にはその方法が思いつきませんでした。
何か妙案があれば教えてほしいです。

補足として
現在の構造だとメインルーチンで毎回1つのテキストデータ(0か1が入っている)を読み込んでいるので、(詳しい仕組みは知らないのですがおそらく)高速なファイル読み込みは良くないかと思います。なので今はawait 1000にしているわけですが・・
このファイル読み込みというのを省略したときにも遅延はなくなっていました。ですがファイル読み込み自体は外すことが出来ません・・
おそらくファイルを読み込みとonkeyによる割り込みが重なるときにラグが出来てしまうのだと推測していますが、解決方法が思いつきません。

このチャットのアプローチではこれが限界という結論を出す前に質問したというわけです。



この記事に返信する


check

リンク

2013/10/16(Wed) 08:04:08|NO.57626

>高速なファイル読み込みは……なので今はawait 1000にしているわけですが・・
意味がよくわからない。
なぜ最終的にはawait 1000にする必要があったんだ?

onkeyのルーチンはエンターキーが押された時にだけ実行して、
あとは弾けばいい(returnする)のでは?

毎秒ファイル読み込みを行うのは、パフォーマンスの低下につながるぞ。
ゲームなどでNow loadingなどと表示されるのは、読み込みに時間がかかるので、
何とかしてプレイヤーの気をそらそう(?)という苦肉の策だったりする。
(CDからでなくとも、HDDから読み込むのもCPUにとっては途方もなく時間がかかる行為)



ドッシー

リンク

2013/10/16(Wed) 14:54:15|NO.57632

説明不足だったかもしれません。
hspsock等を使わず別pc(家族間)でチャットを行えるプログラムを組みたいと思っていた際に思いついた方法が毎秒ファイル読み込みをすることなんです(^^;

大きな流れとしては以下の通りになってます。

onkey *keyjump
bload "hantei.txt",hantxt
han=hantxt

repeat
bload "hantei.txt",hantxt
if han!hantxt: han=hantxt:gosub ⇒<チャット内容の更新を行う>

(その他処理)

await 1000
loop

*keyjump
switch wparam
case 13 //enterキーでコメント送信
<もしinputオブジェクトの中身が入っていたら> gosub *AddMessage
swbreak
swend
return

*AddMessage
<inputの内容をチャットデータ用のテキストに追加して保存する>
hantxt^=1
bsave "hantei.txt",hantxt
return

流石に毎回チャットデータ自体を読み込んでるのはひどい負担がかかるので、チャットデータが変更されたことを伝えるhantxtを読み込んでます。

またユーザーのオンライン状況を把握するのに約30秒ごとに別のtxtファイルに自分のユーザー名を追加するという動作をさせてます。
別のプログラムを一つだけはしらせて、そのtxtファイルを読取りそのユーザーが"生きている"ことを把握する仕組みにしています。
その関係でawaitは1000が都合が良かったんです。
もっと遅くしてもいいですがそうすると、チャットが更新されていても機敏に気づいてくれません。
速くしすぎはcheckさんの言うとおりパフォーマンス的によろしくないですし・・。

>>onkeyのルーチンはエンターキーが押された時にだけ実行して、
>>あとは弾けばいい(returnする)のでは?
*keyjumpの中身をなくしてreturnだけにしてみたのですが、それでも遅延が生じます。
onkeyによる割り込み自体が遅延を生んでしまうみたいです。



MillkeyStars

リンク

2013/10/16(Wed) 15:37:58|NO.57633

そもそも生存確認するだけなら、タイマー管理で一定時間毎にビーコン送ればいいのでは?
チャット内容の更新も、通信の受信を待機するだけでいいので、CPUの負荷にならない程度に
ループで待機するってのが原則かと。

このチャットって基本的に P2P 形式だよね?
P2P 形式の場合は、接続者の情報を相互に共有すればいいわけだから、新しいユーザが参加した場合に
新しいユーザ宛に、元々の参加ユーザの接続者の情報(IPアドレス)を教えてあげればいいだけ。
それを新しいユーザが情報を構築すればいい。

check さんも言うように、物理読み込み装置は、時間がかかる行為+寿命を減らす行為なので、
できる限り行わない方がいい。



ドッシー

リンク

2013/10/16(Wed) 16:10:18|NO.57634

素直に通信したほうが良いんですね。
助言ありがとうございました。
この方法でのチャットはここまでにしておきます^^



ONION software Copyright 1997-2023(c) All rights reserved.