Toucanバーチャル博物館
VRML図鑑 3DCG 展示室   開発日誌 お問い合わせ

トコちゃんの修行日誌 2025年10月

お仕事中デスクトップ

お仕事中デスクトップ

10月23日 ChatGPT-5丸投げ副作用

GPT任せのプログラミング作業で、作業効率が爆上がりなのですが、その副作用でソースコードが未整理のままだったので、整理しました。

バースト、パラレルジョブで高速化する前のコードがコメントで残っていたり、色々な方法を試したので結局使わなかったコードが残っていたり、順番がぐちゃぐちゃでコードが見にくかったりなど、コードの内容ではなく、編集作業。内容についても、再度確認することになったので、いい復習です。

作業が終わって、「Landscape(クラスの名前)の改善点があったら教えてください。」とお願いしたら、的確な返答が。

重要な不具合修正

TriangleCalculated[setIndex] = float.MaxValue

MaxValueでクリアしていたのですが、setIndexをindexと違う値でした。たまたま全クリアだったので、結果は同じで不具合は起きていなくて見過ごしていたのですが、意味合いが違っています。実際に動作させて不具合がでてから判断するなら簡単ですが、GPTはソースコードを隅から隅まで読んで判断しています。

NativeQueue → NativeList への置換

 現状、Queue→Array 変換ジョブを都度走らせています。NativeList<Triangle> と ParallelWriter を使えば、そのまま AsArray で後続ジョブに渡せるため中間コピーを削減できます(marching.Generate のシグネチャ変更が必要)。

なんて言うアドバイスもありました。Queueで順番で取り出す必要が無いのでNativeListに変更しました。Queue→Array 変換ジョブが必要なくなり、若干処理が速くなりました。

などなど、整理復習改良中です。

キャラクター停止中 190FPS(1秒描画数)
スクロール時 75FPS

水のシミュレーション中 62FPS
+スクロール時 50FPS 

なんとかなりそうな処理時間です。 毎フレーム地面水面草のメッシュ更新+水のシミュレーションなどという無茶をしているのに。

10月18日 HeightMap、FlowMap

パーティクル、ボクセルデータともデータ量が膨大なので保持するのが難しく、高さマップ、流れマップの2Dテクスチャで済ませることにしました。

洞窟など特別な場合のみボクセルデータで保存。

流れのシミュレーション結果をテクスチャに反映するのも大変です。GPUでパーティクルから直接テクスチャに書き込むのが王道ですが、小回りがききません。

パーティクルの密度速度から、水ボクセルデータに変換してポリゴンで水面を表示しているので、そのボクセルデータを上から調べていって水面がある高さで、高さマップに書き込み。同様にその高さの水の流れを流れマップに書き込むようにしてみました。

FlowMap(流れマップ)でマテリアルに流れを表示しているので、毎回更新するとガタガタするのかと心配していたのですが、スムーズに表示されています。

50FPS以上(1秒50描画)で動作していたのですが、15FPSまで落ちました。テクスチャ書き込みや、ミップマップ作成などが原因かと思います。

高さマップの使用は、スクロール先の読み込み、拡大縮小時などでボクセルデータを新たに作成するときなので、枚フレーム更新してもあまり意味がありません。1回の書き換えを1秒ぐらいに分散させてリアルタイムで動作するようにしようと思います。

いつものように、バーストコンパイル、パラレルジョブでの高速化もします。GPU処理待ちが数か所あるので、そこで処理するとか工夫してみます。

なんとかなるかな。 

10月16日 関数電卓

fx-290A

今まで使っていた関数電卓fx-991sの液晶がへたってきて、数字が読み取れない桁があるので、買い換えました。ボタンの数字も消えている。パソコンの電卓アプリも使ってみたのですが、キーボードで数字の入力をしても結局マウスクリックも使ったりして不便。

1994年(平成6年)の発売ですね。いつ買ったのか、兄にもらったような気もする。

時代と逆行して大きく厚くなってます。電卓は小さくするメリットが無いことに気づいたんですね。16進数表示なども無くなっていますが、最近はまったく使わなくなっていました。

関数電卓といっても難しい計算はあまりせず、使うのはSinCosTan、ルート、べき乗ぐらいかな。

10月10日 拡大縮小

拡大縮小

拡大縮小してから水のシミュレーションをするなら大丈夫でした。シミュレーションしながらの拡大縮小はパーティクルの縮尺を変換しなくてはならないので、不具合なく処理するのは難しい。

シミュレーションの縮尺はタイムスケールで対応できるのかな?

切り取られた部分でのシミュレーションになるのでスクロールすると、クリップ面で水量が大きく変わったりして、少し不自然に波立ったりします。

30FPS(1秒30描画)を死守できるのであれば、水のシミュレーションしながらの釣りも有かも。歩きながらの釣りや、遠い距離のキャスティングを除外して・・・いろいろ悩ましい。

10月9日 水を流しながらスクロール

ボクセル表示は直方体クリッピングから円柱クリッピングにしています。若干狭くなりますが、これはこれでいい感じです。 

スクロール

水を流しながらスクロールできるようになりました。地面のスクロール処理とは違うタイミングで、直方体のクリップ面からはみ出したパーティクルを削除、入ってきた川の断面に再作成しています。

作成時にはパーティクルがぎっしり詰まる(面心立方格子構造)ように並べるのですが、その幅毎に処理しています。

そのほか若干の高速化もして、50−55FPS(1秒描画回数)で動作しています。

流れの処理は拡大縮小したマップには対応しないことにしました。これ以上複雑になるのは無理そうです。水を流しながらの地形の造成はこの縮尺限定です。

パーティクル情報をマップ全部保存するのは容量的に現実的ではありません。1画面分でも2万パーティクル*位置と速度=約0.5MB。1つのマップで20MBぐらい使いそう。

なのでパーティクルからボクセルデータに変換することになりそうです。

現在の地面水面はHeightMap(高さマップ)から作成しているので一旦画面の外に出るとリセットされます。HeightMap(高さマップ)から全体をボクセルデータに変換する処理を作成して、ボクセルデータで完結させた方が良いかもしれません。どうしようかな?

いやいや、ボクセルデータも大きいです。1画面、縦横高さ32*32*36ですから3万5千。パーティクルより大きい。空中地中など圧縮で削減できるとは言っても。

それとも、HeightMap、FlowMap(流れマップ)など2Dだけで済ませるか。

どうしよう。  

10月3日 流れのボクセル化の高速化

パーティクル密度からボクセル密度に変換してポリゴン化して13FPS(1秒13描画)まで処理が遅くなったので、バーストコンパイル、パラレルジョブで高速化しました。

40FPSぐらいで動いています。

地面の編集で流れを変える

水を流しながら、地面をエディットしてみました。あまり処理が遅くなることなく、リアルタイムで動いています。

水が透明すぎてちょっとわかりずらいですが、パーティクルだとこんな感じです。

パーティクル水

水のポリゴンが若干なめらかになりました。

パーティクル密度からボクセル密度に変換する時、他の水から離れた場所は密度0なのですが、疑似的に一番近い水までの距離が遠いほどマイナスの値を計算するように改良しました。

なんとか動いたので、スクロールできるようにしてみようと思います。今も下流で流れ出した水を上流から流しているので、スクロールだと画面からはみ出した水を画面に入り込んだ水に流れ込ませる感じでできそうな気がします。

水の総量の調整、速度を流れマップへの書き込みとか、細かな処理が山積みですが、とりあえず作ってみます。

../toucan/TocoDiaryJ.html