app_opengl.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # 软件渲染选项
  2. from PySide2.QtGui import QGuiApplication, QOpenGLContext
  3. from PySide2.QtCore import Qt
  4. import os
  5. from umi_log import logger
  6. from . import pre_configs
  7. from ..platform import Platform
  8. _GLDict = {
  9. "AA_UseDesktopOpenGL": Qt.AA_UseDesktopOpenGL,
  10. "AA_UseOpenGLES": Qt.AA_UseOpenGLES,
  11. "AA_UseSoftwareOpenGL": Qt.AA_UseSoftwareOpenGL,
  12. }
  13. _Opt = ""
  14. def initOpengl():
  15. global _Opt
  16. opt = getOpengl()
  17. if opt not in _GLDict:
  18. opt = Platform.getOpenGLUse()
  19. setOpengl(opt)
  20. QGuiApplication.setAttribute(_GLDict[opt], True)
  21. _Opt = opt
  22. def checkOpengl():
  23. global _Opt
  24. if _Opt == "AA_UseOpenGLES": # GLES需要检查,有些win7不支持
  25. if not QOpenGLContext.openGLModuleType() == QOpenGLContext.LibGLES:
  26. QGuiApplication.setAttribute(Qt.AA_UseOpenGLES, False)
  27. _Opt = "AA_UseSoftwareOpenGL" # 既然不支持opengl,那就软渲染吧
  28. setOpengl(_Opt)
  29. msg = "当前系统不支持OpenGLES,已禁用此渲染器。\n若本次运行中程序崩溃或报错,请重新启动程序。\n\n"
  30. msg += "The current system does not support OpenGLES and has disabled the program from using this renderer. \nIf there are crashes or errors during this run, please restarting the program."
  31. logger.warning(msg)
  32. os.MessageBox(msg, type_="warning")
  33. def setOpengl(opt):
  34. if opt not in _GLDict:
  35. raise ValueError
  36. pre_configs.setValue("opengl", opt)
  37. def getOpengl():
  38. return pre_configs.getValue("opengl")
  39. # OpenGL渲染模式
  40. # 启用 OpenGL 上下文之间的资源共享
  41. # QGuiApplication.setAttribute(Qt.AA_ShareOpenGLContexts, True)
  42. # 渲染模式,【减少窗口调整大小时内容的抖动】
  43. # 方式一:启用OpenGL软件渲染。性能最差,CPU占用率大幅提升,效果最好。
  44. # QGuiApplication.setAttribute(Qt.AA_UseSoftwareOpenGL, True)
  45. # 方式二:使用 桌面 OpenGL(例如 opengl32.dll 或 libGL.so)。性能最好,效果较差。
  46. # QGuiApplication.setAttribute(Qt.AA_UseDesktopOpenGL, True)
  47. # 方式三:使用 OpenGL ES 2.0 或更高版本,用d3d接口抽象成Opengl。性能和效果都很好。但兼容性很差:
  48. # 1. ColorOverlay必须开启cache,否则无法渲染透明层。
  49. # 2. 需要系统安装dx9和OpenGL3。虚拟机中可能无法使用。需要检查兼容性!!!
  50. # 必须做兼容性判定,兼容时才启用AA_UseOpenGLES。
  51. # QGuiApplication.setAttribute(Qt.AA_UseOpenGLES, True)