問題タブ [cadisplaylink]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
195 参照

ios - IOSプログラミングでのモデルとビュー間のデータ通信

私はiPhoneの横スクロールビデオゲームをゼロから構築しています。敵の腕と脚の位置を変更する必要がある敵モデルがあります。これらの変更を表示用のビューに通知する必要があります。モデル内でNSTimerを使用してこれらの位置を変更し、ViewControllerにKVOに基づいてこれらの変更を監視させ、ViewControllerに情報をViewに送信させ、ViewにsetNeedsDisplayを呼び出す必要がありますか?当然、可能な限り最速のフレームレートを実現したいと考えています。

0 投票する
2 に答える
328 参照

iphone - CADisplayLink を持つ別のメソッドからメソッドを 1 回呼び出す

メソッド 'method1' から別のメソッド 'method2' を呼び出したいと思います。問題は、「method1」に CADisplayLink があり、「method1」から「method2」を呼び出したい場合、6Ofps で呼び出すため、1 秒あたり 60 回呼び出しますが、1 回呼び出すだけです。BOOL 変数を使用する必要があることはわかっていますが、その使用方法がわかりません。誰でも私を助けることができますか?私の英語で申し訳ありませんが、私はフランス人です:/

//編集: method1 に CADisplayLink があります:

}

そのため、「leScore % 20000 == 0」のたびにメソッドを 1 回呼び出す 2.

0 投票する
6 に答える
11616 参照

iphone - CADisplayLink を正しく停止および再開する方法は?

CADisplayLink に大きな問題があることがわかりました。

テスト用に回転する三角形を描画する OpenGL ES 1.1 を使用した最も基本的な EAGLLayer があります。これには、画面のリフレッシュ レートで実行ループ メソッドを呼び出す必要があるため、次のように実行ループを開始します。

テスト アプリが起動したら、-startRunloop を呼び出します。画面をタップすると、-stopRunloop が呼び出されます。もう一度タップすると、-startRunloop が呼び出されます。などなど。卓球。

-drawFrame メソッドが 20 秒間に呼び出される頻度を測定し、NSLog します。

  • FIRST の開始 / 停止サイクルは常に 100% で実行されます。最大フレームレートを取得します。

  • すべての SUBSEQUENT 開始/停止サイクルは、パフォーマンスの約 80% しか示していません。フレームレートが大幅に低下します。ただし: 常にほぼ同じで、+/- 2 フレームです。さらに50回の始動/停止サイクルの後でも、さらに劣化する傾向はありません。

結論として、無効にするか一時停止するまでは、上記のように CADisplayLink を作成しても問題ありません。その後、新しい CADisplayLink はうまく機能しなくなります。新しく、以前とまったく同じ方法で作成された場合でも。-setPaused: メソッドを YES / NO で呼び出して一時停止 / 再開する場合も同様です。

Allocations と VM Tracker Instruments でメモリ管理の問題がないことを確認しました。また、CADisplayLink の -invalidate メソッドが実際に呼び出されることも確認しました。

デバイスの iOS 4.0 (iPhone 4)。

何故ですか?何か不足していますか?

0 投票する
0 に答える
151 参照

ios - iOS: Default.png と最初の OpenGL ES フレームの間の灰色の画面

以前の openGL iPhone アプリを移植して、CADisplayLink を使用する Xcode の新しい OpenGL ES テンプレートを使用しようとしています。

私が気づいたのは、Default.png が表示された後、最初のフレームが描画される前に、アプリが最初のフレームで読み込みを処理している間、その間に灰色の画面があることです。

最初のフレームを描画する準備ができるまで、Default.png 表示を拡張するにはどうすればよいですか?

0 投票する
1 に答える
3738 参照

ios5 - RunLoop の CADisplayLink がコールバックを呼び出していない

drawFrame をすべてのフレームで呼び出す必要がある次のコードがありますが、そうではありません。

dispayLink は CADisplayLink へのポインタです。それらは私のビューのラベルに接続されています。このビューは、viewReference に接続されています。self は ViewController です。drawFrame が宣言されている

l.text は、viewDidLoad でテストするときに設定できます。

drawFrame が呼び出されないようです。このアプリケーションは、カスタム ストーリーボード ファイルを含む Xcode 4.2 の空のアプリケーション テンプレートに基づいています (作成時にストーリーボードの使用を選択するのではなく、後で追加しました)。ビューコントローラー、ビュー、ラベル以外は空です。

私はこれが初めてです。[[NSRunLoop currentRunLoop] run] を呼び出すと、iOS 5.0 シミュレーターにアプリがまったく表示されません。いずれにせよ、 currentRunLoop はデフォルトのメイン runLoop である必要があります。

0 投票する
1 に答える
4131 参照

iphone - Core Graphics と CADisplayLink のみを使用した画像アニメーションの例

Core Graphics と CADisplayLink (UIKit、CAANimation、CALayer ではない) を使用した画像アニメーション (ファイルからの画像を使用したアニメーション) の例を探しています。本当の低レベルのもの。そのような例を知っている人はいますか?

ありがとう。

0 投票する
0 に答える
976 参照

iphone - iOS上のOpenGLESでのCADisplayLinkの精度の問題

私のiOSゲームは現在、OpenGLレンダリング操作のタイミングにCADisplayLinkを使用しています。GPUへのすべてのOpenGLレンダリングと状態呼び出しを発行する2番目のスレッドで実行されているGCDディスパッチキューがあります。タイミングが完璧ではないことを除いて、すべてが正常に機能します。アニメーションの間隔を1(60Hz)から2(30Hz)に変更しても、フレームのスキップやグリッチが発生することがあります。

CADisplayLinkは、メインスレッドのRunLoopからセレクターを呼び出します。つまり、メインスレッドが処理している他のディスパッチされたジョブと入力イベントの間でのみセレクターを起動できます。(これらのジョブ/イベントをログに記録することで、これが当てはまることを確認しました)。これらの操作に数ミリ秒かかる場合、CADisplayLinkは、メインスレッドで現在実行されているものを中断できないため、完全に正確になることはありません。ほとんどのゲームがそうであるように、私はゲームシミュレーション、物理学、およびシーンカリングをメインスレッドで実行しています。

ですから、私が考えているのは、タッチイベントとCADisplayLinkが可能な限り近くで起動できるように、すべてのゲームシミュレーションと物理学のものをメインスレッドから移動する必要があるということです。しかし、これで何かが解決するかどうかはわかりませんし、些細な作業でもありません。

presentRenderBuffer呼び出しは実際にはフレームを実際のハードウェア表示と同期させるものなので、必要なのは、それ自体のスレッドで(おそらくより高い優先度で)実行してレンダリングをトリガーできる本当に正確なタイマーだけかもしれません。そのように。その後、すべてをメインスレッドに保持できます。CADisplayLinkが提供するのは、コードが60Hzより速く実行されている場合に待機する方法のようです。したがって、別のスレッドを使用して、同様の種類の遅延を簡単にコーディングできるようです。ここで何が欠けていますか?

0 投票する
0 に答える
128 参照

iphone - メインスレッドと NSThread の間でスケジューリングがどのように機能するかを誰かに説明してもらえますか?

たとえば、pthreads から SCHED_FIFO や SCHED_RR などを実行していますか? スケジュール ポリシーは変更できますか? メインスレッドと NSThread に優先順位を割り当てることはできますか?

最終的には、CADisplayLink を使用してメイン スレッドを 30 Hz で実行したいと考えています。さらに、NSThread はより低い優先度で実行されます。理想的には、メイン スレッドが NSThread を先取りして 30 Hz を維持します。これが可能かどうかはわかりません。

0 投票する
1 に答える
2242 参照

iphone - UIScrollViewを追跡するときに、NSRunLoopCommonModesを使用したCADisplayLinkがすべてのフレームに対して実行されませんか?

通常の(OpenGL以外の)iPhoneアプリのすべてのフレームで小さなコードを実行しようとしています。目標は、フレームカウンターを用意して、アプリの低速ポイントがどこにあるかを(推測ではなく)測定して修正し、ユーザーエクスペリエンスを向上させることです。

これまでに行ったことは、すべてのモード(追跡を含む)にCADisplayLinkを登録することです。

実行されるコードは次のようになります(lastDrawはNSDate *であり、intをカウントします)。

ここでの考え方は、過去1秒間に描画されたフレームの数に関して1秒ごとに更新を取得することです。

これは問題なく機能しているように見えますが、UIScrollViewでスクロールすると、数字は間違いなくオフになります。普通の人のようにスクロールするだけなら、フレームレートは理にかなっているようです。ただし、上下に激しくスクロールすると、表示されるレートは1または2 fpsに低下しますが、1秒に1つだけではなく、明らかに多くのフレームが描画されます。

このようにフレームメソッドを変更すると、次のようになります。

スクロールすると、発生するイベントが非常に少ないことが明らかになります。

UIScrollViewsとNSRunLoopCommonModesとNSDefaultRunLoopModeを扱った多くの記事をここやWebで読んだことがありますが、私の問題を説明している人は見つかりませんでした。私が見つけた最も近いものはこの質問にありました

CADisplayLinkが画面の更新のために起動できない場合(メインスレッドが前のフレームの描画などを実行しているため)、完了するのに十分な時間がないため、CADisplayLinkがスキップする可能性があることに注意してください。

しかし、公式のドキュメントではその証拠を見つけることができないようです。私が何か間違ったことをしていることを願っています...

違いがある場合は、問題のデバイスがiOS4.3.3を実行しています。

0 投票する
1 に答える
259 参照

iphone - iPhoneでは、CADisplayLinkコールバックメソッドの実行中にtouchesBegan:withEventが起動する可能性はありますか?

touchesBegan:withEventは、CADisplayLinkコールバックの各反復の「前」または「後」に常に発生しませんか?

編集:これが私のCADisplayLinkインスタンス化です: