因为工作涉及到了这一个问题,在这一年里也做了很多的尝试,所以在此分享一下经验,以免后来人没有资料再过多的浪费时间。
1.刺激刷新稳定性需要使用OpenGL或者Direct3D从显卡角度进行编写操作,所有定时器、线程等相关的代码,都无法满足稳定性为±2ms的刺激刷新操作(极低的频率刷新也许可以,但是时间上的稳定性再后来我就再也没有验证过。
2.低于15Hz的刺激可以通过简单调用OpenGL的API进行操作。
以下附Java以及C++的代码,均实现了15Hz以下的稳定性,但是再往上想要更高的稳定性时均失败。
Java(该方法是做一个活动时和游戏公司出来的大佬那边偶然讨论到的):
import processing.core.*;
import processing.data.*;
import processing.event.*;
import processing.opengl.*;
import java.util.HashMap;
import java.util.ArrayList;
import java.io.File;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
public class sketch_220301a extends PApplet {
public void setup()
{
frameRate(30);
;
}
int i=0;
public void draw() {
background(162);
noStroke();
textSize(30);
text("frameRate:"+ frameRate,20,40);
rectMode(CENTER);
rect(width/2, 100, 200, 200);
rect(100, height/2, 200, 200);
rect(width-100, height/2, 200, 200);
rect(width/2, height-100, 200, 200);
if (i!=0)
{
fill(255, 255, 255);
i=0;
} else
{
fill(0, 0, 0);
i=1;
}
}
public void keyPressed()
{
switch(key) {
case '+':
frameRate(frameRate++);
break;
case '-':
frameRate(frameRate--);
break;
default:
break;
}
}
public void settings() { fullScreen(); }
static public void main(String[] passedArgs) {
String[] appletArgs = new String[] { "sketch_220301a" };
if (passedArgs != null) {
PApplet.main(concat(appletArgs, passedArgs));
} else {
PApplet.main(appletArgs);
}
}
}
其稳定性测试相关情况,在15Hz下是可以接受的,15Hz以上则掉帧严重:
C++代码(此代码是从github上downLoad后经过了一些修改,因此我直接放上了该github地址):
C++版本的刺激实现
3.完成30Hz的刺激,目前除了Matlab之外我成功了两种工具,一种是Python的PsychoPy,另一种是Unity3D.这两款是我已知的可以完成30Hz稳定性测试的项目,并且已经完全实现。
(等我有时间了一定把代码放上来,现在还要提炼打包就比较麻烦)。
关于30Hz的稳定性实现并且拓展性强还是要用C++调用OpenGL的显卡语言进行操作。关于这方面我一直没时间研究(本来的方向也并非计算机图形学)。
欢迎一些同样有这问题,或者已经解决了这问题的工程师和我踊跃探讨这方面的实现方法。



