質問編集履歴

5

実行環境の追記(video driver)、新たにわかったことを追記

2023/11/23 03:45

投稿

08noboreni
08noboreni

スコア47

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,8 @@
3
3
  - ベストプラクティスについて:すべて再描画しないと表示がバグる可能性の詳細について を追記
4
4
  - 新たにわかった情報:(末尾に追加)
5
5
  - マルチポストであることを追記
6
+ - 実行環境にvideo driverの情報を追記
7
+ - 新たにわかった情報に、stockoverflowで頂いた情報の要約を追記
6
8
  ーーーーーーー
7
9
  マルチポスト:
8
10
  https://ja.stackoverflow.com/questions/96883/python%e3%81%aepygame%e3%81%a7pygame-display-updaterect%e3%81%a7%e6%ad%a3%e3%81%97%e3%81%84%e7%af%84%e5%9b%b2%e3%81%ae%e3%81%bf%e3%81%8c%e6%9b%b4%e6%96%b0%e3%81%95%e3%82%8c%e3%81%aa%e3%81%84%e3%81%ae%e3%81%af%e4%bb%95%e6%a7%98%e3%81%aa%e3%81%ae%e3%81%8b
@@ -87,6 +89,7 @@
87
89
  - M1 Macbook
88
90
  - Python 3.10.12
89
91
  - pygame 2.5.2
92
+ - pygame.display.get_driver() : 'cocoa'
90
93
 
91
94
  ## なぜこうなっているかの想定
92
95
  pygame.display.update(rect)は、指定されたrectの範囲のピクセル行をすべて更新する、という仕様だから?
@@ -129,3 +132,8 @@
129
132
  - SDLの関係という情報もいただきました : https://github.com/pygame/pygame/pull/1773
130
133
  - SDLのUpdateWindowFramebuffer() というOSによって処理が変わる関数が呼び出されていて、pygameではなく、少なくともSDL以降のバグor仕様のようである:https://github.com/pygame/pygame/issues/251#issuecomment-619552646
131
134
  - 過去に、windows版でupdate(rect)で画面全体が更新されるバグがあり、SDL側で修正が行われたこともある
135
+ - 他の方の報告:linuxで同様の事象の報告がありました。(https://ja.stackoverflow.com/a/96898/60497)
136
+ - 青い四角形の例をpygameで解決しようとする場合、special_flagsを設定することでも対応できる報告
137
+ screen.fill(WHITE, special_flags=pygame.BLEND_MIN)
138
+ BLEND_MINは、そのピクセルのRGBのそれぞれについて、小さい方の値を採用するようです。(参照:https://stackoverflow.com/a/625476/22964188)
139
+ (報告元 : https://ja.stackoverflow.com/a/96898/60497)

4

新たにわかったことの追記

2023/11/22 16:33

投稿

08noboreni
08noboreni

スコア47

test CHANGED
File without changes
test CHANGED
@@ -126,5 +126,6 @@
126
126
 
127
127
  ## 新たにわかったこと
128
128
  - windows環境だと、正しく?動く(青い四角形の例で、白い部分が表示されない)場合もある情報をいただきました
129
- - SDLの関係という情報もいただきました https://github.com/pygame/pygame/pull/1773
129
+ - SDLの関係という情報もいただきました : https://github.com/pygame/pygame/pull/1773
130
-
130
+ - SDLのUpdateWindowFramebuffer() というOSによって処理が変わる関数が呼び出されていて、pygameではなく、少なくともSDL以降のバグor仕様のようである:https://github.com/pygame/pygame/issues/251#issuecomment-619552646
131
+ - 過去に、windows版でupdate(rect)で画面全体が更新されるバグがあり、SDL側で修正が行われたこともある

3

マルチポスト対応

2023/11/22 16:21

投稿

08noboreni
08noboreni

スコア47

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,14 @@
1
1
  更新:
2
2
  2023/11/23
3
- ベストプラクティスについて:すべて再描画しないと表示がバグる可能性の詳細について を追記
3
+ - ベストプラクティスについて:すべて再描画しないと表示がバグる可能性の詳細について を追記
4
- 新たにわかった情報:(末尾に追加)
4
+ - 新たにわかった情報:(末尾に追加)
5
+ - マルチポストであることを追記
5
6
  ーーーーーーー
7
+ マルチポスト:
8
+ https://ja.stackoverflow.com/questions/96883/python%e3%81%aepygame%e3%81%a7pygame-display-updaterect%e3%81%a7%e6%ad%a3%e3%81%97%e3%81%84%e7%af%84%e5%9b%b2%e3%81%ae%e3%81%bf%e3%81%8c%e6%9b%b4%e6%96%b0%e3%81%95%e3%82%8c%e3%81%aa%e3%81%84%e3%81%ae%e3%81%af%e4%bb%95%e6%a7%98%e3%81%aa%e3%81%ae%e3%81%8b
9
+ 理由:先に投稿したstockoverflowのpygameタグの質問数が少なく、pygameに関する回答を得られる可能性が低いと感じたため。
10
+ 対応:新たに判明したことを更新し、解決した際にはこちらにも情報を記載し終了いたします。
11
+
6
12
 
7
13
  数時間ネットで調査しましたが、わかりませんでした。申し訳ございませんが、教えてください。
8
14
 

2

不明瞭な点を追記(「すべて再描画しないと表示がバグる可能性」の箇所)、新たにわかったことを追記

2023/11/22 16:12

投稿

08noboreni
08noboreni

スコア47

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,8 @@
1
+ 更新:
2
+ 2023/11/23
3
+ ベストプラクティスについて:すべて再描画しないと表示がバグる可能性の詳細について を追記
4
+ 新たにわかった情報:(末尾に追加)
5
+ ーーーーーーー
1
6
 
2
7
  数時間ネットで調査しましたが、わかりませんでした。申し訳ございませんが、教えてください。
3
8
 
@@ -86,6 +91,34 @@
86
91
  ## ベストプラクティスについて
87
92
  元々は、変更箇所が一部であれば、その場所に描画したいものだけを描画して、その場所のみを更新しようと思っていました。
88
93
  しかし、更新範囲が指定箇所から逸脱するのであれば、すべて再描画しないと表示がバグる可能性があると思います。
94
+ ーーーー
95
+ 追記 2023/11/23
96
+ > すべて再描画しないと表示がバグる可能性
97
+ の詳細について
98
+
99
+ 例えば、下記のようなゲーム画面があるとします。
100
+ 左上の女の子の動きのみ頻繁に更新する必要があるとします。
101
+
102
+ ![chatGPTで出力した適当なゲーム画面例](https://ddjkaamml8q8x.cloudfront.net/questions/2023-11-23/a36c23f5-3ce0-4eee-8122-b9d227c4726f.png)
103
+
104
+ その際に、できるだけ処理を省こうとすると、
105
+ 1. 背景を緑色でfill
106
+ 2. 新しい女の子の画像を配置
107
+ 3. 女の子のウィンドウ部分のみ更新
108
+ としたいと思います。
109
+ <br>
110
+ しかし、今回問題にしている挙動により、右側のセーブ、ロード、オプション等のボタンたちの部分まで更新されてしまいます。
111
+ 一見、更新が必要ない、動きがない部分についても、再描画は行っておかないと予想外のタイミングで更新されてしまう、= 表示がバグる、ということでした。
112
+
113
+ わかりにくい内容で申し訳ないです。
114
+
115
+ ーーーー
89
116
  文章や、ロゴマーク、セーブ/ロードボタンなど、更新回数が明らかに少ない場所で範囲に一見含まれていなくても再描画するのが正しい、ということになるのでしょうか?
90
117
  そもそも、pygameでは、「変更箇所が一部であれば、その場所に描画したいものだけを描画して、その場所のみを更新する」という想定はしておらず、「毎回すべてを再描画した上で、一部を更新する」という方針なのでしょうか。
91
118
  全く変更のない箇所(例えば、ゲーム画面上のメニューボタン群など)を毎回描画し直すのは、無駄だと感じます。
119
+
120
+
121
+ ## 新たにわかったこと
122
+ - windows環境だと、正しく?動く(青い四角形の例で、白い部分が表示されない)場合もある情報をいただきました
123
+ - SDLの関係という情報もいただきました https://github.com/pygame/pygame/pull/1773
124
+

1

マークダウンのミスを修正

2023/11/22 10:24

投稿

08noboreni
08noboreni

スコア47

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,8 @@
4
4
  ## 達成したいこと
5
5
  掲題の件が仕様なのか確認したい。
6
6
  pygameで再描画範囲を限定し軽いゲームを目指す際のベストプラクティスを知りたい(「背景と該当のオブジェクトのみを描画して部分的にupdateすれば良いじゃん」ができないため)
7
+
7
- 何について、仕様なのか確認したいのか
8
+ ## 何について、仕様なのか確認したいのか
8
9
  pygame.display.update(rects)
9
10
  で画面の一部のみを更新しようとしたときに、rectsで指定した範囲以外の場所も更新されること。
10
11