我们最近创建了一个资产,在"新"(> 4.6)Unity UI中以表格布局显示数据.我们的一些用户询问绘制调用性能,我们想知道在UI中改进绘制调用的选项(如果有的话).
所以上面的表格在19次抽签中非常一致......
它可以在任何ipad2级别以上的版本上运行良好,但是Unity dev(可以理解)讨厌绘制调用,所以我们希望尽可能地减少这个数字.
您可以在上面的屏幕截图中看到我们为表格创建的层次结构.我们正在为Header/Footer/Body和ColumnOverlay使用蒙版.每个Unity,看起来每个Mask至少需要2次绘制:
http://forum.unity3d.com/threads/unity-4-6-ui-mask-component-takes-2-draw-calls.279840/
此外,我们显然使用一堆Unity UI Text和Sprite元素来绘制所有内容.表格布局的基本特性几乎意味着Sprite和Text对象之间存在多个层次(单元格背景之上的单元格数据等).Unity dev似乎说,当发生这种情况时,根本没有办法不进行多次绘制调用,因为引擎需要每个"层"...期间进行绘制.
http://forum.unity3d.com/threads/solved-new-ugui-and-too-many-draw-calls.266631/
所以...似乎只要你在Unity UI中有一个非平凡的UI布局,你几乎可以保证有一个非平凡(10-20)的绘制调用量.真的吗?如果不是,那么我们能做些什么来减少我们桌子上的抽奖吗?
通过停用每个数据行上的自定义"度量"元素,我能够将绘制调用减少一个.它基本上是一个黑客的"文本"对象,但我只是用它来测量网格大小的单元格,它正在进行额外的绘制调用.测量功能实际上可以正常工作,GameObject已停用.
发现了很大的进步.我在上面提到我的Header/Footer/Body和ColumnOverlay都使用了mask元素.事实证明,我能够重构我的系统,在新的根级元素上包含一个Mask,并删除Header,Footer和ColumnOverlay上的Masks.现在我只在该根元素和Body上有一个Mask.
因此,每一行都包含底部边框线图像,以抵消它的兄弟姐妹.我想也许它正在打印文本元素的"顶部"并强制额外绘制.结果没有......事实并非如此.
此外...我的所有背景图像元素都没有定义精灵属性.他们只是使用"null"并应用了颜色.我想也许如果我创建了一个通用的"白色"精灵并将其应用于我的所有null Image对象,它可能会改进批处理并减少我的绘制调用.结果没有......事实并非如此.
我正在手工创建一个Django查询集,并希望只使用Django ORM来读取生成的querset.query SQL本身,而无需访问我的数据库.
我知道Django quersets是懒惰的,我看到触发查询集的所有操作都被评估:
https://docs.djangoproject.com/en/1.10/ref/models/querysets/#when-querysets-are-evaluated
但是......如果我只是想验证我的代码是纯粹构建查询集内容但是不是在不经意间评估和命中我的数据库呢?在没有实际评估它的情况下,我可以用来验证它没有被评估的查询集对象上是否有任何属性?
从历史上看,Unity3D中的一个禁忌构造是使用c#foreach块,因为循环的每次迭代都会不经意地消耗几个字节的数据.
好奇,如果在现代版本中仍然如此?
我的谷歌搜索和(非常基本的)测试得出了非决定性的结果,我想在这里挖掘别人的知识,而不是自己深入低级别的基准测试.:-)
最近是否有人为了确定是否仍有必要避免在Unity3D中使用foreach来解决这个问题?
简短的问题...
必须使用 DROP TRIGGER 操作:https : //www.postgresql.org/docs/9.1/static/sql-droptrigger.html
或者只是从 pg_trigger 表中删除条目就足够了?
我正在尝试使用COPY命令通过Python将文件中的数据插入PGSQL。当目标表为空或我确保提前没有唯一的键冲突时,这将非常有效。
cmd = ("COPY %s (%s) FROM STDIN WITH (FORMAT CSV, NULL '_|NULL|_')" %
(tableName, colStr))
cursor.copy_expert(cmd, io)
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够在不先清空表的情况下执行此COPY命令。有什么方法可以使用SQL COPY执行“插入或更新”类型的操作吗?
以前我使用uuidgen来创建唯一的文件名,然后我需要通过bash脚本按日期/时间迭代.我已经发现简单地通过'ls -l'循环遍历所述文件是不够的,因为显然我只能信任操作系统以秒为单位保持时间戳分辨率(当通过特定文件系统和内核上的stat查看文件时,非秒数全为零)
所以我当时可能只是使用像date +%s%N我的文件名这样的东西.这将打印自1970年以来的秒数,然后是当前纳秒.
此时我可能过度设计了这个,但是这些是在高使用率的企业系统上生成的文件,所以我真的不想简单地相信纳秒时间戳(无可否认非常小)的机会在两个文件中生成相同的纳秒,我们发生碰撞.
我相信uuidgen脚本有逻辑来处理这种情况所以它仍然保证在这种情况下是唯一的(纠正我,如果我在那里错了...我读到我想的地方,但谷歌现在让我失败了) .
所以...我正在考虑类似的事情
FILENAME=`date +%s`-`uuidgen -t`
echo $FILENAME
Run Code Online (Sandbox Code Playgroud)
确保我创建一个唯一的文件名,然后可以使用简单的'ls'进行迭代,并且可以信任谁的名字是唯一的和按时间顺序的.
有这个方向的任何更好的想法或缺陷?
为什么C#:
byte[] vals = new byte[] {223, 30, 244, 156};
int result = 0;
for(int i = 0; i <= 3; ++i) {
result <<= 8;
result |= vals[i];
}
print("RESULT: " + result);
Run Code Online (Sandbox Code Playgroud)
产量:
RESULT: -551619428
Run Code Online (Sandbox Code Playgroud)
而Python:
vals = array.array('B', [223, 30, 244, 156])
result = 0
for val in vals:
result <<= 8
result |= val
print 'RESULT: %s' % result
Run Code Online (Sandbox Code Playgroud)
产量:
RESULT: 3743347868
Run Code Online (Sandbox Code Playgroud)
虽然...抛出数组值:
[37, 120, 244, 167]
Run Code Online (Sandbox Code Playgroud)
在两种语言中产生:
RESULT: 628683943
Run Code Online (Sandbox Code Playgroud)
编辑:我没有在原始问题中包含这个,但我的实际目标是让Python在这种情况下表现得像C#.根据下面的答案,我看到我需要在Python端强制int溢出.
这似乎有效:
import numpy
result = …Run Code Online (Sandbox Code Playgroud) 我已经找到了应该是一个基本问题...但是我的谷歌让我失望了,我需要进行健全性检查.
如果我在Python shell中运行以下代码:
>>> import sys
>>> sys.version
Run Code Online (Sandbox Code Playgroud)
从两个不同的Python环境中,我得到:
'2.7.8 (default, Nov 10 2014, 08:19:18) \n[GCC 4.9.2 20141101 (Red Hat 4.9.2-1)]'
Run Code Online (Sandbox Code Playgroud)
和...
'2.7.8 (default, Apr 15 2015, 09:26:43) \n[GCC 4.9.2 20150212 (Red Hat 4.9.2-6)]'
Run Code Online (Sandbox Code Playgroud)
这是否意味着这两个环境实际上运行的Python内核略有不同,或者是否足以使该版本字符串中的"2.7.8"位相同,因此我可以确信这些是1:1相同的Python解释器?
如果我保证它们是相同的,那么日期和该版本输出字符串的其他部分的意义是什么?