java - LibGDX 会在相机外绘制吗?
问题描述
如果我使用相机或视口不可见的 SpriteBatch 绘制纹理,它是否仍会渲染并使用我的 GPU?
有点像:
batch.draw(img, 9999999f, 9999999f, 1f, 1f)
还是我必须检查它是否超出框架而不是首先绘制它?
解决方案
它确实画了它。所以顶点着色器将针对纹理或纹理区域的四个顶点运行。由于顶点着色器将其投影到可见空间之外的某个地方,因此片段着色器将不会运行。
对于每个绘制的精灵,无论精灵是否可见,顶点着色器程序都会运行四次,并且对于屏幕上出现的精灵的每个像素,片段着色器程序大约运行一次。现代低端手机可以轻松处理数百个“浪费”的精灵被绘制到屏幕外。
由您决定是否值得计算它是否可见并跳过绘制它。如果您为每个单独的精灵执行此操作,那么 CPU 上的成本会很高,而 GPU 的节省相对较少。如果您考虑一下,根据其四个角中的任何一个是否可见检查单个精灵是在 CPU 上冗余地运行您自己的顶点着色器程序副本,以防您不必在 GPU 上重复该程序。而 GPU 对这种事情的优化程度要高得多。(如果你使用正交投影,CPU 的版本至少可以比 GPU 的版本简单,因为它变成了简单的 2D 比较。)
出于这个原因,如果您要先检查它们,您将一次检查它们的组。因此,您可以将您的游戏世界组织成多个部分并检查整个部分的外部边界,然后再决定绘制该部分的所有精灵或不绘制该部分的精灵。值得一提的是,每个部分都应该足够大,可以容纳至少几百个精灵。
推荐阅读
- ldap - WSO2am 与 ldap AD 集成时抛出“尝试连接到端点时出错。无法为 ssl://localhost:7712 借用客户端”
- wso2 - 如果请求正文中不存在属性,有没有办法为属性中介设置默认值?
- python - 如何以python方式将numpy.array传递给numpy.array中的对象方法
- react-native - 错误:无法解析模块“react-native-gesture-handler”
- php - 如何使用谷歌广告词 API 的 php 客户端库创建产品组(产品分区)?
- maatwebsite-excel - 如何修复 Laravel Excel 中不允许“MongoDB\Driver\Manager”的序列化
- jquery - Ajax GET 请求响应缺少数据字段
- java - 如何在 Java 中创建一个简单的连接表?
- powershell - 响应码不等于 200 时获取 HTTP 响应码
- c# - 调用 TcpListener.Start() 时抛出 SocketException