OpenGL 2.1 ile win32 konuları kullanıyorum. Gerçekleştirmeye çalıştığım şey, arka plan bütün 3D sahnesinin yüklenirken, basit bir şekilde "yükleme" deyip gösterilmesini sağlamaktır. Şimdi çalışıyor, ama bazen bir sorunum var, bazen benim cubemap dokumun bir kısmı Mozilla Firefox Tarayıcısından veri alıyor (Bu nasıl oluyor cehennemde oluyor ???) ve bu küçük kutuyu dokuyla görmezden geliyor, sadece bir sprite ve o .: OpenGL kaynak ikinci bağlantıda yükleniyor
Bu benim programı yüklemeye çalıştığınızda 1 kez 3 gibi olur olması gereken yerde öyle. Bu benim iplik görünür:
WindowsThread::WindowsThread(HGLRC graphicsContext, HDC deviceContext) :
graphicsContext_(graphicsContext),
deviceContext_(deviceContext),
running_(false),
task_(0),
mode_(WT_NORMAL)
{
handle_ = CreateThread(0, 0,
(unsigned long (__stdcall *)(void *)) this->staticRun,
(void*) this, CREATE_SUSPENDED, &id_);
if (handle_ == 0) {
LOGE("Unable to create thread.");
return;
}
if (!SetThreadPriority(handle_, THREAD_PRIORITY_NORMAL)) {
LOGE("Unable to set thread priority for thread.");
return;
}
}
WindowsThread::~WindowsThread() {
finishTask();
running_ = false;
WaitForSingleObject(handle_, INFINITE);
CloseHandle(handle_);
wglDeleteContext(graphicsContext_);
}
void WindowsThread::start() {
running_ = true;
if (!ResumeThread(handle_)) {
LOGW("Unable to resume thread.");
}
}
bool WindowsThread::isRunning() {
return running_;
}
void WindowsThread::setTask(Task* task, Mode mode) {
finishTask();
task_ = task;
mode_ = mode;
}
bool WindowsThread::hasTask() {
return task_ != 0;
}
void WindowsThread::finishTask() {
while (task_ != 0) {
Sleep(1);
}
}
void WindowsThread::stop() {
running_ = false;
}
int WindowsThread::staticRun(void* thread) {
return ((WindowsThread*) thread)->run();
}
int WindowsThread::run() {
wglMakeCurrent(deviceContext_, graphicsContext_);
while (running_) {
if (task_ != 0) {
task_->run();
task_ = 0;
}
Sleep(10);
}
wglMakeCurrent(0, 0);
return 1;
}
ThreadManager: Sorun nerede olabilir
WindowsThreadManager::WindowsThreadManager(
System* system, UINT threadPoolSize)
{
if (threadPoolSize == 0) {
SYSTEM_INFO info;
GetSystemInfo(&info);
threadPoolSize = info.dwNumberOfProcessors;
if (threadPoolSize == 0) {
threadPoolSize = 1;
}
}
LOGI("Number of threads used: %d", threadPoolSize);
masterContext_ = wglGetCurrentContext();
HDC hdc = wglGetCurrentDC();
for (UINT i = 0; i < threadPoolSize; i++) {
HGLRC threadContext = wglCreateContext(hdc);
wglShareLists(masterContext_, threadContext);
WindowsThread* thread = new WindowsThread(threadContext, hdc);
thread->start();
threads_.push_back(thread);
}
}
WindowsThreadManager::~WindowsThreadManager() {
for (UINT i = 0; i < threads_.size(); i++) {
delete threads_[i];
}
for (UINT i = 0; i < tasks_.size(); i++) {
delete tasks_[i];
}
}
void WindowsThreadManager::execute(Task* task, Mode mode) {
WindowsThread::Mode wtMode = WindowsThread::WT_NORMAL;
if (mode == TM_GRAPHICS_CONTEXT) {
wtMode = WindowsThread::WT_GRPAHICS_CONTEXT;
}
tasks_.push_back(task);
for (UINT i = 0; i < threads_.size(); i++) {
if (!threads_[i]->hasTask()) {
threads_[i]->setTask(task, wtMode);
return;
}
}
threads_[0]->setTask(task, wtMode);
}
void WindowsThreadManager::joinAll() {
for (UINT i = 0; i < threads_.size(); i++) {
if (threads_[i]->hasTask()) {
threads_[i]->finishTask();
}
}
}
Ben Winodws 8. Herhangi Fikirler son sürücülü Nvidia 670GTX kullanılır?
[EDIT] Yükleyici dizimin sonunda glFinish() ekledim ve şimdi her şey normal olarak yükleniyor. Bir yer kırmızı, OpenGL hemen tüm çalışmalarını tamamlamıyor, bu yüzden sanırım işin bitmesi için bağlamın NULL olarak ayarlandığı durum buydu.
opengl ve threadların genellikle –
boyunca gitmediğine dikkat edin Evet, bu konuda oldukça fazla kırmızıyım. Aslına bakılırsa, önce bir tanesine, kaynak yüklediğime ve kaynak yüklendikten sonra iki bağlamı uygulamaya koymuştum. Bu bağlamı aldım ve temel bağlamı silerken ana çerçeveyi oluşturdum. Bu hiç sorun olmadan çalıştı. – SMart
@ BЈовић: OpenGL ve çoklu iş parçacığı yapılabilir, doğru olması basit değildir. – datenwolf