-
Notifications
You must be signed in to change notification settings - Fork 12
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
動作を高速化する #85
Comments
FPSカウンターだけの表示だと秒10000いける for (uint32_t counter = 0 ; ; ++counter ) {
// EmbeddedEmulator_update_screen(&fb);
// print_framebuffer(150, 0, 2);
sprintf(msg, "%d", counter);
BSP_LCD_DisplayStringAt(5, 5, (uint8_t *)msg, LEFT_MODE);
/* Touchscreen test */
// TS_StateTypeDef TS_State = {0};
// BSP_TS_GetState(&TS_State);
// if(TS_State.touchDetected) {
// const uint16_t x1 = TS_State.touchX[0];
// const uint16_t y1 = TS_State.touchY[0];
// BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
// BSP_LCD_FillCircle(x1, y1, 10);
// }
} |
エミュレーションだけ入れると10fps for (uint32_t counter = 0 ; ; ++counter ) {
EmbeddedEmulator_update_screen(&fb);
// print_framebuffer(150, 0, 2);
sprintf(msg, "%d", counter);
BSP_LCD_DisplayStringAt(5, 5, (uint8_t *)msg, LEFT_MODE);
/* Touchscreen test */
// TS_StateTypeDef TS_State = {0};
// BSP_TS_GetState(&TS_State);
// if(TS_State.touchDetected) {
// const uint16_t x1 = TS_State.touchX[0];
// const uint16_t y1 = TS_State.touchY[0];
// BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
// BSP_LCD_FillCircle(x1, y1, 10);
// }
} |
print_framebuffer入れても8fps、これは最適化が効いている気がする for (uint32_t counter = 0 ; ; ++counter ) {
EmbeddedEmulator_update_screen(&fb);
print_framebuffer(150, 0, 2);
sprintf(msg, "%d", counter);
BSP_LCD_DisplayStringAt(5, 5, (uint8_t *)msg, LEFT_MODE);
/* Touchscreen test */
// TS_StateTypeDef TS_State = {0};
// BSP_TS_GetState(&TS_State);
// if(TS_State.touchDetected) {
// const uint16_t x1 = TS_State.touchX[0];
// const uint16_t y1 = TS_State.touchY[0];
// BSP_LCD_SetTextColor(LCD_COLOR_BLUE);
// BSP_LCD_FillCircle(x1, y1, 10);
// }
} |
ざっとこんな感じ。本当ならPPUは完全並列で動かしていいのだけれど、ポリシーに反するのでアレ
|
opt-level=3, debug_assertions=noで2msぐらい削れた |
ICache/DCache有効にしてなさそう。core_cm7のSCB_xxxにキャッシュ操作周りのインライン関数がある |
体感でわからんぐらいだな、なんかミスってるかも SCB_EnableDCache();
SCB_EnableICache(); |
ART, Prefetch Buffer有効化して9fpsぐらい。framebuffer解決しても15fps届くかどうかぐらいか |
思い当たる節
|
一旦デスクトップ向け環境でもいいから、ベンチ図る環境を構築すべき、100frame書くまでにどのぐらいかかるか。などで |
u16のアンアラインドな読み書きは間違いなくパフォーマンス低下になっていそう |
まぁあえてu32使わせるのももとのコード崩しすぎるから微妙。 |
|
SRAM先頭はDTCMに乗ってるけど、FlashはITCM使ってなさそう
|
https://youtu.be/73ciNT9tl-U |
小手先の修正で劇的に速くならなかったので、以下案 mbedプラットフォーム上でブラッシュアップするもの
処理としてブラッシュアップできる物
rustとしてunsafeを伴うが高速化できるもの
arm向けに最適化するもの既存のコードと整合取れなくなる点どうしよう...型まるごと置き換えたりすると原型は保てなさそう
|
現在、ベンチテストは60frame書くのにかかる時間
|
ちょっと変わった...?
|
剰余をbit andにするのはあまり変わらなそう |
関数呼び出しをフェッチしてあげるのは結構明確に聞くっぽい、何でもかんでもinlineにするのはきらいだが
|
これみてたらやっぱunstable使ってでもconst fn使ったほうがいい気がしてきた
|
更に引数の数を減らしたりして2ms縮めた。多分これはarm相手だともっと効くはず。
動かしてみた感じ、体感でわかるぐらい気持ち早くなっていたがまだまだ |
進捗 mbedプラットフォーム上でブラッシュアップするもの
処理としてブラッシュアップできる物
94.2ms -> 74.1msまで縮んだよ。やったね! rustとしてunsafeを伴うが高速化できるもの
arm向けに最適化するもの既存のコードと整合取れなくなる点どうしよう...型まるごと置き換えたりすると原型は保てなさそう
|
コードぶっ壊したくないとの兼ね合いが難しいしつらい。特にrustだと |
境界チェック外しは、featureでマクロ切り替える方式が良さそう |
あとusizeはターゲットのアドレス空間でサイズが決まる模様。arm向けなら4byte |
カセットの読み書きをuncheckedにしたら1ms縮まった...
|
system/video_systemに適用したがあまり変わらず、全体的なアクセスはカセットを占めているので自明ではある。 |
|
きちんと確認していないけど条件的に範囲外例外を超えない可能性が高い領域だからかもしれない。 |
system_ppu_regにinlineいれても早くならんな |
x86だからかと思ったけど普通に遅くなった |
(ARMでも |
思い当たる節
The text was updated successfully, but these errors were encountered: