#前置き
png画像を読み込み、色データを変え、それからテクスチャに変換する一連の処理を
別スレッドで行いたい、と考えて、
OpenCvの導入や使い方も全然よくわからないために、いろいろ試してみてたら、
DxLibのBASEIMAGE型を使ったらうまくいきそうな感じなので、備忘録に
*C#向けDxLibではBASEIMAGE型(とそれを使う関数)が使用できない関係でC++限定です
*環境整備などはやってある前提で書いてますが、
何回もこのコードを実行をして確かめてみたところ、一度も不具合は起きていないため問題はないと
判断しています
#c++コード
重要なのはLoadAsyncTest関数の内部ですね
#include <iostream>
#include <DxLib.h>
#include <thread>
namespace {
auto texture = -1;
}
void LoadAsyncTest() {
//BASEIMAGE型を使う処理 ここから
BASEIMAGE base_image;
CreateBaseImageToFile(L"b8.png", &base_image);
if (base_image.ColorData.ColorBitDepth <= 8) {
//8ビット画像の色変え
//
//*
// パレットの数(BASEIMAGE.ColorData.Paletteの要素数)は、256で固定なので、
// ループ等でアクセスする際は、この範囲を超えないように気を付ける
//*
for (auto i = 0; i < 256; i++) {
SetPaletteBaseImage(&base_image, i, 255, 255, 255, 255);
}
}
else{
for (auto x = 0; x < base_image.Width; x++) {
for (auto y = 0; y < base_image.Height; y++) {
//8ビット以外の画像の色変え
SetPixelBaseImage(&base_image, x, y, 255, 255, 0, 255);
}
}
}
texture = CreateGraphFromBaseImage(&base_image);
ReleaseBaseImage(&base_image);
//BASEIMAGE型を使う処理 ここまで
}
int32_t main() {
SetMultiThreadFlag(TRUE);
ChangeWindowMode(TRUE);
if (DxLib_Init() != 0) return -1;
//非同期で画像読み込みと色変えとGraphに変換を実行
std::thread th(LoadAsyncTest);
while (ProcessMessage() == 0) {
if (texture != -1) DrawGraph(70, 40, texture, TRUE);
}
th.detach();
DxLib_End();
return 0;
}
#最後に
C#(.net core 3.1 や.net 5)で、C#用DxLibを使って画像読み込みなどをマルチスレッドで実行すると、
謎の不具合が高確率で起きて突然クラッシュしまくりな上に、こうなる原因が全く分からず、
DxLib使うなら、C++に移行しないといけないかなって感じになってる