2012-02-07 18 views
0

私は、ネットワーク上で受け取った情報に基づいて、画面上にいくつかの図面を作成するアプリケーションに取り組んでいます。 私の問題は、時にはそれらのイベントが、私が描くことができるレートよりも高く、遅れていることです。今問題は、遅れが発生するのではなく、遅延の種類が増えていることです。 マウスでクリックしてドラッグするなどのイベントに基づいて描画する場合、これは発生しません。イベントの配信方法が原因であると想定します。どのようにしてビューが "描画準備完了"であるかを知ることができます。なぜなら、ネットワークを介して受け取ったイベントのいくつかを破棄し、直近のイベントだけを描画できるからです。ココア図面の問題

今私はウィンドウの階層の「上」にある透明なウィンドウを持っています。 それぞれの描画操作の後に、画面のサイズであるNSImageに描画する描画が行われるビューに対してsetneedsdisplayinrect呼び出しを行います。ドローイングコールを受け取ると、汚れた矩形に含まれるイメージの部分が描画されます。 これを解決しようとする私の試みは、別のやり方を知らないので、ちょっとしたハックです。私は、それぞれのsetneedsが正しく表示された後にブール値をtrueに設定し、それをdrawrectでfalseに設定しました。私がブール値を無視した画像に描画する後続のイベントを取得した場合はtrueに設定されます。

これを行う他の代替手段はありますか?

キャッシュパスレイヤーを使用してパスを変更することを考えましたが、パスが大きくなるとどのように効率的なシェイプレイヤーが作成されるのかよく分かりません。私はまた、分離された(連続していない)パスの異なる部分に複数のシェイプレイヤーを使用することを考えましたが、図面をクリアしたい場合はレイヤーを削除して、多くの場合パフォーマンスホッグに気付きました。 私が考えることができる唯一の他の方法は、開いたglで描くことですが、OpenGLビュー(画面のサイズと透明)の性質を考慮すると、パフォーマンスの問題がどれくらいあるかはわかりません。

ヒントをいただければ幸いです。

ありがとうございました。

答えて

0

私はそれを考え出した:)

を私はメインディスパッチキューを使用してイベントを送信してネットワーク接続を管理対象オブジェクトから。どちらが私が理解しているから - 私はこれについて間違っているかもしれない - runloopの複数の反復にまたがることができます。私が必要としたのは、実行ループの各反復中にイベントをディスパッチし、ネットワーク接続を介して新しいイベントを取得するたびにメインrunloopを通知するカスタム実行ループソースを作成することでした。