问题标签 [displaylist]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - OpenGL DisplayList 较慢
我有一个奇怪的问题:
我必须输出一个 15x15 元素的游戏地板。
到目前为止,我在游戏循环中调用了我的函数“printFloor()”。
此函数遍历所有 225 个元素,并根据它们的值显示纹理文件的不同部分。因此 CPU 必须在每个循环周期中渲染相同的 225 个纹理。游戏循环每个周期需要大约 16-32ms,所以我现在把这个输出放在一个显示列表中:
函数 printFloorElement 计算位置,将图形模式更改为“switchGraphicMode(TEXTURES);”,绑定纹理并绘制纹理:
问题:一个游戏循环周期现在需要 60-80 毫秒,所以它相当慢。显示列表只生成一次,我已经检查过了。
“switchGraphicMode()”-函数:
有人知道原因吗?
opengl - 渲染数以千计的移动四边形
我必须渲染大量粒子。这些粒子是简单的无纹理四边形(实际上是正方形)。哦,它们一直在移动,因为它们是粒子。
我考虑了 2 个选项,但由于我不是 OpenGL 专家,我不知道什么是最好的。
使用 VBO 来渲染它们。
优点:比立即模式更快。
缺点:(我对 VBO 了解不多,但是)根据我收集的信息,四边形的坐标需要存储在 RAM 中的某个缓冲区中……所有这些坐标都需要由 CPU 计算。所以对于粒子 P1(x,y) 我必须计算 4 个其他坐标 (P2(x-1,y-1), P3(x-1,y+1), P4(x+1,y+1) , P5(x+1,y-1)) - 这对 CPU 来说是很多工作!使用显示列表:首先为单个方形四边形创建一个小显示列表。然后,渲染每个粒子做一些
pushMatrix, glTranslate, callList, popMatrix
.
优点:我不必手动计算 4 个坐标 - glTranlate 会这样做。
据说显示列表比 VBO 更快。
缺点:当它们只包含一个四边形时,它们是否比 VBO 更快?
请注意:我从 Java 调用 OpenGL 的东西,所以没有将 Java 数组转换为 GPU 数组的平滑方法(在传输之前,所有东西都必须存储在中间 FloatBuffers 中)。
actionscript-3 - 停止将 displayList 视图传播到八哥视图的 MouseEvent
我正在创建一个使用八哥层(游戏本身)和包含几个弹出窗口和类似东西的经典显示列表的游戏。
我有一件事困扰我:如果在 displayList-elements 上生成 MouseEvents,它们总是会通过八哥层并产生 TouchEvents 等,这很烦人。
我想知道有一些通用(且易于使用)的方法来处理它。
一种可能性是在所有 displayList-Elements 上监听以下事件:
但这对我来说看起来很讨厌。即使我这样做了,我还有一个问题:如果一个starling-element低于该display-list-element,并且如果它有一个TouchEvent.TOUCH用于翻转行为>>翻转外观将不会被删除如果您将鼠标悬停在显示列表元素上,则来自八哥。
我还考虑在每个显示列表元素后面放置一个虚拟八角星元素,......以停止事件......但是对于这样一个“简单”的任务来说,这一切听起来有点“过于复杂”。还是我错过了什么?
一个提示将不胜感激。谢谢。
opengl - 无法调用多个显示列表 glCallList()
当我创建一个显示列表时:
然后我在“显示”功能中调用该显示列表:
为什么它只显示一个板凳?(换句话说,只显示我的显示列表之一)
它应该是 2 个长凳,平移 Z 点位于 -5.0f 和 -7.0f
当我更改我的第一个呼叫列表 glTranslatef(0.0f,0.0f,-8.0f) 时,它不会改变输出中的任何内容。但是,当我将第二个调用列表更改为 glTranslatef(0.0f,0.0f,-8.0f) 长凳时,输出长凳确实将其位置转换为 -8.0f(比之前的 -5.0f 更远)
我得到的是,这段代码只显示了我的第二个显示列表(Z 点位于-5.0f)并忽略了我的第一个显示列表。
任何人都可以帮助我吗?我做错了什么?
opengl - OpenGL:复制显示列表的内容
对于特定的游戏改装项目,我被困在 OpenGL 1.1 上,并且我正在使用显示列表作为游戏部分的快照,在此我开始显示列表,指示这些部分进行渲染,然后关闭显示列表. 这会正确生成一个显示列表,然后我可以随意转换和渲染。
但是,当我转换和渲染该显示列表时,被快照的游戏部分不再存在,并且它破坏了它一直使用的任何显示列表,这意味着当我渲染我的快照时,那些显示列表的部分然后无法渲染。
我希望能够以某种方式指示 OpenGL 将嵌套显示列表的内容复制到顶级列表中,而不是仅仅将调用嵌入到嵌套显示列表中。我还没有找到任何可以做我想做的功能。一个存在吗?
(不,我正在快照的游戏部分是不可预测的,并且每次都可能大不相同。)
opengl - Display Lists and different reactions to mouse movement in JOGL
I recently started to work with an API in our Java application environment which uses JOGL (makes OpenGL commands accessible in Java) to create a 3D environment within our application (so I am pretty new to OpenGL).
This API uses display lists to group and speed up the commands to display a geometric component. So far, in the display method, first all the changes to the scene made by the mouse are applied (zoom, rotation, translation), then the current display list is called. The API provides a variety of scene elements (surfaces, light, transformations) which are put into a tree-like structure. This structure determines the order in which these scene elements will be "executed" later. This execution of the scene tree is than put into a display list. This works as intended.
What I want to add now is a small coordinate system as a representation of the component's current orientation. This would be a new scene element to be added to the scene tree. This coordinate system should obviously be influenced by rotations done with the mouse, but it should not be scaled or translated to other places.
My problem is: As the mouse movements are applied outside of the execution of the scene tree, I don't know how to apply only the rotation to only a certain scene element of the tree. I can't just revert the mouse movement in the corresponding part of the display list (in my understanding) because that would mean the display list would have to take the parameter of the mouse position's changes. But I can't work with parameters in display lists as their state is determined once and then only executed in this state (correct?). I can't just reset the projection matrix as I would lose the rotation state.
I hope my problem is understandable. Is there a way to do this with display lists or do I might have to replace the display lists in this API with an alternative? They don't seem to be recommended anyway.
performance - 显示列表与 VAO 性能
我最近在我的渲染引擎中实现了功能,使其能够根据运行时设置将模型编译为显示列表或 VAO,以便我可以将两者相互比较。
我通常更喜欢使用 VAO,因为我可以让多个 VAO 共享实际的顶点数据缓冲区(而且因为它们没有被弃用),但我发现它们实际上比我的 nVidia (GTX 560) 硬件上的显示列表更差. (无论如何,我想继续支持显示列表以支持较旧的硬件/驱动程序,因此保留处理它们的代码并没有真正的损失。)
差别不大,但肯定是可以衡量的。例如,在引擎状态的某个点上,我可以使用 VAO 持续测量我的绘图循环,以相当一致的平均值,大约 10.0 毫秒来完成一个循环,我可以切换到显示列表并观察循环时间减少在同样一致的平均值上约为 9.1 毫秒。这里的一致意味着一个周期的偏差通常小于±0.2 ms,远小于差异。
这些设置之间唯一改变的是普通网格的绘制代码。它从 OpenGL 调用看起来简单的 VAO 代码改变......
...到显示列表代码,如下所示:
当然,这两种代码路径也适用于各种模型的其他状态,但是以完全相同的方式发生,所以这些应该是唯一的区别。我已经明确确保不要在绘图调用之间不必要地解除绑定 VAO,因为结果也证明它的表现要差得多。
这种行为是可以预期的吗?我曾预计 VAO 的表现会更好,或者至少在显示列表方面表现相同,因为它们更现代且不会被弃用。另一方面,我一直在网上阅读到 nVidia 的实现对显示列表等进行了特别优化,所以我认为他们的 VAO 实现可能仍然落后。有没有其他人得到与我的匹配(或矛盾)的发现?
否则,我会做错什么吗?是否有任何已知情况使 VAO 在 nVidia 硬件或一般情况下的性能比应有的差?
作为参考,我在 Intel HD Graphics (Ironlake) 上也尝试了相同的差异,结果发现使用 VAO 的性能与直接从内存中直接渲染一样好,而显示列表比两者都差得多。我希望我有 AMD 硬件可以尝试,但我没有。
object - AS3 显示对象和精灵(根据随机数添加子对象)
动作脚本 3.0
本质上,我需要一个显示随机数量的蝴蝶对象的函数。(另外我应该做一个重置第一个函数的重置函数。)
我发现虽然蝴蝶甚至没有显示,但似乎即使我使用了 addChild(),孩子也没有被添加到舞台上。
任何帮助都非常感谢!
// 随机数
opengl - 显示列表与立即渲染
我正在尝试查找显示列表是否具有比立即渲染更好的 fps。从我发现在线显示列表更快,但是我在网上找到了一些代码,并且这种情况立即模式更快?谁能解释一下哪一个的fps更好,为什么?
java - 为什么我的 VBO 比显示列表慢?
我创建了两个简单的体素引擎,实际上只是包含立方体的块。对于第一个,我使用显示列表,并且可以以 60 FPS 的速度渲染数百个块,尽管它背后的技术已经有多年历史并且现在已经过时了。使用我的 VBO 版本,我尝试渲染 27 个块,但我突然下降到低于 50 FPS。是什么赋予了?我将着色器用于我的 VBO 版本,但不用于显示列表一。如果没有 VBO 版本的着色器,我仍然可以获得相同的 FPS 速率。我将发布一些相关代码:
伊博
初始化块:
然后渲染:
我知道我使用四边形,这很糟糕,但我也将四边形用于我的显示列表引擎。着色器非常简单,它们所做的只是获取颜色并将其应用于顶点,我什至不会发布它们,它们就是那么简单。
显示列表
初始化:
我应该注意,在我的显示列表版本中,我只添加了可见的立方体。所以,这可能是一个不公平的优势,但它不应该将 VBO 版本降低到只有 27 个块的 FPS,而显示列表版本是 500 个块。我这样渲染:
所以,在所有这些代码之后,我真的还是想知道为什么我的 VBO 版本这么慢?当我调用它们进行渲染时,我的显示列表版本中确实有一个一维的块列表,而我的 VBO 版本中有一个 3 维的块列表,但我认为 JVM 几乎消除了额外维度的任何滞后。那么,我做错了什么?