「Jank」の版間の差分
Administrator (トーク | 投稿記録) (→非同期化) |
Administrator (トーク | 投稿記録) (→概要) |
||
(同じ利用者による、間の11版が非表示) | |||
1行目: | 1行目: | ||
− | '''Jank'''(読み:じゃんく)とは、[[メインスレッド]]に高負荷がかかり、[[ユーザーインターフェース]] | + | '''Jank'''(読み:じゃんく)とは、[[メインスレッド]]に高負荷がかかり、[[ユーザーインターフェース]]がガクガクまたはフリーズしたかのような状態になることを言います。 |
== 概要 == | == 概要 == | ||
− | 一般的に[[ドローコール]]は[[メインスレッド]]([[UIスレッド]]とも呼ばれる)でしか実行できない。これは[[Windows]]でも[[macOS]]でも[[iOS]]でも[[Android]]でも[[.NET]]でも[[Java]] | + | 一般的に[[ドローコール]]は[[メインスレッド]]([[UIスレッド]]とも呼ばれる)でしか実行できない。これは[[Windows]]でも[[macOS]]でも[[iOS]]でも[[Android]]でも[[.NET]]でも[[Java]]でも同じです。 |
− | たとえば8コア(8スレッド)の[[ハードウェア]]であっても | + | たとえば8コア(8スレッド)の[[ハードウェア]]であっても[[メインスレッド]]は常にひとつしかありません。このためメインスレッドに強烈な高負荷がかかると「処理待ちの大渋滞」を引き起こし、[[ドローコール]]がいつまで経っても呼ばれず、[[GPU]]はスカスカなのに仕事がこないため、結果として画面が更新されずガクガクになります。 |
− | + | ジャンクは主に[[シングルスレッド性能]]が低く、コア数の多さで性能を盛ってる[[コンピューター]]、身近なところでは[[スマートフォン]]の[[CPU]]([[SoC]])で発生しやすい傾向があります。とくに高効率コアと高性能コアを組み合わせたCPUでは低性能な高効率コアにメインスレッドが置かれることでジャンクが頻発し、高性能コアやGPUがスカスカになるなどといった現象が起きることも多々あります。最近の[[Android]]でもガクガクになる原因はほとんどがこれです。[[iOS]]ではジャンクが発生する[[アプリ]]の作りだと[[AppStore]]の審査で蹴られるのであまり問題になることはありません。 | |
== 回避策 == | == 回避策 == | ||
=== 非同期化 === | === 非同期化 === | ||
− | 頑張って、可能な限り、「[[非同期処理]]」を使いまくり[[プログラム]] | + | 頑張って、可能な限り、「[[非同期処理]]」を使いまくり[[プログラム]]を実装してください。 |
− | + | これによりメインスレッドの負荷が激減します。 | |
− | + | ただし[[マルチスレッド]]や[[非同期処理]]に精通していない[[プログラマー]]に実装させると[[バグ]]だらけになる[[諸刃の剣]]である点には注意する必要があります。 | |
− | + | また、第三者の作ったバックグラウンドアプリが高負荷をかけてくるような状況ではどうにもなりません。 | |
− | + | Androidであればプリインストールアプリなんかが[[大きなお世話]]をしてきて悪さをする場合も結構あります。 | |
=== ジャンクリデューサー === | === ジャンクリデューサー === | ||
− | このジャンク問題を軽減すべく、最近の[[Snapdragon]]の一部製品(型番の末尾に「G」が付く製品。[[Snapdragon 765G]]など)には「Jank | + | このジャンク問題を軽減すべく、最近の[[Snapdragon]]の一部製品(型番の末尾に「G」が付く製品。[[Snapdragon 765G]]など)には「Jank Reducer」なる機能が搭載されています。[[GPU]]が一定の[[フレームレート]]を下回ったら「仕事がこねえ」「ジャンク発生したな」と判断し勝手にドローする機能のようです。詳細は不明。 |
2023年9月13日 (水) 08:14時点における最新版
Jank(読み:じゃんく)とは、メインスレッドに高負荷がかかり、ユーザーインターフェースがガクガクまたはフリーズしたかのような状態になることを言います。
概要[編集 | ソースを編集]
一般的にドローコールはメインスレッド(UIスレッドとも呼ばれる)でしか実行できない。これはWindowsでもmacOSでもiOSでもAndroidでも.NETでもJavaでも同じです。
たとえば8コア(8スレッド)のハードウェアであってもメインスレッドは常にひとつしかありません。このためメインスレッドに強烈な高負荷がかかると「処理待ちの大渋滞」を引き起こし、ドローコールがいつまで経っても呼ばれず、GPUはスカスカなのに仕事がこないため、結果として画面が更新されずガクガクになります。
ジャンクは主にシングルスレッド性能が低く、コア数の多さで性能を盛ってるコンピューター、身近なところではスマートフォンのCPU(SoC)で発生しやすい傾向があります。とくに高効率コアと高性能コアを組み合わせたCPUでは低性能な高効率コアにメインスレッドが置かれることでジャンクが頻発し、高性能コアやGPUがスカスカになるなどといった現象が起きることも多々あります。最近のAndroidでもガクガクになる原因はほとんどがこれです。iOSではジャンクが発生するアプリの作りだとAppStoreの審査で蹴られるのであまり問題になることはありません。
回避策[編集 | ソースを編集]
非同期化[編集 | ソースを編集]
頑張って、可能な限り、「非同期処理」を使いまくりプログラムを実装してください。 これによりメインスレッドの負荷が激減します。
ただしマルチスレッドや非同期処理に精通していないプログラマーに実装させるとバグだらけになる諸刃の剣である点には注意する必要があります。
また、第三者の作ったバックグラウンドアプリが高負荷をかけてくるような状況ではどうにもなりません。 Androidであればプリインストールアプリなんかが大きなお世話をしてきて悪さをする場合も結構あります。
ジャンクリデューサー[編集 | ソースを編集]
このジャンク問題を軽減すべく、最近のSnapdragonの一部製品(型番の末尾に「G」が付く製品。Snapdragon 765Gなど)には「Jank Reducer」なる機能が搭載されています。GPUが一定のフレームレートを下回ったら「仕事がこねえ」「ジャンク発生したな」と判断し勝手にドローする機能のようです。詳細は不明。