小编Ben*_*XVI的帖子

LAMP:如何为用户动态创建.Zip大型文件,无需磁盘/ CPU抖动

通常,Web服务需要压缩几个大文件以供客户端下载.最明显的方法是创建一个临时zip文件,然后将echo其创建给用户或将其保存到磁盘并重定向(将来某个时间删除它).

但是,这样做有缺点:

  • 密集的CPU和磁盘颠簸的初始阶段,导致......
  • 准备好存档时,用户会有相当大的初始延迟
  • 每个请求的内存占用非常高
  • 使用大量临时磁盘空间
  • 如果用户取消下载中途,初始阶段(CPU,内存,磁盘)中使用的所有资源都将被浪费

ZipStream-PHP这样的解决方案通过将数据按文件铲入Apache文件来改进这一点.但是,结果仍然是高内存使用率(文件完全加载到内存中),以及磁盘和CPU使用率的大幅飙升.

相反,请考虑以下bash片段:

ls -1 | zip -@ - | cat > file.zip
  # Note -@ is not supported on MacOS
Run Code Online (Sandbox Code Playgroud)

这里,zip以流模式运行,导致内存占用量低.管道具有整数缓冲区 - 当缓冲区已满时,OS会暂停写入程序(管道左侧的程序).这样可确保zip其输出速度与输出速度一样快cat.

然后,最佳方式是执行相同的操作:cat使用Web服务器进程替换,将zip文件流式传输给用户,并将其动态创建.与仅流式传输文件相比,这将产生很少的开销,并且将具有无问题的,非尖峰的资源配置文件.

如何在LAMP堆栈上实现这一目标?

php bash lamp zip pipe

43
推荐指数
1
解决办法
3万
查看次数

OpenGL中的2D绘图:线性过滤,具有原始大小的像素精度

精简版:

OpenGL中是否有一种通用的方法,当以原生大小(包括边缘像素)绘制时,允许从图集中完美地2D绘制纹理,并在过滤到非原生大小时进行高质量缩放?

关于这个问题的更多细节:

假设您正在编写某种用于从纹理图集中绘制精灵的系统,以便用户可以指定精灵,以及绘制精灵的大小和位置.另外,他们可能只想绘制精灵的子矩形.

例如,这是一个64x64棋盘:

棋盘

......并且单独在其纹理图集中:

纹理图集中的棋盘格

注意:我们假设视口设置为将1:1映射到设备像素.

途径

为清晰起见进行编辑:请注意,下面的前两个方法没有给出所需的结果,并且专门用于概述不起作用的内容.

1.要以原生大小绘制精灵,只需使用GL_NEAREST即可

  • 设置OpenGL以使用GL_NEAREST min/mag过滤
  • 在位置(x,y)处绘制,将顶点从(x,y)放置到(x + 64,y + 64)
  • 使用纹理坐标(0,0) - >(64/atlas_size,64/atlas_size)

这适用于以原始大小绘制,但是当用户以64x64以外的大小绘制对象时,NEAREST过滤会产生较差的结果.它还会强制纹理像素与像素网格对齐,在非整数像素位置绘制对象时效果不佳:

用像素偏移量为0.25的gl_nearest绘制 用像素偏移量为0.5的gl_nearest绘制

2.启用GL_LINEAR

  • 使用线性滤波,我们需要将uv坐标移动到纹素的中心:(0.5/atlas_size,0.5/atlas_size)to (63.5/atlas_size,63.5/atlas_size).否则,对于最外面的像素,线性过滤将对图集中的精灵的邻居进行采样.
  • 然后我们还需要修改我们的顶点,因为继续使用从(0,0)到(64,64)的顶点会在两个方向上将纹理拉伸1px,如下所示:

用uv coords绘制的光线移动了0.5个纹素,导致拉伸

  • 因此,我们需要使用从(0.5,0.5)到(63.5,63.5)的顶点.通常,当纹理以其原始大小(a,b)的比例绘制时,我们需要将我们的顶点"向内"移动,我相信(a/2,b/2).给出以下结果(在紫色背景上):

用uv移动0.5个像素,顶点移动0.5个像素

请注意,除了与背景混合的边缘像素之外,我们得到像素精确的绘图,因为顶点边界落在像素之间的中间.

编辑:还要注意,此行为还取决于是否启用了抗锯齿功能.如果不是,前一种方法实际上确实提供像素完美渲染,但是当精灵从像素对齐移动到子像素位置时不提供良好的转换.在许多情况下,加抗锯齿是必须的.

3.在纹理图集中填充精灵

边缘像素问题的两个明显的解决方案涉及在纹理图集中用1px边框填充精灵的边缘.你可以:

  • 填充1层透明像素,并将顶点扩展(0.5a,0.5b)而不是缩小它们
  • 使用精灵最外面像素的第二个副本填充,然后返回从(0,0)到(64/atlas_size,64/atlas_size)的纹理采样

这基本上为我们提供了线性缩放的像素精确绘图.但是,如果我们允许用户只绘制精灵的子矩形,则这些方法中的任何一个都会失败,因为子矩阵显然没有所需的填充.

我错过了什么吗?这个问题有一般的解决方案吗?

opengl 2d

18
推荐指数
1
解决办法
3788
查看次数

double和stringstream格式

double val = 0.1;
std::stringstream ss;
ss << val;
std::string strVal= ss.str();
Run Code Online (Sandbox Code Playgroud)

在Visual Studio调试器中,val值为0.10000000000000001(因为无法表示0.1).当val使用stringstream转换时,strVal等于"0.1".但是,当使用boost :: lexical_cast时,结果strVal"0.10000000000000001".

另一个例子如下:

double val = 12.12305000012;

在visual studio下val显示为12.123050000119999,并使用stringstream和默认精度(6)它变为12.1231.我真的不明白为什么它不是12.12305(...).

是否存在默认精度,或者stringstream是否有特定的算法来转换无法准确表示的double值?

谢谢.

c++ double

11
推荐指数
3
解决办法
4万
查看次数

而不是独立地连接多个表,使用单独的查询?

我经常发现自己在桌子上进行了几次独立的连接.例如,假设我们有桌子collections,有独立的与两个一对N的关系photossongs,其中N是从零到很多.

现在,假设我们希望得到一个集合,这两个公司(独立)相关联的照片和歌曲.

我通常会使用这样的东西:

SELECT
    collections.collectionid as collectionid,
    photos.name as photo_name,
    songs.name  as song_name

FROM collections
    LEFT JOIN photos ON collections.collectionid = photos.collectionid
    LEFT JOIN songs  ON collections.collectionid = songs.collectionid

WHERE collections.collectionid = 14
Run Code Online (Sandbox Code Playgroud)

当然,将一个表左连接到另外两个表,如果第一个连接导致M行而第二个连接N成行,则给M * N出行.就数据库流量和性能而言,这似乎不是最理想的.

+--------------+------------+-----------+
| collectionid | photo_name | song_name |
+--------------+------------+-----------+
| 14           | 'x'        | 'a'       | \
| 14           | 'x'        | 'b'       |  - Each photo is …
Run Code Online (Sandbox Code Playgroud)

mysql sql join

5
推荐指数
1
解决办法
4257
查看次数

C函数始终向目标C返回零

我有一个Objective C项目,它包含一个带有一些辅助函数的C文件.尝试float从C文件返回s时,我有一个严重且非常恼人的问题.

C档案:

float returnFloat() {
    return 10.0;
}
Run Code Online (Sandbox Code Playgroud)

同时在Objective C实例方法中:

float x;
x = returnFloat();
Run Code Online (Sandbox Code Playgroud)

x始终为0.000000.我有什么想法我做错了吗?

编辑

好的,我已经意识到我在Objective C文件中有一堆"隐式声明"警告,与我在C文件中使用的函数有关.

使用返回ints的函数的赋值工作正常.在从返回a的函数进行赋值的情况下float,调试器会说"由编译器优化掉的变量".

是不是我可能没有使用"正确"的方法在Objective C项目中包含一个包含辅助函数的C文件?我(愚蠢地?)让Xcode自动链接它.即使如此,为什么这个问题只有在函数返回时才会出现float

c xcode objective-c

1
推荐指数
1
解决办法
1596
查看次数

在构造函数中声明*的属性在实例中可见.为什么?

在Javascript的原型继承系统中,对象的内部原型引用被设置为其构造函数的"prototype"属性,该属性本身就是一个对象.

可以解析构造函数的"prototype"属性的属性,就好像它们是对象实例的属性一样.但是,实例无法访问构造函数对象的实际属性:

function MyConstructor() { }
MyConstructor.x = 3
MyConstructor.prototype.y = 7

a = new MyConstructor()
a.x == 3    // FALSE
a.y == 7    // TRUE
Run Code Online (Sandbox Code Playgroud)

然而,如果属性(" x构造器")的函数体与声明this的关键字,这些特性当然的情况下解决的:

function MyConstructor() {
    this.x = 3
}
MyConstructor.prototype.y = 7

a = new MyConstructor()
a.x == 3    // TRUE
Run Code Online (Sandbox Code Playgroud)

为什么?有什么不同?

javascript oop inheritance prototype this

1
推荐指数
1
解决办法
131
查看次数

标签 统计

2d ×1

bash ×1

c ×1

c++ ×1

double ×1

inheritance ×1

javascript ×1

join ×1

lamp ×1

mysql ×1

objective-c ×1

oop ×1

opengl ×1

php ×1

pipe ×1

prototype ×1

sql ×1

this ×1

xcode ×1

zip ×1