トップページ > 記事閲覧
DrawCube3Dが非常に遅い
名前:Marshal 日時: 2020/04/10 15:04

管理人様 3D上でDrawCube3Dを使用して90万個Cubeを描画する必要があるのですが、DrawPixel3Dに比べてあまりにも描画速度が遅くなってしまい困っています。 3D上でCubeを使用して描画する際に、どうにか高速に描画するよう何かしら対応方法は御座いませんでしょうか? もしくは、可能でしたら下記のような対応をして頂けませんでしょうか? DrawPixelSetのような、DrawCube3DSet的なものなど可能ですか? 以上、宜しくお願い申し上げます。
メンテ

Page: 1 |

Re: DrawCube3Dが非常に遅い ( No.1 )
名前:管理人 日時:2020/04/11 06:32

90万個はかなりの数ですね、仮に DrawCube3DSet を作成しても 60FPSで 90万個の Cubeを描画するのは難しいと思います 最適化の余地がありそうなのですが、どのような表現をされようとしているのでしょうか?
メンテ
Re: DrawCube3Dが非常に遅い ( No.2 )
名前:Marshal 日時:2020/04/14 09:11

管理人様 TcpIp通信等で取得した3次元データ(大凡90万点)を使ってCube3Dに描画しようとしております。 DX.VECTORデータは描画前に全て揃った状態で下記を実施しましたが、かなり描画速度に差が出ています。 Pixel3Dの場合は、ある程度高速描画が出来ますが、Cube3Dの場合は5Fps程度しか出ていないようでした。 もし最適化が可能でしたら、お手数をお掛けして恐縮なのですが、、カスタマイズして頂けますと大変助かります。 以上、何卒宜しくお願い致します。
メンテ
Re: DrawCube3Dが非常に遅い ( No.3 )
名前:管理人 日時:2020/04/15 08:47

> TcpIp通信等で取得した3次元データ(大凡90万点)を使ってCube3Dに描画しようとしております。 通信で取得した3次元データ… 何か特殊な処理なのでしょうか? 個人的には正直に 90万Cubeも描画しなくて良いように最適化するのが良いと思っているのですが… ( 例えば、Cubeどうしがぴったり隣接している場合は、隣り合ってくっついているCubeの面は描画しなくて良いので… ) とりあえず DrawCubeSet3D という関数を追加してみましたので、よろしければお試しください DrawCube3D を単体で 90万回呼ぶよりは高速になると思いますが、実用レベルになるかは不明です… https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibiOSTest.zip // iOS版 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) <追加した関数> // 3Dの立方体の集合を描画する int DrawCubeSet3D( CUBEDATA *CubeDataArray, int Num, int FillFlag ) ; <追加した構造体> // 立方体データ型 struct CUBEDATA { VECTOR Pos1 ; // 座標1 VECTOR Pos2 ; // 座標2 COLOR_U8 DifColor ; // ディフューズカラー COLOR_U8 SpcColor ; // スペキュラカラー } ; 構造体内の色情報である DifColor と SpcColor の構造体 COLOR_U8 は以下のようになっていて、 GetColor の代わりに GetColorU8 という関数を使用します // unsigned char 型のカラー値 struct COLOR_U8 { BYTE b, g, r, a ; } ; // 符号なし整数8ビットのカラー値を作成する COLOR_U8 GetColorU8( int Red, int Green, int Blue, int Alpha ) ;
メンテ
Re: DrawCube3Dが非常に遅い ( No.4 )
名前:Marshal 日時:2020/04/16 21:18

管理人様 お手数をお掛けし早々に御対応して頂いたのに、なかなか確認する時間を取れずに現状おります。 来週中にはリビルドして動作確認させて頂きますm(_ _)m 以上、何卒、宜しくお願いします。
メンテ
Re: DrawCube3Dが非常に遅い ( No.5 )
名前:Marshal 日時:2020/05/20 13:08

管理人様 動作結果のご連絡が遅くなり申し訳ありません。 一通り動作確認しておりますが、DrawCubeSet3DのFillFlagをDX.FALSEに指定すると下記のような例外が発生するようです。 DX.DUBEDATAには90万データ分、設定しております。 ちなみに、FillFalgをDX.TRUEにすると問題なく動作しております。 原因の方を調査してい頂けませんでしょうか? 以上、何卒、宜しくお願い致します。 Error内容: 型 'System.AccessViolationException' のハンドルされていない例外が DxLibDotNet.dll で発生しました。
メンテ
Re: DrawCube3Dが非常に遅い ( No.6 )
名前:管理人 日時:2020/05/21 01:34

すみません、FillFlag を FALSE にするとメモリの不正なアクセスを行ってしまうバグがありました 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.zip // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM64.zip // Android版 ARM64用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.zip // Android版 x86用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x64.zip // Android版 x64用 https://dxlib.xsrv.jp/temp/DxLibiOSTest.zip // iOS版 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: DrawCube3Dが非常に遅い ( No.7 )
名前:Marshal 日時:2020/05/21 09:23

管理人様 早速修正して頂き、有難う御座います。 ただ、DX.FALSEに変更し実行してましたが、絵が何も出ておりません。 DX.TRUEの場合は、問題なく絵が出ております。 DX.DUBEDATAのα値は、0,128,255と実験してみましたが、変わらず何も絵が出ないようです。 本来であれば、キューブ上の骨格だけ出る想定ですよね? 以上、何卒、宜しくお願い致します。
メンテ
Re: DrawCube3Dが非常に遅い ( No.8 )
名前:管理人 日時:2020/05/22 00:57

すみません、ライティングが ON になっていると必ず真っ黒の線で描画されるように なってしまっていました DX.SetUseLighting( DX.FALSE ); を実行してライティングを OFF にしてから DrawCubeSet3D を実行することで正常な描画結果が得られると思います あと、ライティングが ON だと真っ黒の線になるバグを修正したバージョンをアップしましたので、 もしよろしければお試しください m(_ _;m ( 線描画でライティングすることはあまり無いと思いますが… ) https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
メンテ
Re: DrawCube3Dが非常に遅い ( No.9 )
名前:Marshal 日時:2020/07/17 13:23

管理人様 上記のDrawCubeSet3Dですが、FillFlgをTrueにしますと、DrawCubeSet3Dで描画した画の大部分が壊れた感じの表示となります。 Falseの場合は、標準ライトを含め、特に問題なく描画できています。 ご確認のほどよろしくお願い致します。
メンテ
Re: DrawCube3Dが非常に遅い ( No.10 )
名前:管理人 日時:2020/07/17 23:12

> 上記のDrawCubeSet3Dですが、FillFlgをTrueにしますと、DrawCubeSet3Dで描画した画の大部分が壊れた感じの表示となります。 壊れた感じ…ですか… すみません、それは具体的にはどのような見た目の状態でしょうか? とりあえず以下のような縦横4×4の箱を DrawCubeSet3D で描画して、カメラがその箱の周りを くるくる周るプログラムを作成して確認してみましたが、特に描画結果に問題はありませんでした #include "DxLib.h" #include <math.h> #define NUM (4) #define SIZE (64.0f) #define SPACE (128.0f) #define TOTAL_SIZE (SIZE + SPACE * (NUM - 1)) CUBEDATA Cube[ NUM ][ NUM ] ; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int i, j ; float Angle ; // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // 背景の色をグレーに設定 SetBackgroundColor( 128,128,128 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // Zバッファを有効に設定 SetUseZBufferFlag( TRUE ) ; // Zバッファへの書き込みを有効に設定 SetWriteZBufferFlag( TRUE ) ;; // キューブの情報をセット for( i = 0 ; i < NUM ; i ++ ) { for( j = 0 ; j < NUM ; j ++ ) { Cube[ i ][ j ].Pos1 = VGet( j * SPACE - TOTAL_SIZE / 2.0f, 0.0f, i * SPACE - TOTAL_SIZE / 2.0f ) ; Cube[ i ][ j ].Pos2 = VGet( j * SPACE - TOTAL_SIZE / 2.0f + SIZE, SIZE, i * SPACE - TOTAL_SIZE / 2.0f + SIZE ) ; Cube[ i ][ j ].DifColor = GetColorU8( 255, 255, 0, 255 ) ; Cube[ i ][ j ].SpcColor = GetColorU8( 0, 0, 0, 0 ) ; } } // カメラの位置を初期化 Angle = 0.0f ; // カメラの Near, Far をセット SetCameraNearFar( 20.0f, 6000.0f ) ; // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; // カメラの位置を更新 Angle += 0.025f ; // カメラの位置と向きをセット SetCameraPositionAndTarget_UpVecY( VGet( cos( Angle ) * 500.0f, 400.0f, sin( Angle ) * 500.0f ), VGet( 0.0f, 0.0f, 0.0f ) ) ; // 箱の描画 DrawCubeSet3D( Cube[ 0 ], NUM * NUM, TRUE ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } よろしければ Marshalさんの環境でも↑のプログラムであれば正常に動作するか 試してみていただけないでしょうか? m(_ _)m
メンテ
Re: DrawCube3Dが非常に遅い ( No.11 )
名前:Marshal 日時:2020/07/20 10:05

管理人様 迅速なご回答有難うございました。 上記同様のコードにて確認してみましたが、下記の描画結果写真のようになるようです。 画をみて頂き何が問題なのかある程度検討はつきますでしょうか? ※URLの先頭に"h"をつけて下さい。 以上、宜しくお願い致します。 ttps://firestorage.jp/download/5263c25a9b21ed75bdf69196c61268c9d24a9877 ファイル名:DrawCubeSet3Dの描画結果写真.zip
メンテ
Re: DrawCube3Dが非常に遅い ( No.12 )
名前:管理人 日時:2020/07/21 23:14

> 上記同様のコードにて確認してみましたが、下記の描画結果写真のようになるようです。 アップしていただいた画像は私が No.10 に載せたプログラムの実行結果とは異なるようですが、 私が No.10 に載せたプログラムでもアップしていただいた画像のような描画結果になってしまう ということでしょうか? > 画をみて頂き何が問題なのかある程度検討はつきますでしょうか? うーん、こちらの画像だけだと原因は分かりません 私の環境でもアップしていただいた画像のような描画結果になってしまうか確認して みたいと思いますので、よろしければアップしていただいた画像のプログラムを掲示板に 書き込んでいただけないでしょうか? m(_ _)m
メンテ
Re: DrawCube3Dが非常に遅い ( No.13 )
名前:Marshal 日時:2020/07/22 10:19

管理人様 下記のオンラインストレージにsample.txtをアップロードさせて頂きました。 ご確認のほど、何卒宜しくお願い致します。 ttps://firestorage.jp/download/83a912463ed518152d5b291575f87eeebd263dea ファイル名:sample.txt
メンテ
Re: DrawCube3Dが非常に遅い ( No.14 )
名前:管理人 日時:2020/07/24 02:29

アップしていただいたファイルを確認しました すみません、プログラムの一部分だけではなく、実行に必要な プログラム全体を頂けないでしょうか? m(_ _;m
メンテ
Re: DrawCube3Dが非常に遅い ( No.15 )
名前:Marshal 日時:2020/07/27 09:25

管理人様 了解しました。 ただプロジェクト自体が非常に巨大なため、本内容に必要な個所のみを抽出し、新たに作成したものをアップさせて頂きます。 以上、お手数をお掛けしますが宜しくお願い致します。
メンテ
Re: DrawCube3Dが非常に遅い ( No.16 )
名前:管理人 日時:2020/07/29 00:57

こちらこそお手数をお掛けしてすみません 抽出版のプログラムをお待ちしております m(_ _;m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存