游戏开发论坛

 找回密码
 立即注册
搜索
查看: 16364|回复: 10

怎么关闭垂直同步

[复制链接]

23

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
发表于 2008-5-26 11:30:00 | 显示全部楼层 |阅读模式
想问一下怎么用程序关闭垂直同步
而不是让用户手动设置显示模式
DirectX中有吗?如果没有怎么实现?
希望能得到大家的解答,谢谢!~

23

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
 楼主| 发表于 2008-5-26 11:42:00 | 显示全部楼层

Re:怎么关闭垂直同步

补充几个关于VB.NET 2003的问题(当前对我来说很重要的问题):
1:
Dim a() as int16=new int16(3){}
a(0)=1:a(1)=2:a(2)=3:a(3)=4
Redim Preserve a(2)
问题:
Preserve是怎么为数组重新划分大小的?a(0)~a(2)的内存地址还是原来的地址么?a(3)是否被自动回收了呢?

2:
ArrayList划分内存使用的是固定大小还是和其中的Item有关?

帮忙帮到底,如果这两个问题对你来说不算什么,请不吝赐教!谢谢

26

主题

537

帖子

537

积分

高级会员

Rank: 4

积分
537
发表于 2008-5-26 12:00:00 | 显示全部楼层

Re:怎么关闭垂直同步

a(0)~a(2)的内存地址还是原来的地址,a(3)被自动回收
ArrayList划分内存当然和其中的Item有关,在调用add方法时根据对象内容分配

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2008-5-26 14:01:00 | 显示全部楼层

Re:怎么关闭垂直同步

乱讲,Redim 实际上是重新分配了一个新的数组,然后把原来数组的a(0)-a(2)复制给新的数组,所以a(0)-a(2)当然也是新的地址,而原来数组自然也将会被回收

61

主题

1429

帖子

1430

积分

金牌会员

Rank: 6Rank: 6

积分
1430
发表于 2008-5-26 15:35:00 | 显示全部楼层

Re:怎么关闭垂直同步

#pragma comment(lib,"opengl32.lib")
#include <windows.h>
#include <gl/gl.h>

void main()
{
  typedef void (APIENTRY *WGLSWAPINTERVALEXT)(int);
  WGLSWAPINTERVALEXT wglSwapIntervalEXT=(WGLSWAPINTERVALEXT)wglGetProcAddress("wglSwapIntervalEXT");
  //  这个地方初始化OpenGL或Direct3D
  if(wglSwapIntervalEXT)  //注意并不是所有显卡都支持
    wglSwapIntervalEXT(1); // 启动vsync
}

26

主题

537

帖子

537

积分

高级会员

Rank: 4

积分
537
发表于 2008-5-26 16:43:00 | 显示全部楼层

Re: Re:怎么关闭垂直同步

psic: Re:怎么关闭垂直同步

乱讲,Redim 实际上是重新分配了一个新的数组,然后把原来数组的a(0)-a(2)复制给新的数组,所以a(0)-a(2)当然也是新的地址,而原来数组自然也将会被回收


没乱讲,你用GCHandle锁定数据,然后在重分配前后通过AddrOfPinnedObject方法查看一下数据的地址就会发现根本没有改变。
你说的那些用在字符串上倒是很合适。

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2008-5-26 19:57:00 | 显示全部楼层

Re: Re: Re:怎么关闭垂直同步

系统崩溃: Re: Re:怎么关闭垂直同步



没乱讲,你用GCHandle锁定数据,然后在重分配前后通过AddrOfPinnedObject方法查看一下数据的地址就会发现根本没有改变。
你说的那些用在字符串上倒是很合适。


就是在乱讲,你在重分配前后通过AddrOfPinnedObject来取得地址有何意义??GCHandle始终指向的都是同一个数组,也就是说重分配后GCHandle指向的实际上已经是旧的那个数组了,地址当然没有改变。重分配后要再次用GCHandle锁定才能得到新的数组的地址。

        Dim tArray(2000) As Byte
        Dim tP As IntPtr
        Dim tHandle As System.Runtime.InteropServices.GCHandle
        tHandle = System.Runtime.InteropServices.GCHandle.Alloc(tArray, System.Runtime.InteropServices.GCHandleType.Pinned)
        tP = tHandle.AddrOfPinnedObject
        tHandle.Free()
        ReDim tArray(2000)
        tHandle = System.Runtime.InteropServices.GCHandle.Alloc(tArray, System.Runtime.InteropServices.GCHandleType.Pinned)
        tP = tHandle.AddrOfPinnedObject
        tHandle.Free()

26

主题

537

帖子

537

积分

高级会员

Rank: 4

积分
537
发表于 2008-5-27 09:20:00 | 显示全部楼层

Re: Re: Re: Re:怎么关闭垂直同步

psic: Re: Re: Re:怎么关闭垂直同步



就是在乱讲,你在重分配前后通过AddrOfPinnedObject来取得地址有何意义??GCHandle始终指向的都是同一...


看来你是对的。我原以为Redim Preserve与Redim不一样,曾做过一个指针类自己用,现在看看一直没出错是因为我的Redim Preserve都是把原数组往小了截。

23

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
 楼主| 发表于 2008-5-27 13:04:00 | 显示全部楼层

Re:怎么关闭垂直同步

谢谢,你们的回答.
我知道数组是这样重新分配的:
Dim a() As int16=new int16(3){}
Redim Preserve a(2) 相当于:
Dim TempArray() As int16=new int16(2){}
For i as int16 =0 to 2
TempArray(i)=a(i)
Next i
a=nothing
GC.Collect
a=TempArray
TempArray=nothing
GC.Collect
----------------------怎么觉得这样做毫无意义?----
那有没有办法让它是截取而不是重分配呢?如果数组中的内容很大这样的重分配不是很慢?
还有我对VB.NET的垃圾回收真的有点质疑,真的那么有效么?

23

主题

142

帖子

142

积分

注册会员

Rank: 2

积分
142
 楼主| 发表于 2008-5-27 13:05:00 | 显示全部楼层

Re: Re:怎么关闭垂直同步

使命召唤: Re:怎么关闭垂直同步

#pragma comment(lib,"opengl32.lib")
#include <windows.h>
#include <gl/gl.h>
...


谢谢回答,有没有适合VB的方法呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 09:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表