ゲーム制作 雑談スレ【part39】 (342レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
62: 09/07(日)00:45 ID:qucJSDY/(1/8)調 AAS
野球マンは、Unity使いなんだし朝から同じ話題に辟易してChatGptで調べただけだから、別にPygameがNinateやLumen使えてもどうでもいいだろう。
63: 09/07(日)00:54 ID:qucJSDY/(2/8)調 AAS
GoogleGeminiで聞いてみたよ
カリングとblit()の最適化
「カリング」という用語は、一般的にゲーム開発において、描画パイプライン全体で不要なオブジェクトを描画リストから除外する手法を指します。これには、フラスタムカリング(カメラの視錐台の外にあるオブジェクトを無視する)、オクルージョンカリング(他のオブジェクトに隠れて見えないオブジェクトを無視する)などが含まれます。
PygameのSurface.blit()は、このような広義のカリング機能自体は提供していません。つまり、開発者が自分でオブジェクトの座標を確認し、画面外にある場合は描画関数を呼ばないように制御する必要があります。
しかし、以前の回答で述べた「早期リターン」の機能は、blit()関数内部で行われる描画処理の最適化です。これは、特定の描画命令(この場合はblit())の引数(ソースとデスティネーション)が描画対象として無効である場合に、GPUやCPUへの負荷をかけずに処理を終了させるためのものです。
まとめ
Pygame自体が、シーン全体の不要なオブジェクトを自動的に描画リストから除外するような、高度なカリング機能は提供していない
blit()の内部最適化:blit()関数は、引数で渡されたソースとデスティネーションの矩形が重ならない場合、内部的にピクセル転送処理をスキップするという最適化を行っています。
これは、Pygameの描画関数の効率を高めるための実装レベルの工夫であり、広義の「カリング」機能とは異なります。
64: 09/07(日)01:09 ID:qucJSDY/(3/8)調 AAS
すでに5の質問とはかけ離れてるし、平行線で続けて長くなるんなら別スレ作れば?
65: 09/07(日)01:30 ID:qucJSDY/(4/8)調 AAS
最後にABCをGeminiに質問してみた
100X100 32Pix
A. 巨大なマップ全体を描画してスクロールする:3200x3200ピクセルの巨大なSurface(マップ全体)をメモリに作成し、そのSurfaceの描画位置をずらすことでスクロールを実現します。
描画負荷: 非常に軽い。画面に表示されるのは、その巨大なSurfaceの一部を切り取って描画するだけなので、CPUやGPUへの負荷は最小限です。
メモリ負荷: 非常に重い。3200x3200ピクセルの画像は、約40MBのメモリを消費します(RGBA形式の場合)。現代のPCでは余裕の範囲ですが、ゲーム全体のメモリ使用量によっては問題になる可能性があります。
今回のようにマップサイズが固定されている場合、最もシンプルでパフォーマンスが安定します。実装も非常に簡単なので、手軽にゲームを作りたい場合に最適です。
B. 毎フレーム「必要な範囲だけ」タイルを描画する。画面に見えている11x11タイル(121枚)を、マップデータから読み取って毎フレーム個別に描画します。
描画負荷: 毎フレーム121回のSurface.blit()呼び出しが発生します。メモリ負荷: 最小限。各タイルの画像データのみをメモリに保持すれば済みます。
今回の規模(100x100タイル)であれば、A方式と比較して目に見えるパフォーマンスの差は出ないでしょう。しかし、blit()の呼び出し回数が多いため、わずかにCPUへの負荷が高くなる可能性があります。
C. ハイブリッド
B方式とほぼ同じです。マップをデータとして保持し、画面に表示される部分だけを描画します。マップデータを配列として持つことで、ゲームロジックとの連携(例:タイルごとのイベント)が非常に簡単になります。
今回の規模であればB方式と性能差はありませんが、プロシージャルダンジョンなどゲーム開発のベストプラクティスとして最も推奨される方法です。
66: 09/07(日)01:31 ID:qucJSDY/(5/8)調 AAS
Geminiの総括
最終的な結論と最適な選択肢
100x100タイルの規模であれば、A方式とC方式はどちらも十分に高性能です。
手軽さ、シンプルさを最優先するなら「A方式」
巨大なSurfaceを最初に1回だけ作成すれば、あとはblit()のオフセットを調整するだけで済みます。コードが非常にシンプルになります。
拡張性、将来的な複雑なゲームシステムを考えるなら「C方式」
マップデータが配列として存在するため、ゲームの規模が大きくなったり、タイルごとに異なるプロパティ(通行可能か、イベントが発生するかなど)を持たせる場合に柔軟に対応できます。
どちらの方式も今回の条件では問題なく動作するため、あなたのゲームの要件や実装の好みで選ぶと良いでしょう。
70: 09/07(日)06:56 ID:qucJSDY/(6/8)調 AAS
一気に60ぐらいスレ進んだな。忍者みたいなのがいるのか
81: 09/07(日)16:17 ID:qucJSDY/(7/8)調 AAS
3Dカメラで写実的に見せるためにDirtLense(レンズ汚れ)、VignetteやChroma AberrationとかDOFあたりをPostEffectsしたんでしょ
ポストエフェクトマテリアルは解像度で調整してないと4Kモニタでアウトラインが細くなったり見た目変わるから注意な
82: 09/07(日)16:22 ID:qucJSDY/(8/8)調 AAS
>>76 完成おめでとう。itchIoあたりにアップロードしてくれれば遊ぶよ
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.017s