2011-05-16 18 views
5

SlimDX kullanarak C# içinde bir Direct3D 9 tabanlı oluşturma motoru yazdım. Yeni bir projede, şimdi bir webservice kullanarak yüklü bir 3d sahnenin resimlerini dağıtmam gerekiyor. Sorun şu ki, bir şey yapmak için bir Direct3d cihazına ihtiyacım var. Bir kullanıcı sistemde oturum açmadan ve masaüstünde kilitlenmeden direct3d aygıtı oluşturmanın herhangi bir yolu var mı?Kilitli sistemde 3D sahneyi oluşturma

Bu mümkün değilse, herhangi bir geçici çözüm bilen var mı? Sonunda, belirli yerel kullanıcı hesaplarını veya bir servisi kullanarak görev planlayıcısından çalıştırılabilen bir yürütülebilir dosyaya ihtiyacım var.

Motor iki bölüme ayrılmıştır: motorun kendisi ve oluşturucu. Öyleyse başka bir yol olmazsa opengl ya da görünür bir forma sahip olmadan render edilmesine izin veren başka bir teknolojiyi kullanarak yeni bir renderer de uygulayabilirim.

Düzenleme:

Ne var bugüne kadar şudur:

protected override void OnContinue() { 
     base.OnContinue(); 

     NativeFunctions.SafeWindowStationHandle hwinsta = NativeFunctions.WindowStation.OpenWindowStation(
      "WinSta0", 
      true, 
      NativeFunctions.AccessMask.WINSTA_ALL_ACCESS); 

     if(hwinsta == null || hwinsta.IsClosed || hwinsta.IsInvalid) 
      Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error()); 

     if(NativeFunctions.WindowStation.SetProcessWindowStation(hwinsta.DangerousGetHandle())) { 
      NativeFunctions.SafeDesktopHandle ptrDesktop = NativeFunctions.WindowStation.OpenInputDesktop(
       0, 
       true, 
       NativeFunctions.AccessMask.DESKTOP_CREATEWINDOW); 

      if(ptrDesktop.IsClosed || ptrDesktop.IsInvalid) 
       return; 

      if(!NativeFunctions.WindowStation.SetThreadDesktop(ptrDesktop.DangerousGetHandle())) 
       return; 

      Log log = Logger.Instance.CreateLog("DXService", true, true, false); 

      log.LogMessage("Desktop set, creating D3D-Object.", LOGMESSAGELEVEL.CRITICAL, true); 

      Direct3D direct3D = new Direct3D(); 
      log.LogMessage("Direct3D object created, creating device.", LOGMESSAGELEVEL.CRITICAL, true); 

      if(direct3D.AdapterCount == 0) { 
       log.LogMessage("FATAL: direct3D.AdapterCount == 0"); 
      } 
     } 
    } 

Bu minimal Windowsservice parçasıdır. Önemli kodu OnContinue işlevine koydum çünkü başlatma kodundan daha kolay hata ayıklamak daha kolay. Bu hizmetleri aktif masaüstüyle etkileşim kurma hakkı verdim. hizmeti yerel bir sistem hesabı olarak çalıştırdığımda masaüstünü ve penceresini çalıştırarak çalışır ancak GraphicsAdapters sayısı hala 0'tır, hizmeti özel bir kullanıcı hesabı kullanarak çalıştırdığımda WindowStation'ı bile açamıyorum. Denediğim başka bir şey var mı, yoksa yanlış mı yapıyorum? Hata ayıklama çok zor hale geldiğinden bu yana bir Windows 7 makinesinde test ediyorum. Bu bir sorun olabilir mi?

Teşekkür

OpenGL kilitli bile olsa masaüstünde GPU hızlandırma almak için işe yarayabilecek bir pBuffer bağlamını kullanılması durumunda

cevap

0

XP günlerinde, Direct3D donanım oluşturmayı başarılı bir şekilde bir makinedeki bir hizmetten alıp konsola giriş yapmayan bir projede çalıştım. Tamamen (dahice) detayları unutuyorum, ancak bir şekilde kullanılabilir HWND'yi elde etmek için "Window Station and Desktop Functions" API'un bir miktar kullanımını gerektiriyordu. Yine de, yeni/sunucu işletim sistemi, tüm yeni güvenlik özellikleriyle birlikte tamamen farklıdır.

Eğer OpenGL denemeye değer olsa da, bu alanda Direct3D'den daha iyi çalıştıysa şaşırırdım. Dikkate alabileceğiniz diğer şeyler:

  • NVidia, GPGPU/CUDA işlerini başsız sunucularla geliştiriyor gibi görünüyor. Sadece işe yarıyor. Yine de, grafik olmayan bir API üzerindeki öğelerinizi tamamen yeniden oluşturmak anlamına gelir.
  • Microsoft'un RemoteFX (Server2008R2 ve Win7), VM'lerin sunucu GPU'larına erişim kazanmasını kolaylaştırıyor gibi görünüyor. (Perversely, en kolay seçeneğiniz sadece rendererinizi bir VM'de çalıştırmak olabilir.)
+0

Pencere İstasyonları ile ilgili ipuçları için çok teşekkürler, bu işi yapmak için gerekli olan bazı eylemleri hatırlamaya çalışabilir misiniz? neredeyse ihtiyacım olan şey. Şimdiye kadar okuduklarımdan itibaren, etkileşimli masaüstüne (güvenlik deliği) erişme ayrıcalığımla uygulamanızı bir hizmet olarak çalıştırmam gerekiyor ve bir şekilde geçerli bir aygıt oluşturabilmem gerekiyor. Ama nasıl? ;) – Gooo

+0

Üzgünüm, çok uzun zaman önceydi ve o kodla gerçekten ilgilenmedim.Masaüstünü, giriş ekranını (EnumDesktopWindows ile) görüntülemek için kullanılan masaüstüne almak çok kolay olabilirdi veya daha karmaşık olabilirdi, gerçekten hatırlayamıyorum. – timday

0

; Ancak bu, sürücüye bağlıdır ve bu da PBuffer'ı kilitliyken kalıcı olarak zarar görecek şekilde ayarlayabilir, dolayısıyla YMMV. Bir şans verirdim.

İlgili konular