問題タブ [bpy]

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 投票する
0 に答える
20 参照

blender - レンダー間で Blender がフリーズする

私は現在ブレンダー 3.0 で作業していますが、いくつかのレンダリングを実行する際に問題が発生しました (これはブレンダー 2.93 でも発生します)。
私のチームには、Python を介していくつかのオブジェクト (40 ~ 50) をスポーンするシーンがあり (それらは特定のコレクション内のオブジェクトの複製です)、レンダリングしてファイルに保存します。各レンダリングの後、メモリの問題を回避するためにいくつかのクリーンアップ コードを実行します (約 10,000 のレンダリングが必要です)。クリーンアップ コードを実行して次のレンダリングに備えるには、最初は約 0.05 秒かかりますが、1.5/2k のレンダリング後は 5 分以上かかります (実行されるレンダリングの数が増えるにつれて、現在のレンダリングと次のレンダリングの間のフリーズ時間が長くなります) )。ブレンダーを再起動して「フリーズ期間をリセット」して 0 秒にします。
全体的なコードは次のようになります。

複製を作成するために使用するコード:

生成されたオブジェクトを消去するために使用しているコード:

私たちは現在、プログラムを 10 回実行することでこの問題を「解決」しており、毎回 1k のレンダリングを上限として、それらを 1 つのディレクトリにまとめています。フリーズが発生する理由や、レンダリングを重ねるほどフリーズが長くなる理由について何か考えはありますか?

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

python - Blender が完全にロードされた後にスクリプトを実行する

Blender が完全にロードされた後、Python スクリプトを自動的に実行するにはどうすればよいですか?

環境

私のスクリプトは、シードに基づいてシーンを生成します。数千の画像を作成したいのですが、Blender は 100 世代ほど後にメモリ リークを起こすため、すべてが大幅に遅くなり、最終的にはクラッシュします。セッションごとに x 個の画像のみを作成して問題を軽減し、セッションごとに Blender を完全に再起動したいと考えています。

問題

ブレンド ファイルを手動で読み込んでスクリプト エディタの再生ボタンをクリックすると、すべてが期待どおりに機能します。起動後にスクリプトを呼び出そうとすると、add_curve_spirals.py184 行目でクラッシュしcontext.space_dataますNone

スクリプトを手動で開始すると問題なく動作するため、問題は Blender がある種の間違った状態にあることです。GUI ( --background) を使用して、または使用せずに起動しても、これには影響しません。

失敗したソリューション

  • blender myfile.blend --python myscript.pyコンテキストが完全に準備される前にスクリプトを実行するため、エラーが発生します。
  • ハンドラーを使用して実行を遅らせる ( bpy.app.handlers.load_post) は、ファイルを完全にロードした後にスクリプトを呼び出しますが、それでもコンテキストの準備ができておらず、エラーが発生します。
  • Blender でスクリプトを起動時に自動実行するように設定すると (Text/Register)、エラーが発生します。
  • here で提案されているように、ソケットを使用して、後で Blender にコマンドを送信します。着信コマンドを待機しているサーバー スクリプトは、起動時に Blender をブロックし、完全なロードを妨げます。したがって、結果はスクリプトを直接実行するのと同じです。
  • 時限イベントの使用 ( bpy.app.timers.register(render_fun, first_interval=10).

これらは、スクリプトを自動的に実行するために私が見つけたすべての方法です。いずれの場合も、スクリプトの実行が早すぎたり、間違った状態で実行されたりして、すべて同じように失敗します。

ここでは、スクリプトが問題ではないことを強調したいと思います。特定の行を回避できたとしても、多くの同様の問題が続く可能性があるため、スクリプト全体を書き直したくありません。では、適切な状態で自動的に呼び出す最善の方法は何でしょうか?