トップページ > 記事閲覧
w×h×3ch(RGB)の配列を描画したい
名前:ガムテープ人形 日時: 2019/05/10 17:51

タイトルの通りで array<array<array<int,3>,w>,h> のような配列に格納されている情報から描画を行いたいです 現在考えているのはw×hのscreenを作ってそこに1ピクセルずつ描画する方法なのですが、 これでは描画に時間が掛かり非効率に思えます 何か良い方法はないでしょうか
メンテ

Page: 1 | 2 |

Re: w×h×3ch(RGB)の配列を描画したい ( No.7 )
名前:管理人 日時:2019/05/14 00:32

> ギウさん > GraphLockという命令もあったんですね。 >  > 以前、ReCreateGraphFromSoftImage というのを教えて頂いて使ってるんですが、 > 一括転送だと ReCreateGraphFromSoftImage の方が速くなるんでしょうか。(内部的にはほとんど同じ?) すみません、ReCreateGraphFromSoftImage より裏画面の GraphLock による転送の方が高速ですが、 ソフトウェアレンダリングモードは今のところ Windows しか対応していません ただ、Android, iOS に対応した場合も、Android, iOS では最終的な出力には OpenGL を使用することにはなると 思いますので、Windows ほどは効果は大きくないかもしれません それでも ReCreateGraphFromSoftImage よりは高速に処理できるかもしれませんので、 次の週末に対応してみます m(_ _)m > Win95の頃はチラついてたんですが、Win7はそうでもなかったような…。 > もしかしたら20fpsくらいで動かしてたから気にならなかったのかもです。 > 自分でウエイトかけないと、300fpsとかになるので。 ガクガクが気になるのは 60fps でモニタのリフレッシュレートと完全に同期しての動作させようとした場合なので、 20fps だと分からないかもしれません ただ、現在 Win7 の動作環境が失われてしまっているので確認できず、本当にガクガクだったのか、自信が無くなってきました…
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.8 )
名前:ギウ 日時:2019/05/14 08:20

>管理人様 ありがとうございます。 (でも他に優先事項ありましたらそちらを優先してくださいませ)
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.9 )
名前:管理人 日時:2019/05/19 02:35

お待たせしました、Android版と iOS版をソフトウェアレンダリングモードに対応しました 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) Windows版と同様に裏画面を GraphLock する方式と SoftImage を使う方式で速度を 比べてみたところ、1〜2msほど高速になりました よろしければお試しください m(_ _)m 因みに 16bit カラーの場合は画面の RGB の構成は R5G6B5 となり SetGraphMode で 32bitカラーに設定した場合( X8R8G8B8 )より、より高速に転送できます // GraphLock で円を描くプログラムを 16bit カラー用のプログラムにしたもの( Android版 ) #include "Dxlib.h" int android_main() { int GrHandle ; int CircleR ; int CircleRAdd ; // ソフトウェアレンダリングモードを使用する SetScreenMemToVramFlag( FALSE ) ; // VSYNC同期をしない SetWaitVSyncFlag( FALSE ) ; // 画面モードを設定 SetGraphMode( 640, 480, 16 ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) { // エラーが起きたら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 大きさが変化する円の情報を初期化 CircleR = 0 ; CircleRAdd = 4 ; // メインループ while( ProcessMessage() == 0 ) { // 円の大きさを変更 CircleR += CircleRAdd ; if( CircleR >= 400 || CircleR <= 0 ) { CircleRAdd = -CircleRAdd ; } // ソフトウェア画像の中心に黄色い円を描画する( その周りは青色 ) { int Pitch ; BYTE *Image ; // 裏画面のアドレスとピッチを取得する GraphLock( DX_SCREEN_BACK, &Pitch, ( void ** )&Image ) ; // 640x480 の全ピクセルの数だけループ for( int i = 0 ; i < 480 ; i ++ ) { BYTE *p = Image ; for( int j = 0 ; j < 640 ; j ++ ) { // 円の大きさより外側かどうかを判定 int xp = 320 - j ; int yp = 240 - i ; if( xp * xp + yp * yp < CircleR * CircleR ) { // 円の外側だったらピクセルの色を青色にする // ビットと RGB の対応は RRRRRGGGGGGBBBBB *( ( WORD * )p ) = 0x1f ; } else { // 円の内側だったらピクセルの色を黄色にする *( ( WORD * )p ) = 0xffe0 ; } // メモリアドレスを 1ピクセル分( 2バイト )進める p += 2 ; } // アドレスを1ライン分進める Image += Pitch ; } // 裏画面のロックを解除 GraphUnLock( DX_SCREEN_BACK ) ; } // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.10 )
名前:ギウ 日時:2019/05/19 11:37

ご対応ありがとうございます。 色々試し中なのですが、 ========================= <PC版:Windowsモード>  ・これまでの方法(ReCreateGraphFromSoftImage) = 3400 us  ・SetScreenMemToVramFlag( FALSE ) +描画はReCreateGraphFromSoftImage = 540 us (何故か高速化しました) <PC版:フルスクリーンモード>  ・GraphUnLock = どこかでエラーになって落ちました。(最新版じゃないからか、使い方が間違ってるのかなと) <Android版>  ・これまでの方法(ReCreateGraphFromSoftImage) = 8900 us  ・GraphUnLock = 3500 us とかなり高速化したんですが、画面の色が青色に寄ってしまいました。 ========================= PCは、ゲーム部分の描画に時間がかからないので(CPU自体が高速なので)、安全重視で GraphUnLock を使わない方法で進めようと思います。 Android版の方ですが、OpenGLはRGB565で動いているけど、 Androidの機種によってはRGB555(?)など、他の方式で動いてるから、青みのある画面になってしまった(けど、速度は増した)とかでしょうか。 その場合、Androidのビデオカードがどの方式なのか知る方法が必要、ということですよね。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.11 )
名前:管理人 日時:2019/05/19 15:43

お試しいただきありがとうございます > <PC版:Windowsモード> Windowモードで GraphLock は試されていないでしょうか? >  ・SetScreenMemToVramFlag( FALSE ) +描画はReCreateGraphFromSoftImage = 540 us (何故か高速化しました) 高速化したのは Direct3D を使用する場合での VRAM への画像の転送( 低速 )が無くなったためです ( ソフトウェアレンダリングモードは全てシステムメモリ上で処理するので… ) > <PC版:フルスクリーンモード> >  ・GraphUnLock = どこかでエラーになって落ちました。(最新版じゃないからか、使い方が間違ってるのかなと) すみません、もし画面モード( SetGraphModeでの設定 )が 16bitカラーでのことでしたらDXライブラリのバグです ソフトウェアレンダリングモードでもモニタ設定は指定した通りの解像度・色数に変更しようとするのですが、 最近の Windows は 16bitカラーのモニタ設定に対応していないようで、16bitカラーのモニタ設定に失敗して 32bitカラーになってしまっていました( それに伴って SetGraphMode で 32bitカラーを指定した状態になって しまっていました ) 上記の流れでモニタ設定が 32bitになってしまってもDXライブラリとしての画面モードは 16bitに保つように 修正しましたので、よろしければお試しください 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.2 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) ただ、16bitの DIB から 32bitの画面への転送が遅いようで、ScreenFlip の処理時間は SetGraphMode( 640, 480, 32 ); の場合より SetGraphMode( 640, 480, 16 ); の場合の方が 遅くなっていますので、ギウさんがされているように『最終出力だけをDXライブラリで行う』場合は SetGraphMode( 640, 480, 32 ); の方が高速です (- -;; > <Android版> >  ・GraphUnLock = 3500 us とかなり高速化したんですが、画面の色が青色に寄ってしまいました。 おお、そうですか… 一応手元で試せる3機種( SO-04J, F-02H, F-05D )では正常に表示されたのですが… すみません、幾つかご質問させてください 1.こちらの現象は SetGraphMode( w, h, 16 ); の16bitカラー設定でも SetGraphMode( w, h, 32 ); の32bitカラーでも発生しますでしょうか? 2.LoadGraph, DrawGraph で画像描画した場合も青色に寄ってしまいますでしょうか? 3.よろしければ試された機種を教えていただけないでしょうか? > Android版の方ですが、OpenGLはRGB565で動いているけど、 > Androidの機種によってはRGB555(?)など、他の方式で動いてるから、青みのある画面になってしまった(けど、速度は増した)とかでしょうか。 > その場合、Androidのビデオカードがどの方式なのか知る方法が必要、ということですよね。 OpenGL の指定で R5G5B5A1, R5G6B5, R4G4B4A4 の選択があるので、機種によって勝手に R5G5B5A1 に なる可能性は低いと思いたいですが、過去にも Direct3D 7 などの頃は各メーカーで DirectX の仕様に 沿わない挙動をするビデオカードが多かったので、Android でも同様のケースの可能性はありますね…
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.12 )
名前:ギウ 日時:2019/05/19 21:02

>管理人様 試した結果と、Android版のデータをメールでお送りしました。 あ、LoadGraph, DrawGraph で描画した画像は、16Bitでも324BitでもPCでもAndroidでも問題なく表示されていました。 最初のロゴ画像がそれです。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.13 )
名前:ギウ 日時:2019/05/19 21:33

あと、お送りしたサンプルの画面左下の deb_tm= の値が、Flip以外の全処理のタイムです。 上に書いたusは全てタイトル画面で計測した値なので、正確には、タイトル画面を仮想VRAMに転送した後、GraphUnLock で実VRAM(?)に転送したタイムです。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.14 )
名前:ギウ 日時:2019/05/19 22:07

すみません、間違えていました。 Androidの方は、RGB5551で作っていたので、RGB565に変換したら正しく表示されました。 あとは、RGB565で、全てのAndroidで正しく表示されるのかどうかなのですが、ゲーム側でチェックしなくて大丈夫でしょうか?
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.15 )
名前:管理人 日時:2019/05/20 02:36

メールを拝見しました 私の環境でも青色寄りになったので、機種依存の現象ではないようです > あと、お送りしたサンプルの画面左下の deb_tm= の値が、Flip以外の全処理のタイムです。 > 上に書いたusは全てタイトル画面で計測した値なので、正確には、タイトル画面を仮想VRAMに転送した後、GraphUnLock で実VRAM(?)に転送したタイムです。 了解です、タイトルロゴが表示された状態で SO-04J では 2000usくらいでした あと、Direct3D や OpenGL を使用する場合の通常モードでは GraphUnLock で実VRAMへの転送が発生するのですが、 ソフトウェアレンダリングモードでは実際の裏画面のイメージが格納されたメモリ領域のアドレスを GraphLock で 返しているので、GraphUnLock では転送処理は一切発生しません > あと、SetGraphMode(960, 540, 32); > にすると、左半分に寄った画面(右半分は真っ黒)になるので、32BITデータを流し込まないといけないみたいですね。 はい、SetGraphMode で 32bit を指定した場合はソフトウェアレンダリングでの画像処理も 32bit になり、 画面のピクセルフォーマットもバイト並びで B G R X となります( X は4バイトアクセス用の未使用バイト ) > Androidの方は、RGB5551で作っていたので、RGB565に変換したら正しく表示されました。 了解です、正しく表示されたようで何よりです > あとは、RGB565で、全てのAndroidで正しく表示されるのかどうかなのですが、ゲーム側でチェックしなくて大丈夫でしょうか? RGB565フォーマットは OpenGL ES の標準的な機能なので、恐らくチェックは必要ないと思います あと、思えばギウさんのように出力すべきイメージを全て自前でご用意されている場合ですと、GraphLock を使用した 場合画面イメージのメモリ転送が1回無駄に発生します Windows の場合  ギウさんの画面メモリ → DXライブラリの画面メモリ( システムメモリ ) → DIBを使った描画 Android/iOS の場合  ギウさんの画面メモリ → DXライブラリの画面メモリ( システムメモリ ) → OpenGL のテクスチャメモリ → 描画 なので、ギウさんがご用意されているシステムメモリ上の画面メモリを直接使用するための関数を追加しましたので よろしければこちらをダウンロードしてください 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.2 用 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 以下の関数を追加しました // ソフトウェアレンダリングモードで使用する画面のメモリイメージをセットする // DxLib_Init の前で呼ぶ必要があります( DxLib_Init の前に一度でも呼んでいれば、DxLib_Init 後は Image のアドレスのみの変更目的で呼ぶことは可能です )、 // 現状では設定したイメージが ScreenFlip でそのまま転送されるだけで、描画対象にはできません // Image : 画面として転送するメモリ領域の先頭アドレス // PixelFormat : Image のピクセルフォーマット // DX_SOFTRENDER_SCREEN_FORMAT_R5G6B5 : 16bitカラー R5G6B5 ( SetGraphMode( w, h, 16 ); と同じフォーマット ) // DX_SOFTRENDER_SCREEN_FORMAT_R5G5B5X1 : 16bitカラー R5G5B5X1 // DX_SOFTRENDER_SCREEN_FORMAT_X8B8G8R8 : 32bitカラー X8B8G8R8 // DX_SOFTRENDER_SCREEN_FORMAT_X8R8G8B8 : 32bitカラー X8R8G8B8 ( SetGraphMode( w, h, 32 ); と同じフォーマット ) int SetSoftRenderModeUserScreenImage( void *Image, int PixelFormat ) ; この関数をソフトウェアレンダリングモードの設定( SetScreenMemToVramFlag( FALSE ); を DxLib_Init の前に呼んだ状態 )で、 DxLib_Init の前に第一引数にギウさんのシステムで使用する画面メモリのアドレスを渡して呼んでおけば ScreenFlip をするだけでそのまま画面に表示されるようになります、つまり Windowsの場合  ギウさんの画面メモリ → DIBを使った描画 Android/iOS の場合  ギウさんの画面メモリ → OpenGL のテクスチャメモリ → 描画 となります ( ただ、Windows では X8R8G8B8 以外の DIB の転送はかなり重いようなので、Windows ではこの機能を使用するとしても  DX_SOFTRENDER_SCREEN_FORMAT_X8R8G8B8 以外は使用しないほうが良いです ) 因みに、こちらの機能を使用しますとDXライブラリの描画関数は一切使用できなくなりますので、もし一部の描画でも DXライブラリの描画関数を使用している場合は、それらの機能も自前で用意する必要がありますのでご注意ください m(_ _;m
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.16 )
名前:ギウ 日時:2019/05/20 06:58

>管理人様 おお。ご説明と新関数ありがとうございます!! 仕組みもだいぶ理解できました。 >DX_SOFTRENDER_SCREEN_FORMAT_X8R8G8B8 以外は使用しないほうが良いです 了解です! 因みに、Androidの方も、X8R8G8B8が一番早そうでしょうか。  ゲームの画面メモリ(16bit)→ 自分で32bitに変換しながらOpenGLへ → 画面に表示 それとも、R5G6B5でしょうか。  ゲームの画面メモリ(16bit)→ そのままOpenGLへ(memcpyで一括転送) → ハードウェアで32bitに変換される?(それともそのまま?) → 画面に表示 ------ P.S でも、仮にR5G6B5が多少速かったとしても、 他の機種のことや今後のことを考えると、X8R8G8B8で統一するのが良いかもですね。 プログラム的にも、RGB555のみで作って、最後にX8R8G8B8にするという処理で統一できますし。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.17 )
名前:ギウ 日時:2019/05/20 09:15

>管理人様 PC版の方、新関数使ってみました。  Windowモード&Fullスクリーン = 1000us で共に成功しました! Android版は、SetSoftRenderModeUserScreenImageとは関係なく? PlaySoundMem で落ちてしまいました。 まだ別スレッドは使ってない状態です。(PlaySoundMemをコメントアウトしても落ちるので、別のところに原因があるっぽいですが) (こちら側の原因かもしれないのですが) ひとまずご報告ということで。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.18 )
名前:ギウ 日時:2019/05/20 09:24

追記) Android版で、 ReCreateGraphFromSoftImageを使う今までの方法なら、問題なく動きました。音も鳴ってます。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.19 )
名前:管理人 日時:2019/05/20 23:53

PCはうまくいったようで何よりです! とりあえずこちらで正常に動作している Android用のテストプログラムは以下のような感じです 最初の #define R5G6B5 の内の一つだけを 1 にすると、そのフォーマットで『背景は黄色・円は青』で動作します よろしければギウさんの環境でこちらのプログラムが正常に動作するかお試しいただけないでしょうか? m(_ _;m #include "Dxlib.h" #define R5G6B5 1 #define R5G5B5X1 0 #define X8B8G8R8 0 #define X8R8G8B8 0 #if R5G6B5 || R5G5B5X1 BYTE ScreenImage[ 640 * 480 * 2 ] ; #else BYTE ScreenImage[ 640 * 480 * 4 ] ; #endif int android_main() { int CircleR ; int CircleRAdd ; // ソフトウェアレンダリングモードを使用する SetScreenMemToVramFlag( FALSE ) ; // VSYNC同期をしない SetWaitVSyncFlag( FALSE ) ; // 画面モードを設定 #if R5G6B5 || R5G5B5X1 SetGraphMode( 640, 480, 16 ) ; #else SetGraphMode( 640, 480, 32 ) ; #endif #if R5G6B5 SetSoftRenderModeUserScreenImage( ScreenImage, DX_SOFTRENDER_SCREEN_FORMAT_R5G6B5 ) ; #endif #if R5G5B5X1 SetSoftRenderModeUserScreenImage( ScreenImage, DX_SOFTRENDER_SCREEN_FORMAT_R5G5B5X1 ) ; #endif #if X8B8G8R8 SetSoftRenderModeUserScreenImage( ScreenImage, DX_SOFTRENDER_SCREEN_FORMAT_X8B8G8R8 ) ; #endif #if X8R8G8B8 SetSoftRenderModeUserScreenImage( ScreenImage, DX_SOFTRENDER_SCREEN_FORMAT_X8R8G8B8 ) ; #endif // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) { // エラーが起きたら直ちに終了 return -1 ; } // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 大きさが変化する円の情報を初期化 CircleR = 0 ; CircleRAdd = 4 ; // メインループ while( ProcessMessage() == 0 ) { // 円の大きさを変更 CircleR += CircleRAdd ; if( CircleR >= 400 || CircleR <= 0 ) { CircleRAdd = -CircleRAdd ; } // ソフトウェア画像の中心に黄色い円を描画する( その周りは青色 ) { BYTE *p ; p = ScreenImage ; // 640x480 の全ピクセルの数だけループ for( int i = 0 ; i < 480 ; i ++ ) { for( int j = 0 ; j < 640 ; j ++ ) { // 円の大きさより外側かどうかを判定 int xp = 320 - j ; int yp = 240 - i ; #if R5G6B5 || R5G5B5X1 #if R5G5B5X1 WORD blue = 0x3e ; WORD yellow = 0xffc0 ; #else WORD blue = 0x1f ; WORD yellow = 0xffe0 ; #endif if( xp * xp + yp * yp < CircleR * CircleR ) { // 円の外側だったらピクセルの色を青色にする *( ( WORD * )p ) = blue ; } else { // 円の内側だったらピクセルの色を黄色にする *( ( WORD * )p ) = yellow ; } // メモリアドレスを 1ピクセル分( 2バイト )進める p += 2 ; #else #if X8R8G8B8 BYTE blue[ 4 ] = { 255, 0, 0, 255 } ; BYTE yellow[ 4 ] = { 0, 255, 255, 255 } ; #else BYTE blue[ 4 ] = { 0, 0, 255, 255 } ; BYTE yellow[ 4 ] = { 255, 255, 0, 255 } ; #endif if( xp * xp + yp * yp < CircleR * CircleR ) { // 円の外側だったらピクセルの色を青色にする // ( 色のメモリ上の順番は B・G・R・X ) p[ 0 ] = blue[ 0 ] ; p[ 1 ] = blue[ 1 ] ; p[ 2 ] = blue[ 2 ] ; p[ 3 ] = blue[ 3 ] ; } else { // 円の内側だったらピクセルの色を黄色にする p[ 0 ] = yellow[ 0 ] ; p[ 1 ] = yellow[ 1 ] ; p[ 2 ] = yellow[ 2 ] ; p[ 3 ] = yellow[ 3 ] ; } // メモリアドレスを 1ピクセル分( 4バイト )進める p += 4 ; #endif } } } // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.20 )
名前:ギウ 日時:2019/05/21 08:42

>管理人様 すみません、サンプル動作しました! あと、こちらのプログラムも動作しました。 原因は、何か所か修正する必要があったところの1か所を間違えていて、16bitの領域に32bit転送してしまうところがあった為です; お手数おかけしました。。 速度ですが、 Android:32bit:7900 us ということで1msくらい速くなった感じです。 そんなに変わってないですが、Flip関数内の処理が速くなってるはず、ということですよね。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.21 )
名前:ギウ 日時:2019/05/21 08:56

すみません、転送処理を調整したらだいぶ速くなりました。 Android:32bit:4800 us ↓な感じで転送してます。 ========================== // 16bit→32bit転送 int size = DISP_X * DISP_Y; DWORD *p32 = vram_map32; WORD *p16 = vram_map16; for (int i = 0; i < size; i++, p16++, p32++) { #ifdef _WINDOWS DWORD r = (DWORD)(*p16 & 0x7C00) << 9; DWORD g = (DWORD)(*p16 & 0x03E0) << 6; DWORD b = (DWORD)(*p16 & 0x001F) << 3; #else DWORD r = (DWORD)(*p16 & 0xF800) << 8; DWORD g = (DWORD)(*p16 & 0x07C0) << 5; DWORD b = (DWORD)(*p16 & 0x003E) << 2; #endif *p32 = r | g | b; } ========================== もう少し演算を簡略化できるようなできないような? 今は、WindowsとAndroidでフォーマットが分かれてますが、最終的にRGB555で統一します。 ということで、新関数ありがたく使わせて頂きます! 感謝です。いつもありがとうございます。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.22 )
名前:ギウ 日時:2019/05/21 08:57

>ガムテープ人形さん 横入りしてすみません。 ガムテープ人形さんの方も問題解決していると良いのですが・・・
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.23 )
名前:ギウ(出先から) 日時:2019/05/21 11:22

高速化の件、帰ったら64bit変数で試してみます。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.24 )
名前:ギウ 日時:2019/05/21 21:32

64bit転送、速度でませんでした。 アセンブラできちんとやれば良いのかもですけど。
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.25 )
名前:管理人 日時:2019/05/22 01:20

正常に動作したようで何よりです! (^ ^ というか、すみません、No.16のお書き込みを見落としていました > 因みに、Androidの方も、X8R8G8B8が一番早そうでしょうか。 Android の方は全部ネイティブで対応しているようですので、単純にメモリ転送容量の少ない 16bitのフォーマットが 32bitフォーマットより高速です( R5G6B5 と R5G5B5X1 の違いは無いようです ) > でも、仮にR5G6B5が多少速かったとしても、 > 他の機種のことや今後のことを考えると、X8R8G8B8で統一するのが良いかもですね。 > プログラム的にも、RGB555のみで作って、最後にX8R8G8B8にするという処理で統一できますし。 個人的にはここに機種依存は無いのではないかと思います 特殊な圧縮形式や、float型テクスチャフォーマット等は対応しているチップと対応していないチップがあり、 ソフトウェアが対応しているかどうかを確認する必要があるのですが、R5G6B5・R5G5B5X1 のテクスチャ フォーマットは確認する必要のない『必ず使える機能』の方に分類されていますので… > 64bit転送、速度でませんでした。 > アセンブラできちんとやれば良いのかもですけど。 ARM64 でコンパイルしても、でしょうか? ( ちょっと調べた限りでは 32bit アプリでは 64bit レジスタが使用できないようでしたので… )
メンテ
Re: w×h×3ch(RGB)の配列を描画したい ( No.26 )
名前:ギウ 日時:2019/05/22 07:32

>管理人様 情報ありがとうございます! 16bitのまま転送するのが一番速いとなると、変換処理はいらないですね。 踏まえつつ、いろいろ試してみます! ありがとうございました。
メンテ

Page: 1 | 2 |

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

   クッキー保存